2015-06-14 45 views
1

我测试了这个团队合作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();} ;),我看不到结果? 对不起,我的英文。

回答

0

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

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

  • 按CTRL + d输入打字(在Unix外壳)
  • 管道输入后:echo "1+1" | ./parser
  • 阅读从文件输入inputfile.txt包含输入1+1
    ./parser < inputfile.txt
+0

Ť为了答案,我意识到。 – Airoks