为什么bison的结果不显示?

Why is the result of the bison is not displayed?

我测试了这个Flex和Bison组队的例子,但是控制台没有显示计算结果。 test.l:

%{
#include "parser.tab.h"
%}
%option yylineno
%option noyywrap
%%
[/][/].*\n      ; // comment
[0-9]+          { yylval = atoi(yytext);
                  return NUM;
                }
[ \t\r\n]      ; // whitespace
.              { return *yytext; }

%%

parser.y:

%{
#include <stdio.h>
void yyerror(char *s) {
  fprintf (stderr, "%s\n", s);
}
%}
%token NUM
%start EVALUATE
%%
EVALUATE: EXPR          {printf("=%d\n", $$);} ;

EXPR: EXPR '+' TERM { $$ =  + ; }
    | EXPR '-' TERM { $$ =  - ; }
    | TERM
;

TERM: TERM '*' NUM  { $$ =  * ; }
    | TERM '/' NUM  { $$ =  / ; }
    | NUM
;

%%
int main()
{
  return yyparse();
}

但是如果你加上了getchar(),那么在你输入这个额外的字符之后,所有的计算结果都是一样的。为什么不是这个 change(EVALUATE: EXPR{printf("=%d\n", $$); getchar();} ;) ,我看不到结果? 对不起我的英语。

您正在解析来自 stdin 的输入,这是一个 "stream"。在该流终止之前,解析器无法知道完整的解析树。例如,如果您输入表达式 1+1,完整的输入也可能是 1+111+1-11+11*4 - 不同的表达式会导致完全不同的解析树结果。

您可以通过执行以下操作之一创建正确终止的输入:

  • 输入后按 CTRL+D(在 Unix shell 上)
  • 管道输入:echo "1+1" | ./parser
  • 正在从包含输入 1+1:
    的文件 inputfile.txt 中读取输入 ./parser < inputfile.txt