我用这个开头创建了一个 Bison 语法文件:
%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
的私有(private)数据成员或类似的东西(绑定(bind)到解析器生命周期并且对于每个解析器实例都是唯一的)。
这有可能吗?
最佳答案
据我所知,向解析器类添加成员的唯一受支持的方法是通过 %parse-param
。但是,这还会向解析器类构造函数添加一个参数,因此它可能不适合您的用例。另外,我不认为这是私有(private)的。
bison 手册建议创建一个解析器“驱动程序”类,其中包含解析器上下文(附加成员变量)以及导出的 API。驱动程序的实例被添加到解析器类(使用 %param
机制),以便其成员在解析操作中可用。如果您希望成员是私有(private)
,那么您可能需要一些好友声明。
bison 源代码的示例目录中有此架构的完整可运行示例,并且在 bison manual 中对其进行了相当详细的解释。 .
关于c++ - 将私有(private)数据成员添加到 bison 生成的类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52904152/