首先,确保您拥有最新版本的 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
如果未定义该选项,那么您仍然可以symbol_name
使用 deprecated%token-table
指令获取定义,或者如果您安排#define YYDEBUG
插入到生成的代码中(-d
例如,请参见标志)。我不知道为什么返回类型会根据parse.error
.
如前所述,参数 tosymbol_name
是 bison 内部令牌编号,而不是扫描仪返回的令牌类型。parser
您可以使用成员类获取令牌类型的内部令牌编号,by_kind
表达式如下yy::parser::by_kind(yy::parser::token::«token-type-name»).type_get()
。