Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Bison:打印堆栈时名称出错_C_Bison_Yacc - Fatal编程技术网

C Bison:打印堆栈时名称出错

C Bison:打印堆栈时名称出错,c,bison,yacc,C,Bison,Yacc,如何在yyerror函数中显示堆栈上的项目?我发现了yy_stack_print,但它只打印数字,需要两个参数,我不知道如何获取。不幸的是,没有公共API来打印当前堆栈内容。如果您不怕使用可能发生变化的内部构件,那么可以通过yyss(最顶层)和yyssp(当前项)变量访问解析器状态堆栈,值堆栈由yyvs和yyvsp变量表示。这两个变量都是yyparse函数的变量,如果允许解析器根据需要增加堆栈,那么在解析器开始时存储它们可能是不够的 您需要注意,这些变量不能保证存在于使用其他版本的bison生成

如何在yyerror函数中显示堆栈上的项目?我发现了
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