C Bison:打印堆栈时名称出错
如何在yyerror函数中显示堆栈上的项目?我发现了C Bison:打印堆栈时名称出错,c,bison,yacc,C,Bison,Yacc,如何在yyerror函数中显示堆栈上的项目?我发现了yy_stack_print,但它只打印数字,需要两个参数,我不知道如何获取。不幸的是,没有公共API来打印当前堆栈内容。如果您不怕使用可能发生变化的内部构件,那么可以通过yyss(最顶层)和yyssp(当前项)变量访问解析器状态堆栈,值堆栈由yyvs和yyvsp变量表示。这两个变量都是yyparse函数的变量,如果允许解析器根据需要增加堆栈,那么在解析器开始时存储它们可能是不够的 您需要注意,这些变量不能保证存在于使用其他版本的bison生成
yy_stack_print
,但它只打印数字,需要两个参数,我不知道如何获取。不幸的是,没有公共API来打印当前堆栈内容。如果您不怕使用可能发生变化的内部构件,那么可以通过yyss(最顶层)和yyssp(当前项)变量访问解析器状态堆栈,值堆栈由yyvs和yyvsp变量表示。这两个变量都是yyparse函数的变量,如果允许解析器根据需要增加堆栈,那么在解析器开始时存储它们可能是不够的
您需要注意,这些变量不能保证存在于使用其他版本的bison生成的解析器中,而且它们可能会在将来的bison版本中更改其函数
如果您只想避免这些低质量的“语法错误”消息,您可以在文件顶部添加%error verbose
,这使得bison生成更加用户友好的错误消息
$ 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
$cat foo.y
%代币福
%令牌条
%代币
%错误详细
%{
无效错误(常量字符*m);
%}
%%
档案:富吧|富巴;;
%%
#包括
int-yylex()
{
返回FOO;
}
无效错误(常量字符*m)
{
fprintf(标准,“错误:%s\n”,m);
}
int main()
{
yyparse();
}
$bison foo.y&&gcc foo.tab.c&&a.out
错误:语法错误,意外的FOO,应为BAR或BAZ