将私有数据成员添加到生成的 bison class
Add private data member to bison generated class
我用这个开头创建了一个 bison 语法文件:
%skeleton "lalr1.cc"
%require "3.0"
%define api.namespace {MyNamespace}
%define parser_class_name {MyParser}
%language "C++"
编译时生成class,一切正常。
现在我需要保存一个变量,它是一种 status 以便在各种操作中重复使用。
我做的是这样的:
%code provides{
std::shared_ptr<MyClass> current_;
}
它工作正常,但它是一个全局变量,因此会产生各种(主要)问题,例如线程安全和生命周期管理。
我想要实现的是使 current_
成为 MyParser
的私有数据成员或类似的东西(绑定到解析器生命周期并且对于每个解析器实例都是唯一的)。
这有可能吗?
据我所知,唯一支持的向解析器 class 添加成员的方法是通过 %parse-param
。但是,这也会向解析器 class 构造函数添加一个参数,因此它可能不适合您的用例。另外,我不认为它是私人的。
bison 手册建议创建一个包含解析器上下文(附加成员变量)以及导出的 API 的解析器 "driver" class。驱动程序的一个实例被添加到解析器 class(使用 %param
机制),以便其成员在解析操作中可用。如果您希望成员是 private
那么您可能需要一些朋友声明。
在 bison 源代码的示例目录中有一个该体系结构的完整可运行示例,并且在 bison manual.
中对其进行了相当多的详细解释。
我用这个开头创建了一个 bison 语法文件:
%skeleton "lalr1.cc"
%require "3.0"
%define api.namespace {MyNamespace}
%define parser_class_name {MyParser}
%language "C++"
编译时生成class,一切正常。 现在我需要保存一个变量,它是一种 status 以便在各种操作中重复使用。
我做的是这样的:
%code provides{
std::shared_ptr<MyClass> current_;
}
它工作正常,但它是一个全局变量,因此会产生各种(主要)问题,例如线程安全和生命周期管理。
我想要实现的是使 current_
成为 MyParser
的私有数据成员或类似的东西(绑定到解析器生命周期并且对于每个解析器实例都是唯一的)。
这有可能吗?
据我所知,唯一支持的向解析器 class 添加成员的方法是通过 %parse-param
。但是,这也会向解析器 class 构造函数添加一个参数,因此它可能不适合您的用例。另外,我不认为它是私人的。
bison 手册建议创建一个包含解析器上下文(附加成员变量)以及导出的 API 的解析器 "driver" class。驱动程序的一个实例被添加到解析器 class(使用 %param
机制),以便其成员在解析操作中可用。如果您希望成员是 private
那么您可能需要一些朋友声明。
在 bison 源代码的示例目录中有一个该体系结构的完整可运行示例,并且在 bison manual.
中对其进行了相当多的详细解释。