为什么没有显示野牛的结果?

时间:2015-06-14 12:52:35

标签: c bison flex-lexer

我测试了团队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 { $$ = $1 + $3; }
    | EXPR '-' TERM { $$ = $1 - $3; }
    | TERM
;

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

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

但是如果添加getchar(),则在输入此附加字符后,将显示所有相同的计算结果。为什么不进行此更改(EVALUATE: EXPR{printf("=%d\n", $$); getchar();} ;),我看不到结果? 对不起我的英文。

1 个答案:

答案 0 :(得分:0)

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

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

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