Flex & Bison 简单 BNF 计算器常量输出为零
Flex & Bison Simple BNF calculator constant output of zero
我正在阅读 John Levine 的 O'Reilly Flex & Bison 一书,在尝试编译和 运行 的示例时遇到了以下问题一个简单的 BNF 计算器
> ./fb1-5
2 + 3 * 4
= 0
2 * 3 + 4
= 0
c
Mystery Character c
error: syntax error
该程序似乎可以识别非数字输入并相应地退出,但是任何带有 mult/div/add/sub 表达式的整数输入总是会导致常量输出为零。
我搜索过有关堆栈溢出的类似问题,并多次通读了 O'Reilly 中的这一章。我也在通过 http://dinosaur.compilertools.net/bison/bison_5.html 进行挖掘,试图找出我的错误。感谢您忽略了我面对一个看似基本的障碍时的困惑。我刚刚开始自己的编译器之旅。任何建议表示赞赏。
flex (fb1-5.L):
%{
#include "fb1-5.tab.h" /*forward declaration - not yet compiled*/
%}
%%
"+" {return ADD;}
"-" {return SUB;}
"*" {return MUL;}
"/" {return DIV;}
[0-9]+ { yylval = atoi(yytext); return NUMBER;}
\n { return EOL;}
[ \t] { } /*ignore whitespace*/
. { printf("Mystery Character %c\n", *yytext);}
%%
野牛 (fb1-5.y):
%{
#include <stdio.h>
%}
/*declare tokens*/
%token NUMBER
%token ADD
%token SUB
%token MUL
%token DIV
%token ABS
%token EOL
/*BNF tree*/
%%
calclist: /*nothing - matches at beginning of input*/
| calclist exp EOL { printf("= %d\n", );}
;
exp: factor /*default $$ = */
| exp ADD factor { $$ = + ;}
| exp SUB factor { $$ = - ;}
;
factor: term /*default $$=*/
| factor MUL term { $$ = * ;}
| factor DIV term { $$ = / ;}
;
term: NUMBER /*default $$=*/
| ABS term { $$ = >= 0 ? : - ;}
;
%%
int main(int argc, char **argv)
{
yyparse();
return 0;
}
yyerror(char *s)
{
fprintf(stderr, "error: %s\n", s);
}
生成文件:
fb1-5: fb1-5.l fb1-5.y
bison -d fb1-5.y
flex fb1-5.l
gcc -o $@ fb1-5.tab.c lex.yy.c -lfl
clean:
rm -f core fb1-5.tab.h fb1-5.tab.c lex.yy.c fb1-5
printf("= %d\n", );
应该是
printf("= %d\n", );
因为 exp
是产生式右边的第二个东西。
我正在阅读 John Levine 的 O'Reilly Flex & Bison 一书,在尝试编译和 运行 的示例时遇到了以下问题一个简单的 BNF 计算器
> ./fb1-5
2 + 3 * 4
= 0
2 * 3 + 4
= 0
c
Mystery Character c
error: syntax error
该程序似乎可以识别非数字输入并相应地退出,但是任何带有 mult/div/add/sub 表达式的整数输入总是会导致常量输出为零。
我搜索过有关堆栈溢出的类似问题,并多次通读了 O'Reilly 中的这一章。我也在通过 http://dinosaur.compilertools.net/bison/bison_5.html 进行挖掘,试图找出我的错误。感谢您忽略了我面对一个看似基本的障碍时的困惑。我刚刚开始自己的编译器之旅。任何建议表示赞赏。
flex (fb1-5.L):
%{
#include "fb1-5.tab.h" /*forward declaration - not yet compiled*/
%}
%%
"+" {return ADD;}
"-" {return SUB;}
"*" {return MUL;}
"/" {return DIV;}
[0-9]+ { yylval = atoi(yytext); return NUMBER;}
\n { return EOL;}
[ \t] { } /*ignore whitespace*/
. { printf("Mystery Character %c\n", *yytext);}
%%
野牛 (fb1-5.y):
%{
#include <stdio.h>
%}
/*declare tokens*/
%token NUMBER
%token ADD
%token SUB
%token MUL
%token DIV
%token ABS
%token EOL
/*BNF tree*/
%%
calclist: /*nothing - matches at beginning of input*/
| calclist exp EOL { printf("= %d\n", );}
;
exp: factor /*default $$ = */
| exp ADD factor { $$ = + ;}
| exp SUB factor { $$ = - ;}
;
factor: term /*default $$=*/
| factor MUL term { $$ = * ;}
| factor DIV term { $$ = / ;}
;
term: NUMBER /*default $$=*/
| ABS term { $$ = >= 0 ? : - ;}
;
%%
int main(int argc, char **argv)
{
yyparse();
return 0;
}
yyerror(char *s)
{
fprintf(stderr, "error: %s\n", s);
}
生成文件:
fb1-5: fb1-5.l fb1-5.y
bison -d fb1-5.y
flex fb1-5.l
gcc -o $@ fb1-5.tab.c lex.yy.c -lfl
clean:
rm -f core fb1-5.tab.h fb1-5.tab.c lex.yy.c fb1-5
printf("= %d\n", );
应该是
printf("= %d\n", );
因为 exp
是产生式右边的第二个东西。