Closed DistinctWind closed 1 year ago
注意,现在basic
文件夹中包含了AST节点和Parser类的前向声明。
添加新的AST节点时,需要同步更改这里的前向声明。
这是理清cmake工程依赖图的结果,否则将会产生过于复杂的依赖关系。
考虑AST节点应该使用原始指针,而非shared_ptr
来存储。
shared_ptr
的含义因为shared_ptr
表示共享所有权,但是实际上这里整个语法树的所有权都在根节点上,所以不符合这个条件。
unique_ptr
确实,在这种树状结构的所有权中,使用unique_ptr
是很好的选择。但是遍历语法树的ExprVisitor
类同样也需要访问指针。虽然可以让ExprVisitor将所有权还回来(返回原来的那个unique_ptr
),但是会很麻烦而且不自然。
综上,此处应该采用原始指针。
采用原始指针应该考虑遵守“五零原则”,需定义生命周期相关的四个函数。
但是由于这些类都是被设计为使用指针的,所以应该禁用这四个函数。
// Don't copy or move a certain type
// This class is designed to use and pass like by a pointer
ArithmeticBinary(const ArithmeticBinary&) = delete;
ArithmeticBinary(ArithmeticBinary&&) = delete;
ArithmeticBinary& operator=(const ArithmeticBinary&) = delete;
ArithmeticBinary& operator=(ArithmeticBinary&&) = delete;
目前
decaf::Parser
类暂时不能实例化,无法指定输入。全局函数
yylex
已经定义完成。由于
parser_impl.h
的广泛依赖性,将其单独独立成一个Header-Only的目标。