在bison语法中接受整数和浮点数

时间:2017-03-21 03:47:45

标签: grammar bison flex-lexer

此问题附于此帖https://stackoverflow.com/questions/42848197/bison-flex-cannot-print-out-result?noredirect=1#comment72805876_42848197

这次我尝试让我的计算器程序接受整数和浮点数。

谢谢。

这是我的代码

软硬度:

%{
    #include <stdio.h>
    #include "f1.tab.h"
%}

integer [1-9][0-9]*|0
float [0-9]+\.[0-9]+

%%

{integer}   { yylval.ival = atoi(yytext); return INT; }
{float}     { yylval.fval = atof(yytext); return FLOAT; }
.           { return yytext[0]; }

%%

野牛:

%{
    #include <stdio.h>
%}

%union {
    int ival;
    float fval;
}
%token <ival> INT
%token <fval> FLOAT


%type <fval> exp
%type <fval> fac
%type <fval> f

%%
input: line
    | input line
;

line: exp ';'  { printf("%d\n", $1); };

exp: fac             { $$ = $1;         }
  | exp '+' fac     { $$ = $1 + $3;    }
  | exp '-' fac     { $$ = $1 - $3; }
;
fac: f
    | fac '*' f     { $$ = $1 * $3; }
    | fac '/' f     { $$ = $1 / $3; }
;
f: INT | FLOAT;
%%
main(int argc, char **argv) {
    yyparse();
}
yyerror(char *s) {
    fprintf(stderr, "error: %s\n", s);
}

1 个答案:

答案 0 :(得分:0)

Bison告诉你究竟是什么问题:

parser.y:32.4-6: warning: type clash on default action: <fval> != <ival> [-Wother]
 f: INT | FLOAT;
    ^^^

规则f: INT的默认操作会将ivar复制到fvar而不进行任何转换(基本上是通过联合进行复制)。要解决此问题,您需要插入转换:

 f: INT { $$ = (double)$1; }