在第一个中,在主节点上向右“ ”将提前您 通过程序,但在第二个 一个简单的下一个指针 在每个节点上都会做同样的事情。
这似乎是第二个将 更正确的,因为你不需要 像一个特殊的节点类型 有可能非常长 数组指针为第一个 节点
我几乎总是喜欢第一种方法,而且我认为当你不需要维护一个指向下一个节点的指针时,你会发现构建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)),
});