Bison:打印名称错误的堆栈

发布于 2024-11-30 15:10:33 字数 78 浏览 1 评论 0原文

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

How can I display items on stack in yyerror function? I've found yy_stack_print but it only prints numbers and requires 2 arguments which I don't how how to obtain.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无人问我粥可暖 2024-12-07 15:10:33

不幸的是,没有公共 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

Unfortunately there is no public API to print the current stack contents. If you are not afraid to use possible-changing internals, you can access the parser state stack via the yyss(topmost) and yyssp(current item) variables, the value stack is represented by the yyvs and yyvsp variables. Both variables are variables of the yyparse function, and storing them at the parser start might not be sufficient if the parser is allowed to grow the stacks on demand.

You need to be aware that these variables are not guaranteed to exist in parsers which are generated with other versions of bison, and also that they might change their function in future bison versions.

If you only want to avoid these low quality "syntax error" messages, you can add %error-verbose at the top of the file, which makes bison to generate more user-friendly error messages.

$ 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文