C++ 使用访问者模式构造后引用AST节点
我有一个内存管理问题。因为我正在为一种小型编程语言构建一个解释器。第一步是建模和构建一个应用程序 到目前为止,我正在使用智能指针来管理节点的生存期,我认为每个父节点都是其子节点的所有者,但它也必须与环境共享(例如,要知道方法体属于树的哪一部分)并与垃圾收集器共享,它必须保留一份所有参考文献的列表,以实施天真的标记和扫描算法。因此,我使用C++ 使用访问者模式构造后引用AST节点,c++,c++11,pointers,shared-ptr,abstract-syntax-tree,C++,C++11,Pointers,Shared Ptr,Abstract Syntax Tree,我有一个内存管理问题。因为我正在为一种小型编程语言构建一个解释器。第一步是建模和构建一个应用程序 到目前为止,我正在使用智能指针来管理节点的生存期,我认为每个父节点都是其子节点的所有者,但它也必须与环境共享(例如,要知道方法体属于树的哪一部分)并与垃圾收集器共享,它必须保留一份所有参考文献的列表,以实施天真的标记和扫描算法。因此,我使用std::shared_ptr跟踪引用。例如,下面是块节点的示例,它基本上表示lambda表达式: #ifndef NAYLANG_BLOCK_H #define
std::shared_ptr
跟踪引用。例如,下面是块
节点的示例,它基本上表示lambda表达式:
#ifndef NAYLANG_BLOCK_H
#define NAYLANG_BLOCK_H
#include <model/ast/expressions/Expression.h>
#include <model/ast/declarations/Declaration.h>
#include <memory>
#include <vector>
namespace naylang {
#define BlockPtr std::shared_ptr<Block>
class Block : public Expression {
std::vector<std::shared_ptr<Statement>> _body;
std::vector<std::shared_ptr<Declaration>> _params;
public:
Block() = default;
void accept(Evaluator &evaluator) override;
const std::vector<std::shared_ptr<Statement>> &body() const;
const std::vector<std::shared_ptr<Declaration>> ¶ms() const;
void addStatement(std::shared_ptr<Statement> statement);
void addParameter(std::shared_ptr<Declaration> param);
};
} // end namespace naylang
#endif //NAYLANG_BLOCK_H
如您所见,bindTo()
是在BindingEvaluator
(Evaluator
的子类)在构建请求对象很久之后对其求值时调用的。但是,我真的不确定\u binding
参数应该是什么样子。以下是评估器
界面的一部分:
#ifndef NAYLANG_EVALUATOR_H
#define NAYLANG_EVALUATOR_H
#include <model/ast/Statement.h>
namespace naylang {
class Request;
class Block;
class Evaluator {
public:
Evaluator() = default;
virtual ~Evaluator() = default;
// Methods left blank to be overridden by the subclasses.
// For example, a Binding Evaluator might be only interested in
// evaluating VariableReference and Request Statements
virtual void evaluate(Request &expression) {}
virtual void evaluate(Block &expression) {}
};
}
#endif //NAYLANG_EVALUATOR_H
\ifndef-NAYLANG\u评估员\u H
#定义NAYLANG_评估器
#包括
名称空间naylang{
类请求;
类块;
班级评估员{
公众:
Evaluator()=默认值;
virtual~Evaluator()=默认值;
//方法留空以被子类重写。
//例如,绑定计算器可能只对
//评估VariableReference和Request语句
虚空求值(请求和表达式){}
虚空求值(块和表达式){}
};
}
#endif//NAYLANG\u评估者\u H
我的理由如下:
- 引用应该是多态的,因此应该是某种指针
- 引用不表示所有权,因此不应是
李>std::shared\u ptr
- 此外,我们需要访问者模式,因此每个节点都有函数
void accept(Evaluator&Evaluator)代码>。由于节点本身不能返回
,因此我们不能将接口更改为类似shared\u ptr
virtualvoid evaluate(std::shared\u ptr&expression){}
#ifndef NAYLANG_EVALUATOR_H
#define NAYLANG_EVALUATOR_H
#include <model/ast/Statement.h>
namespace naylang {
class Request;
class Block;
class Evaluator {
public:
Evaluator() = default;
virtual ~Evaluator() = default;
// Methods left blank to be overridden by the subclasses.
// For example, a Binding Evaluator might be only interested in
// evaluating VariableReference and Request Statements
virtual void evaluate(Request &expression) {}
virtual void evaluate(Block &expression) {}
};
}
#endif //NAYLANG_EVALUATOR_H