Создание дерева AST в Java с использованием другого дерева AST - PullRequest
0 голосов
/ 06 июля 2010

В настоящее время я работаю над тем, чтобы представить дерево AST, написанное на SML, на Java, чтобы я мог обойти его в Java в любое время.

Мне интересно, должен ли я просто создать в Java класс Node, содержащий данные, которые я хочу представить, а также список Array (List) для представления дочерних элементов для этого конкретного узла? Тогда у меня может быть класс ASTTree, который имеет только корневой узел.

Я не знаю, есть ли что-то более причудливое, что мне нужно рассмотреть.

Любые вопросы / комментарии будут с благодарностью!

-Поль

1 Ответ

1 голос
/ 06 июля 2010

Это зависит от того, что вы хотите сделать над этим деревом.

Я обычно реализую его, создавая конкретный узел для каждого вида операций, который мне понадобится, например,

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.

...