2011-07-04 119 views
2

我正在从野牛的多功能计算器。我发现如果下面的表达式被传入程序,会产生错误的答案。问题与野牛和flex计算器

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

感谢, 阿里

+0

问题解决了,我错过了将“(”和“)”放在flex代码中 – Ali

回答

1

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

如果是这样,那么$ 2是否意味着“对于这个表达式的输出,在扩展中的这个点替代为第二个子表达式生成的代码中,而没有任何C优先规则的知识”?

如果是这样,你的代码产生类似“printf(... 1 + 2 * 2 + 1)”的东西。你能查看源代码并确认吗?如果是这样,你应该大概是添加一些括号轮$ 2中的“(”表达的扩大,或圆的参数$ 1和$ 3中的“*”体现在哪里?

+0

对于第一个问题,是的,$ 2表示第二个子表达式对于第二个问题,我们试图摆脱()并递归处理数据,它应该可以工作,但不会。 – Ali