在处理我的语法时,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.

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

最佳答案

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

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

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

另外,您可以编写一个带有 token 号并返回 token 名的函数。这样可以更好地封装;字符串表的存在及其精确类型是实现细节。

关于parsing - 我可以让野牛使yytname在外部可见吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57558439/

10-12 03:25