c++ - 将私有(private)数据成员添加到 bison 生成的类中

标签 c++ bison

我用这个开头创建了一个 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/

相关文章:

C++ std::forward 没有 T&&

c++ - Bison 更好的内存管理

冲突 Bison 解析器

c - 所有解析器都是用 yacc 或 bison(和 lex/flex)制作的吗?

c++ - 如何使我的代码语句以 clang 格式出现在一行中?

c++ - 实例化线程而不运行它们?

move 操作后 C++ lambda ‘this’ 指针失效

c++ - 将 float 与参数内的字符串连接起来

c++ - Valgrind 报告简单 gtest 上未初始化值的使用情况