Derleme sürecinin farklı aşamaları tarafından mı üretilirler? Yoksa aynı şey için farklı isimler mi?
Derleme sürecinin farklı aşamaları tarafından mı üretilirler? Yoksa aynı şey için farklı isimler mi?
Yanıtlar:
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.
AST
AST, girdinin soyut bir temsilidir. İlişkilendirmeler ağaç yapısından türetilebildiğinden, parenlerin AST'de mevcut olmadığına dikkat edin.
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
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 .
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.
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.
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.