2010-05-18 10 views
9

Bir evcil hayvan projesi için ANTLR ile keman yapmaya başladım. Bazı öğreticileri takip ettikten sonra, şimdi kendi dilimin dilbilgisini oluşturmaya ve bir AST oluşturmaya çalışıyorum.ANTLR ile oluşturulan bir AST'yi görselleştirme (.Net ortamında)

Şimdilik ANTLRWorks'te dalga geçiyorum, ama şimdi ayrıştırma ağacının iyi göründüğünü doğruladım (yinelemeli olarak, çünkü hala öğreniyorum ve hala bazı kararlar vermem gerekiyor) Ağacın son yapısı ile ilgili olarak) AST'yi yaratın. Antlrworks'ün onu görselleştirmeyeceği anlaşılıyor (ya da en azından "yorumlayıcı" özelliğini kullanmıyor, Debug benim makinelerim üzerinde çalışmıyor).

Sonuç:/kateden göstermekten veya bir konsola dize temsilinde ağaç baskı, manuel şekilde AST görselleştirmek için tek yol var mı? A la ANTLRWorks ait "Tercüman" özelliği> görsel AST gösterimi -

Ne aradığım girdi, dilbilgisi gitmek için basit bir yoldur. Herhangi bir fikir?

cevap

16

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

+1

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. –

+1

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. –

0

Çalışmak için ANTLRWorks tercüman için Java hedef dilini değiştirmek gerekir, ya da en azından o ne gözlenen bu.

+0

tercüman benim için çalışıyor - ama çözümleme ağacı gösterir. Seçeneklerim olsa bile {output = AST; ...Aynı ağacı aldım. _Token_^ve _Token_! saygı görmez. Ne istediğim değil .. –

+0

Hayır, ANTLRWorks'teki yorumlayıcı, bir dilbilgideki 'options {...}' başlığının 'language = XYZ' bölümünü yok sayar. En azından ANTLRWorks 1.3, 1.3.1 ve 1.4 bunu görmezden geliyor. –