C++ 如何从Bison c+中的yy::parser::symbol_类型中获取yy::parser::token+;变体?
例如,我在flex规则中通过以下方式返回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 顺便说一
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
中。