北美野牛和弹性计算器的问题

时间:2011-07-04 17:04:07

标签: bison flex-lexer

我正在研究野牛的多功能计算器。我发现如果将以下表达式传递给程序,将产生错误的答案。

(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; }
    ;
%%

这是灵活代码

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}    {}
.   {}
%%

谢谢, 阿里

2 个答案:

答案 0 :(得分:1)

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

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

如果是这样,你的代码会生成类似“printf(... 1 + 2 * 2 + 1)”的内容。你能查看源产品并确认吗?如果是这样的话,你应该在'('表达式的扩展中添加一些括号围绕$ 2,或者在'*'表达式中围绕$ 1和$ 3的参数?

答案 1 :(得分:0)

Unix编程环境可能会有所帮助http://cm.bell-labs.com/cm/cs/upe/