parsing - 我可以让 Bison 使yytname在外部可见吗?

标签 parsing error-handling syntax-error bison

在处理我的语法时,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 - 我可以让 Bison 使yytname在外部可见吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57558439/

相关文章:

c - 如何在没有正则表达式的情况下用逗号(可选)后跟空格来拆分字符串?

xml - 错误 : XML Content does not seem to be XML | R 3. 1.0

javascript - JavaScript中的分词器和匹配器

c# - 如何捕获 Action<T> 中的异常或包含 C# 中的匿名方法的异常?

ios - 在 Swift 2 中捕获 "IndexOutOfBoundsException"

javascript - 在 propTypes 中 react 错误

java - 如何使用 ANTLR v4 标记代码

PHP 设置 [pm.max_children、pm.start_servers、pm.min_spare_servers 和 pm.max_spare_servers]

debugging - Chrome : Uncaught SyntaxError: Unexpected end of input

c - 语法和解析错误