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

Add private data member to bison generated class

本文关键字:数据成员 添加      更新时间:2023-10-16

我创建了一个带有以下开头的野牛语法文件:

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

当我编译它时,会生成类,一切都很好。 现在我需要保存一个变量,这是一种在各种操作中重用的状态

我所做的是这样的:

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

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

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

这有可能吗?

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

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

在 bison 源代码的示例目录中有一个完整的可运行架构示例,并且在 bison 手册中有相当详细的解释。