C++ 如何从Bison c+中的yy::parser::symbol_类型中获取yy::parser::token+;变体?

C++ 如何从Bison c+中的yy::parser::symbol_类型中获取yy::parser::token+;变体?,c++,bison,flex-lexer,bisonc++,C++,Bison,Flex Lexer,Bisonc++,例如,我在flex规则中通过以下方式返回yy::parser::symbol_type: [a-zA-Z][a-zA-Z0-9_]* return yy::parser::make_ID(yytext); 其中,ID是我在bison中定义的令牌,它将生成yy::parser::token结构 现在我只想对flex的token.l做一些单元测试,当我调用yy::parser::symbol_type yylex()函数时,我没有看到任何API从中获取yy::parser::token 顺便说一

例如,我在flex规则中通过以下方式返回
yy::parser::symbol_type

[a-zA-Z][a-zA-Z0-9_]*  return yy::parser::make_ID(yytext);
其中,
ID
是我在bison中定义的令牌,它将生成
yy::parser::token
结构

现在我只想对flex的
token.l
做一些单元测试,当我调用
yy::parser::symbol_type yylex()
函数时,我没有看到任何API从中获取
yy::parser::token

顺便说一下,在bison手册中,建议使用flex规则中的API通过
yy::parser::make_XXX
API返回
yy::parser::symbol_type


或者没有这样的API来完成这项工作?我需要使用
symbol\u type.kind()
API来获得类似于
yy::parser::symbol\u type\u kind::S\u T\u ID

没有类型为
yy::parser::token
的对象。
struct
的存在只是为了保存
enum token\u kind\u type
枚举(不是具有该值的成员;枚举本身)。看

<>我不太理解这个动机,但我想它来自于允许允许没有< <代码> >枚举类> <代码>的C++版本的古代版本。
无论如何,我几乎可以肯定,您想要的值确实是
symbol\u type.kind()

的返回值。这个答案是100%基于野牛手册的。我不使用C++ API,还没有安装最新版本的野牛,以尝试它。因此,如果它不适合您,请让我知道(并解释它如何无法满足您的需求)。我现在有点了解bison symbol_类型API的设计。我可以使用
symbol\u type.value.as()
获取整数值(实际上是
yy::parser::token::token\u kind\u type
,或者通过
symbol\u type.value.as()获取字符串)
@linrongbin:我不这么认为。
symbol\u type.value
是传递给解析器的语义值,而不是令牌类型。有些令牌类型可能有
int
值,有些可能有
std::string
值,但任何令牌类型都不应该同时有这两个值,而且它们不是令牌类型本身的代码和名称。@linrongbin:For e例如,如果令牌是使用
yy::parser::make_ID(yytext,loc);
创建的(来自手册中的示例),那么
令牌种类类型是
ID
(或者如果使用令牌前缀,可能是
S_\u ID
);值是从
yytext
复制的,它是一个
char*
,因此如果这是
ID
的语义类型,它很可能是
std::string
。是的,这真的很奇怪,现在我只是将
yy::parser::token::token\u kind\u type
作为整数存储到
symbol\u type.value
中。