Doğru, tercüman sadece kuralları ayrıştırma işleminde kullanılan hangi gösterir ve herhangi bir AST yeniden yazma kuralları yok sayar.
Yapabilecekleriniz GraphvizDOT-file oluşturmak için StringTemplate
kullanın. Böyle bir DOT-file oluşturduktan sonra, bu ağacı (grafik) görüntülemek için bazı 3. taraf görüntüleyicileri kullanırsınız.
Java'da hızlı bir demo (küçük C# biliyorum, üzgünüm).
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();}
;
İlk ANTLR ondan lexer ve ayrıştırıcı dosyaları oluşturmasına izin:
bir AST üretir aşağıdaki (aşırı basit) ifadesi dilbilgisi atın
java -cp antlr-3.2.jar org.antlr.Tool ASTDemo.g
sonra küçük bir test koşum takımı oluşturmak olduğunu ifadeleri "12 * (5 - 6); 2^3^(4 + 1);"
'u ayrıştırır ve çıkış DOT-file:
Derleme tüm .java
dosyaları:
// *nix & MacOS
javac -cp .:antlr-3.2.jar *.java
// Windows
javac -cp .;antlr-3.2.jar *.java
ve ardından ana sınıfı ve boru ast-tree.dot
adlı bir dosyaya çıkış çalıştırın:
// *nix & MacOS
java -cp .:antlr-3.2.jar MainASTDemo > ast-tree.dot
// Windows
java -cp .;antlr-3.2.jar MainASTDemo > ast-tree.dot
dosya ast-tree.dot
şimdi içerir:
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"
}
etrafında many viewers biri ile görüntülenebilir. Çevrimiçi görüntüleyenler bile var. http://graph.gafol.net/
o ast-tree.dot
içeriğini besleyen, aşağıdaki görüntü üretilir: örneğin bu bir atın
alt text http://img19.imageshack.us/img19/4836/expression.png
Whoa, detaylı cevap için teşekkürler. Bunun için +1 (istediğimi yapmak gibi görünüyor). Ben gün boyunca bir deney yapacağım ve muhtemelen sonradan kabul edeceğim. Daha hızlı görünüyor (yani, her değişiklik için bir derleme yok, "örnek bir giriş/akışa karşı önizleme" yolu yok, ne yazık ki. –
Hoşgeldin @Benjamin. Eclipse kullanıyorsanız, ANTLR IDE eklentisini denemek isteyebilirsiniz: http://antlrv3ide.sourceforge.net/ Bir AST görüntüsünü anında oluşturma seçeneğine sahip olduğuna inanıyorum. Ama onunla kişisel deneyimim yok. –