Построение графа потока управления из AST с шаблоном посетителя с использованием Java

Я пытаюсь понять, как реализовать мой класс LEParserCfgVisitor, чтобы построить граф потока управления из абстрактного синтаксического дерева, уже созданного с помощью JavaCC. Я знаю, что есть инструменты, которые уже существуют, но я пытаюсь сделать это в рамках подготовки к финальному выпуску компиляторов.

Я знаю, что мне нужна структура данных, которая хранит график в памяти, и я хочу иметь возможность сохраните такие атрибуты, как IN, OUT, GEN, KILL в каждом узле, чтобы в дальнейшем иметь возможность выполнять анализ потока управления.

Моя основная проблема в том, что я не понял, как соединить различные блоки вместе, чтобы иметь правый край между блоками в зависимости от их природы: ветвь, петли и т. д. Другими словами, я не нашел явного алгоритма, который помог бы мне построить моего посетителя.

Вот мой пустой посетитель. Вы можете видеть, что это работает с основными выражениями языка, такими как if, while и базовыми операциями (+, -, x, ^, ...)

public class LEParserCfgVisitor implements LEParserVisitor
{
  public Object visit(SimpleNode node, Object data) { return data; }

  public Object visit(ASTProgram node, Object data) { 
    data = node.childrenAccept(this, data);
    return data; 
  }

  public Object visit(ASTBlock node, Object data) {
  }

  public Object visit(ASTStmt node, Object data) {
  }

  public Object visit(ASTAssignStmt node, Object data) {
  }

  public Object visit(ASTIOStmt node, Object data) { 
  }

  public Object visit(ASTIfStmt node, Object data) {
  }

  public Object visit(ASTWhileStmt node, Object data) {
  }

  public Object visit(ASTExpr node, Object data) { 
  }

  public Object visit(ASTAddExpr node, Object data) {
  }

  public Object visit(ASTFactExpr node, Object data) {
  }

  public Object visit(ASTMultExpr node, Object data) { 
  }

  public Object visit(ASTPowerExpr node, Object data) {  
  }

  public Object visit(ASTUnaryExpr node, Object data) { 
  }

  public Object visit(ASTBasicExpr node, Object data) {
  }

  public Object visit(ASTFctExpr node, Object data) {
  }

  public Object visit(ASTRealValue node, Object data) { 
  }

  public Object visit(ASTIntValue node, Object data) { 
  }

  public Object visit(ASTIdentifier node, Object data) {
  }
}

Кто-нибудь может мне помочь?

Спасибо!

6
задан Michael Eilers Smith 19 December 2010 в 16:15
поделиться