Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用访问者模式构造后引用AST节点_C++_C++11_Pointers_Shared Ptr_Abstract Syntax Tree - Fatal编程技术网

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>> &params() 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){}
因此,赤裸裸的指针。在继续之前,我真的很想弄清楚这一点,因为每次我重新思考它时,都会有大量代码需要更改(AST非常冗长…)

先谢谢你

#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