Ayrıştırma ağacı ve AST arasındaki fark nedir?


94

Derleme sürecinin farklı aşamaları tarafından mı üretilirler? Yoksa aynı şey için farklı isimler mi?


Ayrıştırma Ağacı, eserleriyle birlikte gramerinizin sonucudur (aynı dil için sonsuz sayıda gramer yazabilirsiniz), bir AST, Ayrıştırma Ağacı'nı dile mümkün olan en yakın şekilde azaltır. Aynı dil için birkaç gramer, farklı ayrıştırma ağaçları verecektir, ancak aynı AST ile sonuçlanmalıdır. (aynı zamanda farklı komut dosyalarını (aynı gramerden farklı ayrıştırma ağaçları) aynı AST'ye indirgeyebilirsiniz)
Guillaume86

1
Bu SO yanıtı farkı ayrıntılı olarak tartışıyor: stackoverflow.com/a/1916687/120163
Ira Baxter

Yanıtlar:


98

Bu, Terrence Parr'ın İfade Değerlendiricisi dilbilgisine dayanmaktadır .

Bu örnek için gramer:

grammar Expr002;

options 
{
    output=AST;
    ASTLabelType=CommonTree; // type of $stat.tree ref etc...
}

prog    :   ( stat )+ ;

stat    :   expr NEWLINE        -> expr
        |   ID '=' expr NEWLINE -> ^('=' ID expr)
        |   NEWLINE             ->
        ;

expr    :   multExpr (( '+'^ | '-'^ ) multExpr)*
        ; 

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

atom    :   INT 
        |   ID
        |   '('! expr ')'!
        ;

ID      : ('a'..'z' | 'A'..'Z' )+ ;
INT     : '0'..'9'+ ;
NEWLINE : '\r'? '\n' ;
WS      : ( ' ' | '\t' )+ { skip(); } ;

Giriş

x=1
y=2
3*(x+y)

Ayrıştırma Ağacı

Ayrıştırma ağacı, girdinin somut bir temsilidir. Ayrıştırma ağacı, girdinin tüm bilgilerini tutar. Boş kutular beyaz boşluğu, yani satır sonunu temsil eder.

Ayrıştırma Ağacı

AST

AST, girdinin soyut bir temsilidir. İlişkilendirmeler ağaç yapısından türetilebildiğinden, parenlerin AST'de mevcut olmadığına dikkat edin.

AST

Daha kapsamlı bir açıklama için bkz. Derleyiciler ve Derleyici Oluşturucular sayfa. 23
veya Özet Sözdizimi Ağaçları sayfa. Programlama Dillerinin Sözdizimi ve Anlambiliminde 21


5
Ayrıştırma ağacından AST'yi nasıl elde edersiniz? Bir ayrıştırma ağacını bir AST'ye dönüştürmenin yöntemi nedir?
CMCDragonkai

3
Ayrıştırma ağacından AST'yi türetmek için belirli bir algoritma yoktur. AST'ye giren şey daha çok kişisel bir tercihtir ancak görevi tamamlamak için yeterli bilgi içermelidir. ANTLR'yi kullanarak parenleri AST'den çıkardım ! operatörü gramerde gerekli değildir, ancak varsayılan olarak ANTLR bunları dahil ederdi. Ayrıştırma ağacının, ihtiyacınız olsun ya da olmasın size her şeyi verdiğini ve AST'nin size asgari miktarı verdiğini düşünüyorum. Ağaçları çok fazla geçeceğinizi unutmayın, bu yüzden boyut önemlidir.
Guy Coder

2
CST (somut sözdizimi ağacı) ile AST (soyut sözdizimi ağacı) gibi mi?
CMCDragonkai

Ayrıştırıcı veya ayrıştırıcı üretecinin sözdizimi dosyalarına gömülü anlamsal eylemler / kurallar, anlamsal analizin ve bir AST oluşturmanın olağan yoludur; ayrıştırma ağacı, belki ayrıştırıcı doğruluğu doğrulaması dışında, kullanıcı kodu tarafından oluşturulmuş veya kullanılmışsa nadiren kullanılır.

İlgilenilenler: Soyut anlamsal grafik
Guy Coder

16

Anladığım kadarıyla AST, kaynak kodun bileşenleri arasındaki soyut ilişkilere daha çok odaklanırken, ayrıştırma ağacı, nitpicky ayrıntılar da dahil olmak üzere dil tarafından kullanılan dilbilgisinin gerçek uygulamasına odaklanıyor. "Ayrıştırma ağacı" için başka bir terim "somut sözdizimi ağacı" olduğundan, kesinlikle aynı değildirler.

Tam olarak bu soruyu çözmeye çalışan bu sayfayı buldum .


11

DSL kitabı Martin Fowler güzel açıklıyor. AST, yalnızca daha sonraki işlemler için kullanılacak tüm 'yararlı' öğeleri içerirken, ayrıştırma ağacı, ayrıştırdığınız orijinal belgeden tüm yapıları (boşluklar, köşeli parantezler, ...) içerir.


4

Pascal atamasını ele alınız Age: = 42;

Sözdizimi ağacı, aynı kaynak kodu gibi görünür. Aşağıda düğümlerin etrafına parantez koyuyorum. [Yaş] [: =] [42] [;]

Soyut bir ağaç şöyle görünecektir [=] [Yaş] [42]

Atama, Age ve 42 olmak üzere 2 öğeli bir düğüm haline gelir. Buradaki fikir, atamayı gerçekleştirebilmenizdir.

Ayrıca pascal sözdiziminin kaybolduğunu unutmayın. Bu nedenle, birden fazla dilin aynı AST'yi oluşturması mümkündür. Bu, çapraz dil komut dosyası motorları için kullanışlıdır.


1

Ayrıştırma ağacında iç düğümler terminal değildir, yapraklar terminaldir. Sözdiziminde ağaç iç düğümleri operatördür, yapraklar işlenenlerdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.