最初のものでは、メインノードで「右」に進むとプログラムが進みますが、2番目のものでは、各ノードの次のポインターをたどるだけで同じことが行われます.
最初のノードのポインターの配列が非常に長くなる可能性がある特別なノードタイプのようなものは必要ないため、2番目の方がより正しいようです
ほとんどの場合、最初のアプローチを好みます。次のノードへのポインターを維持する必要がない場合は、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)),
});