Apakah mereka dihasilkan oleh tahapan proses kompilasi yang berbeda? Atau apakah mereka hanya nama yang berbeda untuk hal yang sama?
Apakah mereka dihasilkan oleh tahapan proses kompilasi yang berbeda? Atau apakah mereka hanya nama yang berbeda untuk hal yang sama?
Jawaban:
Ini didasarkan pada tata bahasa Penilai Ekspresi oleh Terrence Parr.
Tata bahasa untuk contoh ini:
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(); } ;
Memasukkan
x=1
y=2
3*(x+y)
Parse Tree
Pohon parse adalah representasi konkret dari input. Pohon parse menyimpan semua informasi masukan. Kotak kosong mewakili spasi, yaitu akhir baris.
AST
AST adalah representasi abstrak dari input. Perhatikan bahwa tanda kurung tidak ada dalam AST karena asosiasinya diturunkan dari struktur pohon.
Untuk penjelasan lebih lanjut lihat Compilers and Compiler Generators hal. 23
atau Pohon Sintaks Abstrak pada hal. 21 dalam Sintaks dan Semantik Bahasa Pemrograman
Dari apa yang saya pahami, AST lebih fokus pada hubungan abstrak antara komponen kode sumber, sedangkan pohon parse berfokus pada implementasi sebenarnya dari tata bahasa yang digunakan oleh bahasa, termasuk detail yang tidak jelas. Mereka pasti tidak sama, karena istilah lain untuk "pohon parse" adalah "pohon sintaks konkret".
Saya menemukan halaman ini yang mencoba menjawab pertanyaan yang sama persis.
The book DSL dari Martin Fowler menjelaskan ini baik. AST hanya berisi semua elemen 'berguna' yang akan digunakan untuk pemrosesan lebih lanjut, sedangkan pohon parse berisi semua artefak (spasi, tanda kurung, ...) dari dokumen asli yang Anda parse
Ambil tugas pascal Umur: = 42;
Pohon sintaks akan terlihat seperti kode sumber. Di bawah ini saya meletakkan tanda kurung di sekitar node. [Usia] [: =] [42] [;]
Sebuah pohon abstrak akan terlihat seperti ini [=] [Age] [42]
Tugas menjadi node dengan 2 elemen, Usia dan 42. Idenya adalah Anda dapat melaksanakan tugas tersebut.
Perhatikan juga bahwa sintaks pascal menghilang. Jadi dimungkinkan untuk memiliki lebih dari satu bahasa yang menghasilkan AST yang sama. Ini berguna untuk mesin skrip lintas bahasa.
Dalam simpul interior pohon parse adalah non terminal, daun adalah terminal. Dalam sintaksis node interior pohon adalah operator, daun adalah operan.