【问题标题】:How to get yy::parser::token from yy::parser::symbol_type in Bison c++ variant?如何从 Bison c++ 变体中的 yy::parser::symbol_type 获取 yy::parser::token?
【发布时间】:2020-08-27 06:47:25
【问题描述】:

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

[a-zA-Z][a-zA-Z0-9_]*  return yy::parser::make_ID(yytext);

其中ID是我在bison中定义的一个token,它会生成yy::parser::token结构。

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

顺便说一句,在野牛手册中,建议使用 flex 规则中的 yy::parser::make_XXX APIs 返回 yy::parser::symbol_type

或者没有这样的 API 来完成这项工作?我需要使用symbol_type.kind() API 来获得类似yy::parser::symbol_type_kind::S_T_ID 的东西?

【问题讨论】:

    标签: c++ bison flex-lexer bisonc++


    【解决方案1】:

    没有yy::parser::token 类型的对象。 struct 的存在只是为了保存 enum token_kind_type 枚举(不是具有该值的成员;枚举本身)。请参阅Bison manual outline of the C++ API

    我不太明白这样做的动机,但我想这是因为希望允许没有 enum class 的 C++ 标准的古老版本。

    无论如何,我几乎可以肯定,你想要的值确实是symbol_type.kind()的返回值。

    【讨论】:

    • 这个答案是 100% 基于野牛手册。我不使用 C++ API,并且还没有安装最新版本的野牛来尝试它。因此,如果它不适合您,请告诉我(并解释它如何无法满足您的需求)。
    • 我现在有点理解 bison symbol_type API 的设计了。我可以使用symbol_type.value.as<int>()获取整数值(实际上是yy::parser::token::token_kind_type,或者通过symbol_type.value.as<std::string>()获取字符串
    • @linrongbin:我不这么认为。 symbol_type.value 是传递给解析器的语义值,而不是令牌类型。有些令牌种类可能有int 值,有些可能有std::string 值,但任何令牌种类都不应该同时具有这两者,而且这些不是令牌种类本身的代码和名称。
    • @linrongbin:例如,如果令牌是用yy::parser::make_ID (yytext, loc); 创建的(来自手册中的示例),则token_kind_typeID(或者可能是S_T_ID,如果你'重新使用标记前缀);该值是从yytext 复制的,这是一个char*,因此如果这是ID 的语义类型,它很可能是一个std::string
    • 是的,这真的很奇怪,现在我只是将yy::parser::token::token_kind_type 作为整数存储到symbol_type.value 中作为int
    猜你喜欢
    • 2022-01-13
    • 2012-12-31
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多