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

Parsing flex bison计算器程序中的错误答案,parsing,bison,flex-lexer,Parsing,Bison,Flex Lexer,我正在使用flex和bison编写一个简单的计算器解析器程序。 flex代码如下所示: calc.l %{ #include "fb1-5.tab.h" %} %% "+" { return ADD; } "-" { return SUB; } "*" { return MUL; } "/" { return DIV; } "|" { return ABS; } [0-9]+ { yylval = atoi(yytext); return N

我正在使用flex和bison编写一个简单的计算器解析器程序。 flex代码如下所示:

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", $1); }
    ;

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

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

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

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

yyerror(char* s)
{
    fprintf(stderr, "Error: %s\n", s);
}
野牛代码如下所示:

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", $1); }
    ;

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

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

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

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

yyerror(char* s)
{
    fprintf(stderr, "Error: %s\n", s);
}
calc.y
%{
#包括
#包括
%}
%令牌号
%令牌添加子MUL DIV ABS
%代币下线
%%
calclist:
|calclist exp EOL{printf(=%d\n“,$1);}
;
经验:系数
|exp添加因子{$$=$1+$3;}
|exp子因子{$$=$1-$3;}
;
因素:期限
|因子多项{$$=$1*$3;}
|因子DIV项{$$=$1/$3;}
;
术语:数字
|ABS术语{$$=$2>=0?$2:-$2;}
;
%%
主(内部argc,字符**argv)
{
yyparse();
}
yyerror(字符*s)
{
fprintf(标准,“错误:%s\n”,s);
}

对于每个输入,答案总是62。即使我在数字之间留有空格,答案也总是一样的。即使答案应该完全不同。与1+2+3和100+200+300一样,给出的答案总是62。

在将
calclist exp EOL
减少到
calclist
时,您需要打印
exp
的值。这是右边的第二个符号(
$2
),而不是第一个


第一个符号(
calclist
)从未给定值,因此它未定义,可以是任何符号。62并非不可信。一旦
calclist:%empty
规则被减少,作为规则语义值的任何垃圾都会通过默认的预操作传递到
calclist:calclist exp EOL
规则,该操作将
$
初始化为
$1
。因此,如果一开始是62,它将继续是62。

非常感谢!!这帮了大忙!!在一本书中,它被定为1美元,而我只是在学习这个!!