Где в первом из них движение «вправо» на главном узле будет продвигать вас через программу, но во втором простое следование по следующему указателю на каждом узле будет делать то же самое.
Кажется, что второй вариант был бы более правильным, так как вам не нужно что-то вроде специального типа узла с потенциально очень длинным массивом указателей для самого первого узла
Я бы почти всегдаЯ предпочитаю первый подход, и я думаю, что вам будет гораздо проще создать свой 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)),
});