2
如何在yyerror函數中顯示棧上的項目?我發現yy_stack_print
,但它只打印數字,需要2個參數,我不知道如何獲得。野牛:錯誤地打印堆棧名稱
如何在yyerror函數中顯示棧上的項目?我發現yy_stack_print
,但它只打印數字,需要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