【问题标题】:Bison C++ get name of token - yytname_ is privateBison C++ 获取令牌名称 - yytname_ 是私有的
【发布时间】:2021-06-17 15:07:33
【问题描述】:

我正在尝试在 C++ Bison 中获取令牌的名称: 例如。 %token <int> TPLUS "+" TMINUS "-" TMUL "*" TDIV "/"

但是在 Bison 的 C++ 变体中,%token-table 不执行任何操作。

我注意到生成的野牛代码中有一个令牌映射: const char* const parser::yytname_[]; 但它是私有的。

有人知道如何在 C++ Bison 中获取这些标记的名称吗?这甚至可以使用 C++ 变体吗?

我知道有人问过这个问题here,但没有接受的答案。

使用版本 3.4.3

【问题讨论】:

  • 我的野牛手册没有提到 %token-table 的任何 C++ 限制。如果您确定它没有做任何事情,那么可能值得向项目询问限制是什么,以及您应该如何使用它。从文档中,我希望它产生与 C 下相同的全局数组。
  • symbol_name 没有给你你需要的东西吗?
  • @rici 已更新。谢谢
  • @rici 生成的代码中没有 symbol_name 函数
  • @Tom:我认为您需要一个最新版本的 Bison,最好是与该文档 (3.7.6) 对应的版本。我不记得这个界面是什么时候添加的,但不久前。

标签: c++ bison bisonc++


【解决方案1】:

首先,确保您拥有最新版本的 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 标志,例如)。我不知道为什么返回类型会根据parse.error 的定义而有所不同。

如前所述,symbol_name 的参数是 bison 内部令牌编号,而不是扫描仪返回的令牌类型。您可以使用parser 成员类by_kind 获取令牌类型的内部令牌编号,表达式类似于yy::parser::by_kind(yy::parser::token::«token-type-name»).type_get()。

【讨论】:

    【解决方案2】:

    确保你的野牛是我的最新版本(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 是您的令牌。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      相关资源
      最近更新 更多