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 是产生式右边的第二个东西。