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()
.
等表达式来获取令牌类型的内部令牌编号
我试图在 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()
.