07 / 1 - 11
TOP-DOWN PARSING
Dapat dipandang sebagai : Usaha untuk mencari leftmost derivation dari suatu input string Usaha untuk membangun parse tree dari suatu input string, dimulai dari root (top) sampai dengan leaves (bottom), dengan urutan preorder.
Teknik Kompilasi
07 / 2 - 11
Contoh : Grammar G :
S cAd A ab | a dan input string w = cad maka langkah-langkah pada top-down parse :
S c A d c a (a) (b) S A d b c S A a (c) d
Perhatikan bahwa grammar yang mangandung left recursive dapat mengakibatkan loop tak berhingga.
Teknik Kompilasi
07 / 3 - 11
PREDICTIVE PARSING
Suatu top-down parsing dimana : 1. Grammarnya tidak mengandung left recursion 2. Pada grammar tersebut telah dilakukan left factoring 3. Untuk input a, maka dapat dilakukan pilihan yang unik untuk mengembangkan A pada : A 1|2|...|n untuk menderivasi string yang dimulai dengan a 4. Tidak memerlukan backtracking ! Contoh : stmt if expr then stmt else stmt | while expr do stmt | begin stmt_list end
Teknik Kompilasi
07 / 4 - 11
Dalam hal ini non-terminal stmt dapat dikembangkan secara unik (pilihannya if, while atau begin ).
Implementasi predictive parser antara lain dapat dilakukan dengan : 1. Menggunakan transition diagram, yang kemudian diterjemahkan ke dalam program 2. Menggunakan stack. MENGGUNAKAN DIAGRAM TRANSITION
1. Satu diagram untuk setiap nonterminal 2. Label transisi : token atau nonterminal (menentukan arah transisi) 3. Bila label = non-terminal A, maka berarti call ke procedure A
Teknik Kompilasi
07 / 5 - 11
Contoh : E E+T|T T T*F|F F (E) | id Setelah dihilangkan left recursion dan dilakukan left factoring : E TE E +TE | T FT T *FT | F (E) | id Diagram Transition-nya adalah :
E : 0 E : T +
1
E T
T :
Teknik Kompilasi
07 / 6 - 11
T :
10
11
F E
12
13
F :
14
15
16
17
E : 0 T : F :
T
*
E id
7 14
F (
8 15
13 16
17
Implementasi diagram transition yang telah disederhanakan akan menghasilkan parser lebih sederhana dan efisien
Teknik Kompilasi
07 / 7 - 11
IMPLEMENTASI STACK
Dalam hal ini komponen-komponen predictive parser terdiri dari: input buffer, stack, parsing table, dan output.
a Input+ b $
Stack
X Y Z $
Parsing Table M
Mekanisme Kerja Program Parser : Bila X = top of stack, dan a = current input, maka : 1. Jika X = a = $, parser berhenti, karena parsing berhasil. 2. Jika X = a $, pop x, dan geser pointer input ke simbol berikutnya.
Teknik Kompilasi
07 / 8 - 11
4. Jika X = non-terminal, parser memeriksa sel M[X,a] dari parsing table. Sel ini pasti berisi suatu produksi X, atau error entry
Jika M[X,a] = X UVW, maka X akan diganti dengan WVU (U di atas)
Jika M[X,a] = error, parser akan memanggil error routine. Contoh : Dari grammar (predictive Pasing) didapatkan parsing table M berikut :
Non
Terminal
E E T T F
E E T T
Teknik Kompilasi
07 / 9 - 11
Sehingga bila bahasa menerima input string, misalnya : id + id * id Maka, urutan-urutan parsingnya adalah sebagai berikut :
Stack
$E $E T $E T F $E T id $E T $E $E T+ $E T $E T F $E T id $E T $E T F* $E T F $E T id $E T $E $
Input
Id + id * id$ Id + id * id$ Id + id * id$ Id + id * id$ + id * id$ + id * id$ + id * id$ id * id$ id * id$ id * id$ * id$ * id$ id$ id$ $ $ $
Output
ETE TFT Fid T E+TE TFT Fid T*FT Fid T E
Teknik Kompilasi
07 / 10 - 11
Derivasi :
Teknik Kompilasi
07 / 11 - 11
T F
FT (E) | id
Maka : First (E) = first(T) = first (F) = { (, id } First (E ) = { +, } First (T ) = { *, } Follow (E) = Follow (E )={ ), $ } Follow (T) = Follow (T )={ +, ), $ } Follow (T) = { +, *, ), $ }
pada M [A,a] 3. Jika dalam first() maka tambah-kan A pada M[A,b] untuk setiap terminal b dari follow (A). Jika dalam first() dan $ dalam follow (A), tambahkan A pada M [A,$] 4. Biarkan yang lainnya kosong
Teknik Kompilasi
07 / 12 - 11
Catatan : Dari grammar di atas bahwa : first (TE ) = first ( T ) = { (, id } produksi E TE akan ditempatkan pada M[ E, ( ] dan M[ E, id]