目前,我正在用Java编写一个用SML编写的AST树,所以我可以随时用Java遍历它。
我想知道我是否应该在Java中创建一个具有我想要表示的数据的Node类,以及一个表示该特定节点的子节点的Array列表(List)?然后,我可以有一个只有根节点的ASTTree类。
我不知道我是否需要考虑更多的幻想。
任何问题/意见将不胜感激!
-Paul
答案 0 :(得分:1)
这取决于你想对那棵树做什么。
我通常通过为我需要的每种操作创建一个特定节点来实现它,例如
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
的行为和含义。