目前,我正在用 Java 表示我拥有的 AST 树,它是用 SML 编写的,所以我可以随时用 Java 遍历它。
我想知道我是否应该在 Java 中创建一个包含我想要表示的数据的 Node 类,以及一个表示该特定节点的子节点的数组列表(List)?然后,我可以拥有一个只有根节点的 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 以通过递归访问树来生成中间代码。但是在 an 中存储任何内容ArrayList
都会使您失去单个ASTNode
.