Визуализация AST, созданного с ANTLR (в среде .NET)

Для любимого проекта я начал играть с ANTLR. После следования некоторым учебным руководствам я теперь пытаюсь создать грамматику для своего очень собственного языка и генерировать AST.

На данный момент я бездельничаю в ANTLRWorks главным образом, но теперь, когда я проверил это, дерево синтаксического анализа, кажется, прекрасно, я хотел бы к (многократно, потому что я все еще учусь и все еще должен принять некоторые решения относительно заключительной структуры дерева), создают AST. Кажется, что antlrworks не будет визуализировать его (или по крайней мере не использование функции "Interpreter", Отладка, не работающая ни над одной из моих машин).

Нижняя строка: единственный путь состоит в том, чтобы визуализировать AST ручной путь, пересекая/показывая его или печатая дерево в строковом представлении к консоли?

То, что я ищу, является простым способом пойти от входа, грамматики-> визуальное представление AST а-ля функция "Interpreter" ANTLRWorks. Какие-либо идеи?

10
задан Benjamin Podszun 18 May 2010 в 11:08
поделиться

2 ответа

Правильно, интерпретатор показывает только то, какие правила используются в процессе разбора, и игнорирует любые правила перезаписи AST.

Что вы можете сделать, так это использовать StringTemplate для создания Graphviz DOT-файла. После создания такого DOT-файла вы используете сторонний просмотрщик для отображения этого дерева (графика).

Вот краткая демонстрация на Java (я мало знаю C#, извините).

Возьмем следующую (слишком упрощенную) грамматику выражений, которая создает AST:

grammar ASTDemo;

options { 
  output=AST; 
}

tokens {
  ROOT;
  EXPRESSION;
}

parse
  :  (expression ';')+ -> ^(ROOT expression+) // omit the semi-colon
  ;

expression
  :  addExp -> ^(EXPRESSION addExp)
  ;

addExp
  :  multExp
     ( '+'^ multExp
     | '-'^ multExp
     )*
  ;

multExp
  :  powerExp
     ( '*'^ powerExp
     | '/'^ powerExp
     )*
  ;

powerExp
  :  atom ('^'^ atom)*
  ;

atom
  :  Number
  |  '(' expression ')' -> expression // omit the parenthesis
  ;

Number
  :  Digit+ ('.' Digit+)?
  ;

fragment
Digit
  :  '0'..'9'
  ;

Space
  :  (' ' | '\t' | '\r' | '\n') {skip();}
  ;

Сначала пусть ANTLR сгенерирует из нее файлы лексера и парсера:

java -cp antlr-3.2.jar org.antlr.Tool ASTDemo.g 

затем создадим небольшой тестовый пакет, который разберет выражения "12 * (5 - 6); 2^3^(4 + 1);" и выведет DOT-файл:

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;

public class MainASTDemo {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("12 * (5 - 6); 2^3^(4 + 1);");
        ASTDemoLexer lexer = new ASTDemoLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        ASTDemoParser parser = new ASTDemoParser(tokens);
        ASTDemoParser.parse_return returnValue = parser.parse();
        CommonTree tree = (CommonTree)returnValue.getTree();
        DOTTreeGenerator gen = new DOTTreeGenerator();
        StringTemplate st = gen.toDOT(tree);
        System.out.println(st);
    }
}

Скомпилируем все . java файлы:

// *nix & MacOS
javac -cp .:antlr-3.2.jar *.java

// Windows
javac -cp .;antlr-3.2.jar *.java

а затем запустите главный класс и передайте его вывод в файл с именем ast-tree.dot:

// *nix & MacOS
java -cp .:antlr-3.2.jar MainASTDemo > ast-tree.dot

// Windows
java -cp .;antlr-3.2.jar MainASTDemo > ast-tree.dot

Файл ast-tree.dot теперь содержит:

digraph {

    ordering=out;
    ranksep=.4;
    bgcolor="lightgrey"; node [shape=box, fixedsize=false, fontsize=12, fontname="Helvetica-bold", fontcolor="blue"
        width=.25, height=.25, color="black", fillcolor="white", style="filled, solid, bold"];
    edge [arrowsize=.5, color="black", style="bold"]

  n0 [label="ROOT"];
  n1 [label="EXPRESSION"];
  n1 [label="EXPRESSION"];
  n2 [label="*"];
  n2 [label="*"];
  n3 [label="12"];
  n4 [label="EXPRESSION"];
  n4 [label="EXPRESSION"];
  n5 [label="-"];
  n5 [label="-"];
  n6 [label="5"];
  n7 [label="6"];
  n8 [label="EXPRESSION"];
  n8 [label="EXPRESSION"];
  n9 [label="^"];
  n9 [label="^"];
  n10 [label="^"];
  n10 [label="^"];
  n11 [label="2"];
  n12 [label="3"];
  n13 [label="EXPRESSION"];
  n13 [label="EXPRESSION"];
  n14 [label="+"];
  n14 [label="+"];
  n15 [label="4"];
  n16 [label="1"];

  n0 -> n1 // "ROOT" -> "EXPRESSION"
  n1 -> n2 // "EXPRESSION" -> "*"
  n2 -> n3 // "*" -> "12"
  n2 -> n4 // "*" -> "EXPRESSION"
  n4 -> n5 // "EXPRESSION" -> "-"
  n5 -> n6 // "-" -> "5"
  n5 -> n7 // "-" -> "6"
  n0 -> n8 // "ROOT" -> "EXPRESSION"
  n8 -> n9 // "EXPRESSION" -> "^"
  n9 -> n10 // "^" -> "^"
  n10 -> n11 // "^" -> "2"
  n10 -> n12 // "^" -> "3"
  n9 -> n13 // "^" -> "EXPRESSION"
  n13 -> n14 // "EXPRESSION" -> "+"
  n14 -> n15 // "+" -> "4"
  n14 -> n16 // "+" -> "1"

}

который можно просмотреть с помощью одной из многочисленных программ просмотра. Есть даже онлайн-просмотрщики. Возьмем, к примеру, этот: http://graph.gafol.net/

Если скормить ему содержимое ast-tree.dot, получится следующее изображение:

alt text http://img19.imageshack.us/img19/4836/expression.png

17
ответ дан 3 December 2019 в 21:20
поделиться

Вы должны изменить целевой язык на Java, чтобы интерпретатор ANTLRWorks работал, или, по крайней мере, это то, что я заметил.

0
ответ дан 3 December 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: