在第一个中,“正确”
在主节点上会推进你
通过程序,但在第二
一个简单地跟随下一个指针
在每个节点上都会做同样的事情。
好像是第二个
更正确,因为你不需要
类似于特殊节点类型的东西
具有潜在的极长
第一个指针数组
节点
我几乎总是更喜欢第一种方法,而且我认为当您不需要维护指向下一个节点的指针时,您会发现构建 AST 会容易得多。
我认为让所有对象都从一个公共基类派生通常更容易,类似于:
abstract class Expr { }
class Block : Expr
{
Expr[] Statements { get; set; }
public Block(Expr[] statements) { ... }
}
class Assign : Expr
{
Var Variable { get; set; }
Expr Expression { get; set; }
public Assign(Var variable, Expr expression) { ... }
}
class Var : Expr
{
string Name { get; set; }
public Variable(string name) { ... }
}
class Int : Expr
{
int Value { get; set; }
public Int(int value) { ... }
}
生成的 AST 如下:
Expr program =
new Block(new Expr[]
{
new Assign(new Var("a"), new Int(1)),
new Assign(new Var("b"), new Int(2)),
new Assign(new Var("c"), new Int(3)),
new Assign(new Var("d"), new Int(4)),
new Assign(new Var("e"), new Int(5)),
});