2015-06-14 91 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