在第一个中,在主节点上“向右”将引导您完成程序,但在第二个中,只需跟随每个节点上的 next 指针即可。
似乎第二个会更正确,因为您不需要像特殊节点类型这样的东西,第一个节点的指针数组可能非常长
我几乎总是更喜欢第一种方法,而且我认为当您不需要维护指向下一个节点的指针时,您会发现构建 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)),
});