2016-02-28 106 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;,它应该可以工作。

相关问题