首页 > 解决方案 > 我可以让野牛使 yytname 在外部可见吗?

问题描述

处理我的语法时,Bison 在标签名称表中生成,例如

static const char *const yytname[] =
{
  "$end", "error", "$undefined", "TAG", "SCORE",
...
}

static关键字对代码的yytname其他部分不可见。

这通常是无害的,但我想格式化我自己的语法错误消息,而不是依赖于提供给我的yyerror函数的错误消息。

我的 makefile 包含以下规则:

chess1.tab.c: chess.tab.c
    sed '/^static const.*yytname/s/static//' $? > $@

This works, but it's not what I'd call elegant.

有没有更好的方法来获取标签名称表?

标签: parsingerror-handlingsyntax-errorbison

解决方案


您可以使用添加到解析器文件的函数导出表:

%token-table
%code provides {
  const char* const* get_yytname(void);
}
...
%%
...
%%
const char* const* get_yytname(void) { return yytname; }

您可能还想重新导出一些相关的常量。

或者,您可以编写一个接受令牌编号并返回令牌名称的函数。这可以更好地进行封装;字符串表的存在及其精确类型是实现细节。


推荐阅读