Bison C++ 获取令牌名称 - yytname_ 是私有的

Bison C++ get name of token - yytname_ is private

我试图在 C++ Bison 中获取令牌的名称: 例如。 %token <int> TPLUS "+" TMINUS "-" TMUL "*" TDIV "/"

但是在 Bison 的 C++ 变体中,%token-table 不执行任何操作。

我注意到在生成的 bison 代码中有一个标记映射: const char* const parser::yytname_[]; 但是它是私有的。

有没有人知道如何在 C++ Bison 中获取这些标记的名称?这甚至可以使用 C++ 变体吗?

我知道有人问过这个问题here,但没有公认的答案。

使用版本 3.4.3

确保您的 bison 是我的最新版本 (3.7.3)。令牌的名称可以通过以下方式得出:

std::cout << yy::parser::symbol_name(yy::parser::by_kind(yy::parser::token::TPLUS).type_get()) << std::endl;

其中 y::parser::token::TPLUS 是您的令牌。

首先,确保您拥有最新版本的 Bison(我相信最低版本是 v3.6,但 v3.7 版本有几个有用的错误修复)。

这将生成一个名为 symbol_name 的静态成员函数,具有以下原型之一。请注意,`token_symbol_kind 是一个 内部 令牌编号,而不是扫描器生成的值。 (见下文)

const char* yy::parser::symbol_name(token_symbol_kind)  (1)
std::string yy::parser::symbol_name(token_symbol_kind)  (2)

(1) if %define parse.error custom|detailed
(2) if %define parse.error verbose

如果未定义选项 parse.error,那么您仍然可以使用已弃用的 %token-table 指令获得 symbol_name 定义,或者如果您安排 #define YYDEBUG插入到生成的代码中(例如,参见 -d 标志)。我不知道为什么 return 类型会根据 parse.error.

的定义而有所不同

如前所述,symbol_name 的参数是 bison 内部令牌编号,而不是扫描器 return 编辑的令牌类型。您可以使用 parser 成员 class by_kind 以及 yy::parser::by_kind(yy::parser::token::«token-type-name»).type_get().

等表达式来获取令牌类型的内部令牌编号