Parsing flex bison计算器程序中的错误答案
我正在使用flex和bison编写一个简单的计算器解析器程序。 flex代码如下所示: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
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美元,而我只是在学习这个!!