Pengurai Prediktif & Bottom Up Parsing (penguraian bawah atas) Chapter 5 Pengurai Prediktif & Bottom Up Parsing (penguraian bawah atas)
Contoh Penguraian Prediktif Non-rekursif
Contoh pergerakan Penguraian Prediktif Non-rekursif
Penguraian Prediktif Non-rekursif Pembentukan tabel penguraian M, memakai FIRST dan FOLLOW. Jika a adalah sembarang simbol grammar, maka FIRST(a) adalah himpunan terminal-terminal yang merupakan awal dari string yang dapat diderivasi dari a. Jika maka e di dalam FIRST(a). FOLLOW(A), A non terminal, adalah himpunan terminal a yang dapat muncul tepat di sebelah kanan A (himpunan a sedemikian rupa sehingga E derivasi dalam bentuk S => aA , untuk beberapa a dan b).
Perhitungan FIRST(X), "X simbol grammar. Lakukan langkah berikut sampai tidak ada terminal atau e yang dapat ditambahkan ke himpunan FIRST. Jika X adalah terminal, maka FIRST(X) adalah {X}. Jika X ® e suatu produksi, tambahkan e ke FIRST(X) Jika X adalah non-terminal dan X ® Y1Y2…Yk adalah produksi, maka a di dalam FIRST(X) jika untuk beberapa i, a ada di dalam FIRST(Yi) dan e ada di dalam semua FIRST(Y1), …, FIRST(Yi-1). (Y1 … Yi-1 => . Jika e ada di dalam FIRST(Yj) untuk "j = 1, …, k, maka e ada di dalam FIRST(X). Sebagai contoh, " yang ada di FIRST(Y1) selalu ada di FIRST(X). Jika Y1 tidak menderivasi e, maka tidak ada yang ditambahkan lagi ke FIRST(X), tetapi jika Y1 => , maka tambahkan FIRST(Y2) ke FIRST(X), dst.
Perhitungan (2) Untuk membuat FIRST(X1X2…Xn) : Tambahkan semua simbol ¹ e yang ada di FIRST(X1) ke FIRST(X1X2…X3). Jika e ada di FIRST(X1), tambahkan semua simbol yang ¹ e yang ada di FIRST(X2) ke FIRST(X1…Xn). Akhirnya tambahkan e ke FIRST(X1…Xn), jika "i FIRST(Xi) mengandung e). Follow(A), " non-terminal A : Tambahkan $ ke FOLLOW(S), dimana S adalah simbol awal dan $ adalah tanda akhir input. Jika ada produksi A ® aBb, maka semua yang ada di FIRST(b) (kecuali e) dimasukkan ke dalam FOLLOW(B). Jika ada produksi A ® aB, atau produksi A ® aBb, dimana FIRST(b) mengandung e (B ® maka yang di FOLLOW(A) dimasukkan ke FOLLOW(B).
Contoh Perhitungan Contoh : grammar pada 6-1
Pembuatan Tabel Pengurai Prediktif Algoritma 4 : Input : grammar G Output : tabel penguraian M Cara : Untuk masing-masing produksi A ® a dari G, lakukan langkah 2 dan 3. Untuk masing-masing terminal a di FIRST(a), tambahkan A ® a ke M[A,a]. Jika e di FIRST(a), tambahkan A ® a ke M[A,b] untuk " terminal b di dalam FOLLOW(A). Jika e ada di FIRST(a) dan $ ada di dalam FOLLOW(A), tambahkan A ® a ke M[A,$]. Untuk masing-masing entru dari M yang tak terdefinisi, berikan simbol error.
Pembuatan Tabel Pengurai Prediktif (2) Contoh pada grammar yang lalu, karena FIRST(TE’) = FIRST(T) = {(,id}, maka produksi E ® TE’ menyebabkan M[E, (] = M[E, id] = { E ® TE’ }. Produksi E ® +TE’ menyebabkan M[E’,+] = {E->+TE’} karena FOLLOW(E’) = {), $} dan E ® e maka M[E’, $] = M[E’,)] = {E ® e}. Jika G rekursif kiri atau ambiguous maka table M mempunyai paling sedikit satu elemen yang terdefinisi lebih dari sekali. **Contoh: S ® iEtSS’ | a S’ ® eS | e E ® b
Pembuatan Tabel Pengurai Prediktif (3) Entri M[S’,e] memuat definisi S’ ® e dan S’ ® eS. Yang benar M[S’,e] = S’ ® eS sama artinya dengan pengaitan else dengan then terdekat sebelumnya. Definisi : suatu grammar dikatakan LL(1) jika semua entri tabel M-nya tidak terdefinisi lebih dari satu. LL(1) -> L scanning input dari kiri (left) L menghasilkan derivasi leftmost 1 hanya memakai 1 simbol untuk menentukan aksi penguraian
Grammar LL(1) Sifat grammar LL(1) : Grammar G adalah LL(1) jika dan hanya jika untuk setiap dua produksi yang berbeda A ® a|b pernyataan berikut dipenuhi a dan b kedua-duanya tidak akan menderivasi string yang awalnya adalah terminal a. Paling banyak hanya satu dari a dan b dapat menderivasi string kosong. Jika B -> , maka a tidak akan menderivasi string yang awalnya merupakan suatu terminal di FOLLOW(A). Grammar (*) LL(1) sedang (**) bukan.
Tabel Pengurai Prediktif Apa yang harus dilakukan jika suatu tabel penguraian mempunyai entri terdefinisi ganda ? Lakukan transformasi dengan menghilangkan semua rekursi kiri dan lakukan faktorisasi kiri dengan harapan hasilnya mempunyai tabel yang tak terdefinisi ganda ? Apakah akan berhasil proses ini untuk setiap grammar ? Tidak, grammar 4.13 tidak dapat diubah !! Jalan keluar : Untuk statement, gunakan penguraian prediktif Untuk ekspresi, gunakan presedensi operator
Error dalam Penguraian Prediktif Mengatasi error dalam penguraian prediktif Mode panic, melewati simbol-simbol input sampai ditemukan simbol yang termasuk himpunan token penyelaras Beberapa petunjuk : Token penyelaras <- FOLLOW(A), " A non-terminal. Simbol input dilewati (pada saat error) sampai ditemukan elemen dari FOLLOW(A). Lalu pop A. Kadang-kadang (1) tidak cukup, keyword yang memulai suatu statement dapat dilewati. Contoh : Dalam C : a = b; if (a > 0) … puts(“a > 0”); Jadi, masukan keywords sebagai token penyelaras.
Error dalam Penguraian Prediktif (2) Token penyelaras ¬ FIRST(A), A non-terminal. Lewati simbol input sampai ditemukan elemen FIRST(A). Jika non-terminal dapat membentuk string kosong, produksinya yang menderivasi dapat dipakai sebagai default. ® hanya menunda error, tidak dapat menghindari. Jika suatu terminal dalam stack ¹ simbol input. Terminal dapat di-pop, keluarkan pesan “terminal” seharusnya muncul di sini.
Error dalam Penguraian Prediktif (3) Contoh : contoh yang lalu dengan entri synch sebagai himpunan token penyelaras.
Error dalam Penguraian Prediktif (4)
Error dalam Penguraian Prediktif (5) Mode tingkap phrase Entri blank dalam tabel dapat berupa pointer, pointer ini menunjuk pada rutin-rutin error. Rutin ini dapat/bisa mengganti/menyisipkan atau menghapus simbol pada input dan menampilkan pesan error.
Penguraian Bawah-Atas (Bottom-up Parsing) Bentuk umumnya ® penguraian shift-reduksi (shift-reduce parsing). Yang mudah diimplementasikan ® penguraian presedensi operator (operator precedence parsing). Bentuk yang lebih umum ® penguraian LR. Penguraian shift-reduksi bertujuan membentuk suatu pohon urai (parse tree) untuk suatu string input, dimulai dari daun (bawah) lalu ke akarnya (atas). Proses ini dapat dianggap sebagai reduksi string w menjadi simbol awal suatu grammar. Contoh : S ® aABc A ® Abc | b B ® d abbcdc dapat direduksi menjadi S dengan langkah-langkah : abbcdc aAbcdc (pakai A ® b, ganti yang paling kiri) aAdc (pakai A ® Abc, ganti A) aABc (pakai B ® d) S
Penguraian Bawah-Atas (Bottom-up Parsing) (2) Right most derivasinya adalah langkah kebalikan proses tadi : S Þ aABc Þ aAdc Þ aAbcdc Þ abbcdc Pada pereduksian, untuk memilih mana yang harus diganti harus memakai handel. Handel dari suatu bentuk sentensial-kanan g adalah suatu produksi A ® dan suatu posisi dari g dimana string b bisa ditemukan dan diganti oleh A untuk menghasilkan bentuk sentensial-kanan sebelumnya dengan cara derivasi right-most untuk g . Jadi S ® aAw ® aB , maka A ® merupakan handel dari abw. A ® b adalah handel dari abbcdc A ® Abc adalah handel dari aAbcdc Kadang-kadang sisi kanan dari handel tersebut yang lebih sering disebut handel. Reduksi b menjadi A dapat dianggap sebagai “pruning the handle”; menghapus anak dari A dalam proses urai.
Penguraian Bawah-Atas (Bottom-up Parsing) (3) Contoh lagi : (1) E ® E + E (2) E ® E * E (3) E ® ( E ) (4) E ® id Salah satu derivasi right-most untuk id1 + id2 * id3 adalah : E Þ E + E Þ E + E * E Þ E + E * id3 Þ E + id2 * id3 Þ id1 + id2 * id3
Penguraian Bawah-Atas (Bottom-up Parsing) (4) Proses reduksinya : Struktur data/implementasi pengurian shift-reduksi adalah dengan memakai stack untuk menyimpan simbol grammar. Dipakai juga suatu buffer untuk menyimpan string w yang akan diurai. $ sebagai tanda dasar stack dan akhir input. Pada awalnya : stack input $ w$
Penguraian Bawah-Atas (Bottom-up Parsing) (5) Lalu nol atau lebih simbol input dipindahkan (shift) ke stack, sampai suatu handel b berada di puncak stack. Handel lalu direduksi. Proses diulang sampai ditemukan error atau berhasil. stack input $S $ Aksi-aksi dalam pengurian shift-reduksi : Shift, simbol input berikutnya dipindahkan ke puncak stack. Reduksi, parser tahu handel ada di puncak, lalu handel direduksi Accept, proses selesai, tak ada error. Error, error ditemukan. Contoh : id1 + id2 * id3,
Penguraian Bawah-Atas (Bottom-up Parsing) (5)