gpt4 book ai didi

c - Bison :打印错误名称的堆栈

转载 作者:太空宇宙 更新时间:2023-11-03 23:34:45 25 4
gpt4 key购买 nike

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

最佳答案

不幸的是,没有公共(public) API 来打印当前堆栈内容。如果你不害怕使用可能改变的内部结构,你可以通过 yyss(topmost) 和 yyssp(current item) 变量访问解析器状态堆栈,值堆栈由 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

关于c - Bison :打印错误名称的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7099877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com