我正在研究野牛的多功能计算器。我发现如果将以下表达式传递给程序,将产生错误的答案。
(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} {}
. {}
%%
谢谢, 阿里
答案 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/