2016-02-28 113 views
2

嗨我已經開始傾斜Bison語法分析器生成器。我嘗試了下面的程序。我使用MinGW on Window 7mintty客戶端編譯和運行程序。野牛版本2.4.2

%verbose 
%error-verbose 

%{ 

    #include <cstdio> 
    #include <unistd.h> 
    #include <stdlib.h> 
    #include <ctype.h> 

    int yylex(void); 
    int yyerror(const char *msg); 

%} 

%token INT 

%% 

rule : 
     INT { $$ = $1; printf("value : %d %d %d %d\n", $1, 
       @1.first_line, @1.first_column, @1.last_column); } 
     ; 

%% 

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

int yylex() 
{ 
    char ch = getchar(); 
    if(isdigit(ch)) 
    { 
     ungetc(ch, stdin); 
     scanf("%d", &yylval); 
     return INT; 
    } 
    return ch; 
} 

int yyerror(const char *msg) 
{ 
    printf("Error : %s\n", msg); 
} 

我編譯的程序與bison filename.y然後gcc filename.tab.c,當我嘗試運行程序和標準輸入輸入5,因爲它是從的yyerror函數打印我收到以下錯誤。任何人都可以幫助我找到我做錯了什麼。

Error : syntax error, unexpected $undefined, expecting $end 
+0

我建議使用flex作爲詞法分析器。野牛與flex的互補性非常好。 – Ctx

回答

4

當你的詞法分析器讀取您輸入的號碼後\n(新行)字符,它返回到您的解析器,它不承認它是什麼,這樣你就得到了unexpected $undefined(換行打印爲$undefined,因爲換行符永遠不會出現在您的語法中),當它期待$end(輸入指示符結束)。

yylex的最後一行更改爲return 0;(0代表輸入指示符的末尾)而不是return ch;,它應該可以工作。

相關問題