将私有数据成员添加到bison生成的类中

时间:2018-10-20 09:20:32

标签: c++ bison

我已经创建了一个野牛语法文件:

%skeleton "lalr1.cc"
%require "3.0"
%define api.namespace {MyNamespace}
%define parser_class_name {MyParser}
%language "C++"

当我编译它时,将生成类,并且一切都很好。 现在,我需要保存一个变量,该变量是一种 status 状态,以便在各种操作中重复使用。

我所做的就是这样:

%code provides{
std::shared_ptr<MyClass> current_;
}

它可以正常工作,但是它是一个全局变量,因此会产生各种(主要)问题,例如线程安全性和生命周期管理。

我要实现的目标是使current_成为MyParser或类似的私有数据成员(绑定到解析器生存期,并且对于每个解析器实例都是唯一的)。

有可能吗?

1 个答案:

答案 0 :(得分:0)

据我所知,将成员添加到解析器类的唯一受支持方法是通过%parse-param。但是,这还会向解析器类的构造函数添加一个参数,因此它可能不适用于您的用例。另外,我不认为这是私人的。

野牛手册建议创建一个解析器“驱动程序”类,其中包含解析器上下文(其他成员变量)以及导出的API。将驱动程序的实例添加到解析器类(使用%param机制),以便其成员在解析操作中可用。如果希望成员成为private,则可能需要一些朋友声明。

在bison来源的examples目录中有一个完整的可运行示例,该架构在bison manual中有很多详细解释。