在给定另一个AST树的Java中创建AST树

时间:2010-07-06 12:19:55

标签: java tree sml

目前,我正在用Java编写一个用SML编写的AST树,所以我可以随时用Java遍历它。

我想知道我是否应该在Java中创建一个具有我想要表示的数据的Node类,以及一个表示该特定节点的子节点的Array列表(List)?然后,我可以有一个只有根节点的ASTTree类。

我不知道我是否需要考虑更多的幻想。

任何问题/意见将不胜感激!

-Paul

1 个答案:

答案 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的行为和含义。