flex-bison 计算器程序中的错误答案

Wrong answer in flex-bison calculator program

我正在使用 flex 和 bison 编写一个简单的计算器解析器程序。 弹性代码为:

calc.l
%{
#include "fb1-5.tab.h"
%}
%%
"+"      { return ADD; }
"-"      { return SUB; }
"*"      { return MUL; }
"/"      { return DIV; }
"|"      { return ABS; }
[0-9]+   { yylval = atoi(yytext); return NUMBER; }
\n       { return EOL; }
[ \t]    { /* do nothing */ }
.        { return *yytext; }
%%

野牛代码如下:

calc.y
%{
#include <stdio.h>
#include <stdlib.h>
%}

%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL

%%

calclist:
    | calclist exp EOL { printf("= %d\n", ); }
    ;

exp: factor
    | exp ADD factor { $$ =  + ; }
    | exp SUB factor { $$ =  - ; }
    ;

factor: term
    | factor MUL term { $$ =  * ; }
    | factor DIV term { $$ =  / ; }
    ;

term: NUMBER
    | ABS term { $$ =  >= 0 ?  : -; }
;
%%

main(int argc, char **argv)
{
    yyparse();
}

yyerror(char* s)
{
    fprintf(stderr, "Error: %s\n", s);
}

对于每个输入,答案总是 62.Even 无论我是否在数字之间留空格,答案总是相同的。即使答案应该完全不同。就像 1+2+3 和 100+200+300 一样,给出的答案总是 62。

calclist exp EOLcalclist 的减少中,您要打印exp 的值。这是右侧的 second 符号 (</code>),而不是第一个。 </p> <p>第一个符号 (<code>calclist) 从未被赋值,因此它是未定义的,可以是任何东西。 62 并非难以置信。一旦 calclist: %empty 规则被缩减,作为规则的语义值产生的任何垃圾都会通过默认的预操作传递给 calclist: calclist exp EOL 规则,将 $$ 初始化为 .因此,如果它以 62 开始,它将保持为 62。