visual-decaf / decaf-compiler

Compiler of decaf language
1 stars 3 forks source link

实现数学表达式AST和Parser #20

Closed DistinctWind closed 1 year ago

DistinctWind commented 1 year ago

目前decaf::Parser类暂时不能实例化,无法指定输入。

全局函数yylex已经定义完成。

由于parser_impl.h的广泛依赖性,将其单独独立成一个Header-Only的目标。

DistinctWind commented 1 year ago

注意,现在basic文件夹中包含了AST节点和Parser类的前向声明。

添加新的AST节点时,需要同步更改这里的前向声明。

这是理清cmake工程依赖图的结果,否则将会产生过于复杂的依赖关系。

DistinctWind commented 1 year ago

考虑AST节点应该使用原始指针,而非shared_ptr来存储。

shared_ptr的含义

因为shared_ptr表示共享所有权,但是实际上这里整个语法树的所有权都在根节点上,所以不符合这个条件。

为何不采用unique_ptr

确实,在这种树状结构的所有权中,使用unique_ptr是很好的选择。但是遍历语法树的ExprVisitor类同样也需要访问指针。虽然可以让ExprVisitor将所有权还回来(返回原来的那个unique_ptr),但是会很麻烦而且不自然。


综上,此处应该采用原始指针。

DistinctWind commented 1 year ago

采用原始指针应该考虑遵守“五零原则”,需定义生命周期相关的四个函数。

但是由于这些类都是被设计为使用指针的,所以应该禁用这四个函数。

    // 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;