Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bison和flex计算器的问题_Bison_Flex Lexer - Fatal编程技术网

bison和flex计算器的问题

bison和flex计算器的问题,bison,flex-lexer,Bison,Flex Lexer,我在bison公司做多功能计算器。我发现,如果将以下表达式传递到程序中,将产生错误的答案 (1+2) * (2+1) 上面的表达式应该产生9。但是,它在以下设置中生成6 这是野牛代码: %token NUMBER %% statement_list: statement '\n' | statement_list statement '\n' ; statement: expression { printf("= %d\n", $1)

我在bison公司做多功能计算器。我发现,如果将以下表达式传递到程序中,将产生错误的答案

(1+2) * (2+1)
上面的表达式应该产生9。但是,它在以下设置中生成6

这是野牛代码:

%token NUMBER

%%


statement_list:  statement '\n'
        |        statement_list statement '\n'
        ;
statement:  expression   { printf("= %d\n", $1); };

expression: expression '+' term   { $$ = $1 + $3; }
    |       expression '-' term   { $$ = $1 - $3; }
    |       term                  { $$ = $1; }
    ;

term:       term '*' factor       { $$ = $1 * $3; }
    |       term '/' factor        
                  {  if ($3 == 0)
                        yyerror("Division by zero");
                     else $$ = $1 / $3; }
    |       factor                { $$ = $1; }
    ;

factor:     '(' expression ')'    { $$ = $2; }
    |       '-' factor            { $$ = -$2; }
    |       NUMBER                { $$ = $1; }
    ;
%%
这是flex代码

D     [0-9]
WS    [ \t\v\f]
%%

{D}+    { yylval = atof(yytext); return NUMBER; }

"+" { return yytext[0]; }
"-" { return yytext[0]; }
"*" { return yytext[0]; }
"/" { return yytext[0]; }

"(" { return yytext[0]; }
")" { return yytext[0]; }

"\n"    { return yytext[0]; }

{WS}    {}
.   {}
%%
谢谢,
Ali

不幸的是,我记不起bison/flex的语法,但我的直觉告诉我优先级没有正确地转换为C代码

如果是这样,那么$2是否意味着“对于此表达式的输出,在扩展的这一点上为第二个子表达式生成的代码中替换,而不知道C优先规则”


如果是这样,您的代码将生成类似“printf(…1+2*2+1)”的内容。你能查看生产和确认的来源吗?如果是这样,您可能应该在“(”表达式的展开部分中的$2周围添加一些括号,或者在“*”表达式中的参数$1和$3周围添加一些括号?

对于第一个问题,Unix编程环境可能会有所帮助,是的。$2表示第二个子表达式。对于第二个问题,我们正在尝试摆脱()递归地处理数据。它应该可以工作,但不能。问题解决了。我没有在flex代码中添加“(“and”)”。