目前,我正在用Java表示用SML编写的AST树,以便可以随时在Java中遍历它。
我想知道是否应该在Java中创建一个Node类,该类具有要表示的数据,以及一个表示该特定节点的子代的数组列表(列表)?然后,我可以拥有仅具有根节点的ASTTree类。
我不知道是否还有其他需要考虑的东西。
任何问题/意见将不胜感激!
保罗
最佳答案
这取决于您要对该树执行的操作。
我通常通过为需要的每种操作创建一个特定的节点来实现它,例如
ASTBinaryOperation implements ASTNode
{
ASTNode left, right;
Operator op;
Result visit()
{
Result lr = left.visit();
Result rr = right.visit();
return op.apply(lr, rr);
}
}
对于经典的二进制运算符节点,而我将使用
ArrayList
例如进行声明:ASTDecl implements ASTNode
{
String name;
Type type;
Value value;
}
ASTDecls implements ASTNode
{
ArrayList<ASTDecl> declarations;
}
由解析器建立。因此,根节点类似于:
ASTRoot {
ASTDecls declarations;
ASTFunctions functions;
}
ASTFunctions {
ASTDecls args;
ASTBody body;
..
}
ASTBody {
ArrayList<ASTStatement> statements;
...
}
等等。
当然,这取决于您要执行的操作,我使用这种方法来访问AST,以通过递归地访问树来生成中间代码。但是将任何内容存储在
ArrayList
中将使您失去特定的行为和含义。单个ASTNode
。