2011-08-17 64 views

回答

2

不幸的是,沒有公共的API來打印當前的堆棧內容。如果您不害怕使用可能更改的內部函數,則可以通過yyss(最上面的)和yyssp(當前項目)變量訪問解析器狀態堆棧,值堆棧由yyvs和yyvsp變量表示。這兩個變量都是yyparse函數的變量,如果允許解析器根據需要增大堆棧,則將這些變量存儲在解析器啓動時可能不夠。

您需要注意的是,這些變量不保證存在於與其他版本的bison生成的解析器中,並且他們可能會在將來的野牛版本中更改它們的功能。

如果您只想避免這些低質量的「語法錯誤」消息,您可以在文件頂部添加%error-verbose,這使得野牛可以生成更多用戶友好的錯誤消息。

$ cat foo.y 
%token FOO 
%token BAR 
%token BAZ 

%error-verbose 

%{ 
void yyerror(const char* m); 
%} 

%% 

file: FOO BAR | FOO BAZ; 

%% 

#include <stdio.h> 

int yylex() 
{ 
    return FOO; 
} 

void yyerror(const char* m) 
{ 
    fprintf(stderr, "Error:%s\n", m); 
} 

int main() 
{ 
    yyparse(); 
} 

$ bison foo.y && gcc foo.tab.c && ./a.out 
Error:syntax error, unexpected FOO, expecting BAR or BAZ