目前,我正在用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

10-07 17:12