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