0

目前,我正在用 Java 表示我拥有的 AST 树,它是用 SML 编写的,所以我可以随时用 Java 遍历它。

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

我不知道我是否需要考虑更多花哨的东西。

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

-保罗

4

1 回答 1

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 以通过递归访问树来生成中间代码。但是在 an 中存储任何内容ArrayList都会使您失去单个ASTNode.

于 2010-07-06T12:28:14.487 回答