Pohon Urai (parse) dan Derivasi Chapter 4 Pohon Urai (parse) dan Derivasi
Pohon Urai (parse) dan Derivasi Pohon urai dapat dianggap sebagai representasi grafik untuk suatu derivasi yang menyaring pilihan urutan penggantian non terminal.
Hubungan derivasi dan pohon urai ,dimana adalah non terminal A. Untuk masingmasing , buat pohon urai dengan hasil (induksi pada i). Untuk i = 1, = A merupakan node tunggal A. Misal sudah terbentuk pohon urai yang hasilnya ( adalah terminal atau nonterminal). Misalkan diderivasi dari dengan mengganti (nonterminal) dengan
Hubungan derivasi dan pohon urai Jadi, pada langkah ke i: dengan memakai Jadi: Jika r=0 maka label untuk anak dari adalah Contoh, derivasi:
Hubungan derivasi dan pohon urai Tatabahasa mempunyai dua derivasi leftmost yang berbeda untuk input
Hubungan derivasi dan pohon urai Jadi, mempunyai 2 pohon urai Jadi, grammarnya ambiguous
Menghilangkan Ambiguity Contoh: stmt → IF expr THEN stmt | IF expr THEN stmt ELSE stmt | OTHER OTHER = statement lainnya Tatabahasa tersebut ambiguous karena string berikut: IF E1 THEN IF E2 THEN S1 ELSE S2 mempunyai dua pohon urai
Menghilangkan Ambiguity IF E1 THEN IF E2 THEN S1 ELSE S2
Menghilangkan Ambiguity Supaya tidak ambiguous: Pasangkan masingmasing ELSE dengan THEN yang terdekat dan belum terpasang oleh ELSE lainnya. stmt bisa stmt terpasang atau tidak.
Menghilangkan Ambiguity stmt → stmt_terpasang | stmt_tak_terpasang stmt terpasang → IF expr THEN stmt_terpasang ELSE stmt terpasang | other stmt_tak_terpasang → if expr THEN stmt | IF expr THEN stmt_terpasang ELSE stmt_tak_terpasang
Penghilangan Ambiguity Dengan Penghapusan rekursi kiri Dengan Faktorisasi kiri Tatabahasa dikatakan rekursi kiri jika nonterminal A dapat menghasilkan Aα. Contoh:E → E+T | T T → T * F | F F → (E) | id
Penghilangan Ambiguity Hilangkan rekursi kiri immediate (produksi dalam bentuk A → Aα) pada E dan T, maka diperoleh:
Penghilangan Ambiguity Secara umum: Berapapun banyaknya Aproduksi, kelompokkan Aproduksi seperti: dimana tidak dimulai dengan A. Lalu ganti Aproduksi dengan: Penghilangan rekursi kiri imediat belum tentu menghilangkan rekursi kiri. Contoh: S → Aa | b A → Ac | Sd | є S adalah rekursi kiri karena
Algoritma penghilangan rekursi kiri Input: Gramar G yang tidak mengandung cycle dan εproduksi Output: Tatabahasa yang ekivalen tidak mengandung rekursi kiri Metoda: Pakai algoritma berikut: 1. Susun non terminal dengan urutan A1 , A2 , … , An 2. for i:=1 to n do for j:=1 to i1 do begin ubah setiap produksi dalam bentuk Ai → Ajγ dengan produksi , dimana Ai → δ1 | … | δk merupakan Aj produksi terbaru. Lalu, hilangkan rekursif kiri imediat diantara Ajproduksi end
Algoritma penghilangan rekursi kiri Contoh: S → Aa | b A → Ac | Sd | ε S mengandung ε, tetapi tidak menimbulkan masalah. Urutkan nonterminal S, A. S tidak ada rekursi kiri imediat → untuk i=1 tak ada proses Untuk i=2, gunakan Sproduksi pada A → Sd untuk memperoleh : A → Ac | Aad | bd | ε Hilangkan rekursi kiri imediate pada Aproduksi. Jadi: S → Aa | b A → bdA’ | A’ A' → cA’ | adA’ | ε
Faktorisasi kiri : Suatu transformasi grammar yang berguna untuk menghasilkan suatu grammar yang cocok untuk penguraian prediktif. Ide: Pada saat tidak jelas mana diantara dua produksi yang akan dipakai untuk menggantikan suatu nonterminal A, Aproduksi dapat ditulis kembali untuk menunda pemilihan sampai diperoleh input yang cukup. Secara umum, jika A → αβ1 | αλβ2 pilihan segera tidak dapat ditentukan, maka: A → α A’ A’ → β1 | λβ2 Caranya?
Algoritma Faktorisasi Kiri Input: Tatabahasa G Output: Tatabahasa yang sudah terfaktorisasi kiri dan ekivalen dengan G metoda: nonterminal A, cari awalan (prefik) yang terpanjang dan sama dengan awalan pada dua atau lebih pilihan untuk A. Jika γ bukan string kosong, maka ganti semua A produksi A → αβ1 | αβ2 | ... | αβn | γ (dimana γ mewakili semua pilihan yang tidak dimulai dengan α ) dengan: A → αA’ | γ A’ → β1 | β2 | … | βn A' merupakan nonterminal yang baru. Ulangi proses ini sampai tidak ada dua pilihan yang mempunyai awalan yang sama.
Algoritma Faktorisasi Kiri Contoh: S → iEtS | iEtSeS | a E → b Diubah menjadi: S → iEtSS' | a S' → eS | ε
Bahasa dan Bebas Kontek (Language and Context Free) L2 = { an bm cn d m | n >= 1 dan m >= 1} menggambarkan persoalan pemeriksaan jumlah parameter dalam deklarasi dan jumlah argumen dalam pemanggilan prosedur. an , b m merepresentasikan parameter list dua prosedur yang mempunyai n,m parameter. c n , d m merepresentasikan parameter list pemanggilan kedua prosedur itu. Dalam hal ini a dan c lalu b dan d harus sama banyaknya Tapi bahasa ini tidak Context Free (bebas kontek), krn tak bisa dibuatkan grammarnya.
Bahasa dan Bebas Kontek (Language and Context Free) Tetapi: L1' = {wcwR | w ada di dalam (a|b)*}, dimana wR adalah kebalikan w adalah bebas kontek karena ada grammar : S → aSa | bSb | c L2' = { an bm cmd n | n >= 1 dan m >= 1} bebas kontek karena ada grammar: S → aSd | aAd A → bAc | bc
Kelas Parsing (Penguraian): Top Down & Bottom UP Topdown Parsing Mencari derivasi paling kiri (leftmost) dari suatu string input. Pembentukan pohon urai berdasarkan string input. Pengurai Prediktif (Predictive Parsing) (atasbawah onbacktracking) Contoh: backtracking S → cAd A → ab | a Input w = cad
Pengurai Prediktif Butuh satu input (token) untuk menentukan pilihan produksi 1. Berdasarkan diagram transisi -- Hilangkan rekursi kiri -- Faktorisasi kiri -- nonterminal A (a) Buat state awal dan akhir (b) produksi A → X1X2 … Xn , buat path dari state awal ke state akhir dengan sisi (edge) X1X2 … Xn Cara di atas berhasil kalau tidak ada nondeterminisme (ada lebih dari satu transisi dari suatu state, dengan input sama).
Pengurai Prediktif Contoh: diagram transisi E → TE’ E’ → +TE’ | ε T → FT’ T’ → *FT’ | ε F → (E) | id
Pengurai Prediktif Simplified transition diagram:
Pengurai Prediktif Simplified transition diagram for arithmetic expression:
Pengurai Prediktif 2. Berdasarkan stack (prediktif yang nonrekursif) Persoalan pada setiap langkah: menentukan produksi mana yang akan dipakai untuk suatu nonterminal.
Pengurai Prediktif Tabel M adalah M[A,a], A adalah nonterminal, a adalah terminal atau simbol $ (akhir buffer). Program dikendalikan oleh 3 aksi, dengan memperhatikan simbol X pada puncak stack (a) Jika X = a = $, pengurai berhenti dan selesai (b) Jika X = a ≠ $, pengurai mempop X keluar dari stack dan memajukan pointer input ke simbol berikutnya (c) Jika X adalah nonterminal, akan dilihat entri M[X,a]. Entri akan berupa Xproduksi grammar (Contoh M[X,a] = {X → uvw}, maka X akan diganti dengan wvu, dengan u di puncak stack), produksi X → uvw dicetak sebagai output).
Pengurai Prediktif Algoritma : Prediktif nonrekursif Input: w, dan tabel pengurai M untuk G Output: jika w L(G), output berupa derivasi leftmost dari w, kalau tidak → error. Metoda: ip pada simbol pertama di w$ repeat Misalkan X merupakan puncak dari simbol stack dan a simbol yang ditunjuk oleh ip if X adalah terminal atau $ then if X = a then pop X, majukan ip else error
Pengurai Prediktif else /*X nonterminal*/ if M[X,a] = X → Y1 ... Yk then begin pop X dari stack push Yk , ..., Y1 , Y1 di puncak tampilkan produksi X → Y1 ... Yk end else error until X = $
Moves made by predictive parser on input id+id*id