Bison:打印堆栈,错误名称

时间:2011-08-17 21:41:03

标签: c bison yacc

如何在yyerror函数中显示堆栈中的项目?我找到yy_stack_print但它只打印数字并需要2个参数,而我不知道如何获取。

1 个答案:

答案 0 :(得分:2)

不幸的是,没有公共API来打印当前的堆栈内容。如果您不害怕使用可能更改的内部,则可以通过yyss(最顶层)和yyssp(当前项)变量访问解析器状态堆栈,值堆栈由yyvs和yyvsp变量表示。这两个变量都是yyparse函数的变量,如果允许解析器按需扩展堆栈,那么将它们存储在解析器启动时可能就不够了。

您需要注意,这些变量不能保证存在于使用其他版本的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