1 / 32

Chapter 6: Operator precedence parsing

Chapter 6: Operator precedence parsing. Grammar yang dipakai biasanya grammar operator = tidak mempunyai dua non terminal yang berdampingan pada sisi kanan produksinya, atau grammar yang tak punya є ­produksi. Grammar berikut bukan grammar operator :.

zytka
Download Presentation

Chapter 6: Operator precedence parsing

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chapter 6: Operator precedence parsing Grammar yang dipakai biasanya grammar operator = tidak mempunyai dua non terminal yang berdampingan pada sisi kanan produksinya, atau grammar yang tak punya є­produksi. Grammar berikut bukan grammar operator :

  2. Tetapi, jika A ditulis sebagai alternatifnya, maka diperoleh grammar operator: E → E+E | E-E | E*E | E/E | E↑E | (E) | -E | id (*) Keburukan penguraian presedensi operator : • Sulit mengatasi tanda minus yang mempunyai 2 presedensi yang berbeda • Hanya sedikit grammar yang dapat diurai • User tidak yakin bahwa parser menerima bahasa yang diinginkan

  3. Chapter 6: Shift dan Reduksi Beberapa compiler memakai presedensi operator untuk ekspresi, ada juga beberapa yang memakainya untuk seluruh bagian bahasa. Dalam penguraian ini, relasi presedensi <., =, .> didefinisikan, dan diletakkan diantara terminal­terminal. Relasi ini membantu pemilihan handel a memberikan presedensi pada b (b mempunyai presedensi lebih tinggi dari a) a = b a mempunyai presedensi sama dengan b a mengambil presedensi b (a mempunyai presedensi lebih tinggi dari b)

  4. Chapter 6: Shift dan Reduksi Untuk sepasang terminal a, b: a rel b, dimana rel salah satu relasi, bahkan mungkin juga a dan b tidak mempunyai relasi. Menentukan presedensi: • Berdasarkan tradisi asosiatifitas dan presedensi dari operator. Contoh : dan • Grammarnya dibuat tidak ambiguous, gunakan metoda pembentukan presedensi untuk grammar ybs. [Aho & Ullman, 1972b]

  5. Chapter 6: Shift dan Reduksi Pemakaian relasi presedensi operator Sebagai pembatas handel, < · menandai sisi kiri handel, = muncul di tengah handel, dan · > membatasi sisi kanan handel. Karena tidak ada nonterminal yang berdampingan, bentuk sentensial kanan dapat ditulis sebagai: β0α1 β1… αn βn βiadalah єatau nonterminal tunggal αi adalah terminal tunggal.

  6. Chapter 6: Shift dan Reduksi Misalkan diantara αi, αi+1hanya ada satu relasi. $ dipakai sebagai akhir string, definisikan $< ·b dan b·> $ untuk terminal b. Misalkan nonterminal telah diganti oleh terminal dan letakkan < ·, = , · > diantara 2 terminal, dan diantara terminal paling kanan dan $. (**)Contoh: bentuk sentensial kanannya = id+id id dan relasi presedensi:

  7. Chapter 6: Shift dan Reduksi String dan relasi presedensinya dapat ditulis sebagai: $ < id > + < id > * < id > $ untuk mendapatkan handel: • Lihat string dari akhir kiri ke kanan sampai ditemukan ·> yang pertama. • Lihat string ke kiri melewati = sampai <· ditemukan. • Handelnya adalah semua yang di kiri ·> (yang pertama) dan di sebelah kanan <·.

  8. Chapter 6: Shift dan Reduksi Pada contoh handel yang pertama adalah id, setelah proses dilanjutkan diperoleh E+E*E, hapus nonterminalnya dan perhatikan $+*$ dengan memakai relasi presedensi diperoleh: Jadi, sisi kiri handel ada diantara + dan *, dan sisi kanannya antara * dan $. Handelnya E*E.

  9. Chapter 6: Shift dan Reduksi Algoritma penguraian presedensi operator Input : string input w dan tabel relasi presedensi. Output : Jika w L(G), maka kerangka pohon urai dengan E sebagai label node interior, jika tidak maka error. Pada awalnya stack memuat $ dan buffer input memuat w$. • ip menunjuk pada simbol pertama dari w$. • repeat forever • if $ di puncak stack dan ip menunjuk $ then • return

  10. Chapter 6: Shift dan Reduksi • else begin misalkan a adalah simbol terminal yang paling atas pada stack dan b simbol yang ditunjuk ip; • if a < · b atau a = b then • { push b ke dalam stack • ip menunjuk pada simbol input berikutnya } • else if a · > b then /*reduksi*/ • { repeat

  11. Chapter 6: Shift dan Reduksi • pop stack • until terminal pada puncak stack punya relasi <· dengan terminal yang baru saja dipop } (13) else error() end. Apakah algoritma ini sudah lengkap?

  12. Chapter 6: Shift dan Reduksi Pembentukan relasi presedensi operator berdasarkan asosiatifitas dan presedensi grammar (*) • Jika operator θ1 punya presedensi yang lebih tinggi dari operator θ2 , tentukan θ1·>θ2 dan θ2 <·θ1 . (Contoh * · > + dan + < · *). • Jika θ1 dan θ2 punya presedensi yang sama (bila θ1 = θ2), tentukan θ1 ·> θ2 dan θ2 ·> θ1 (jika operator ini asosiatif kiri) atau θ1 <· θ2 dan θ2 <· θ1 (jika operator ini asosiatif kanan). (Contoh: jika + dan – asosiatif kiri, + ·> +, + ·> -, - ·> -, - ·> +)

  13. Chapter 6: Shift dan Reduksi 3. θ <· id, id ·> θ, θ <·(, (<· θ, θ·> $, $ <· θuntuk semua operator θ, dan juga: ( = ) $ <· ( $ <· id (<· ( id ·> $ ) ·> $ (<· id id ·> ) ) ·> ) Contoh: dengan memisalkan • ↑ punya presedensi tertinggi dan asosiatif kiri • * dan / yang tertinggi berikutnya dan asosiatif kiri • + dan – berpresedensi terendah dan asosiatif kiri

  14. Chapter 6: Shift dan Reduksi maka tabelnya: (TAMBAH PANGKAT)

  15. Chapter 6: Shift dan Reduksi Mengatasi operator unari: 1. Operator unari ¬ (negasi logik) Tentukan θ<·¬untuk sembarang operator θdan ¬ .> θ jika ¬ punya presedensi lebih tinggi dari dari θ dan ¬ <. Θ jika tidak. Contoh: Jika ¬ lebih tinggi dari &, dan & asosiatif kiri, E&¬E&E ditulis sebagai (E&(¬E)&E) 2. Unari minus, tidak bisa diatasi dengan cara 1. Sulit mengatasi hal seperti . Cara terbaik, pakai penganalisa leksikal untuk membedakan unary minus dan binari minus, dengan memberikan token yang berbeda. Penganalisa ini harus mengingat simbol sebelumnya.

  16. Chapter 6: Shift dan Reduksi Contoh: dalam Fortran — adalah unari jika didahului oleh token operator, kurung buka, koma, atau simbol assignment. Fungsi­fungsi presedensi Tabel relasi presedensi tidak perlu dipakai secara langsung, dipakai tabel fungsi. Tabel ini dalam dua fungsi f dan g yang memetakan simbol terminal ke integer.

  17. Chapter 6: Shift dan Reduksi Pilih f dan g sedemikian rupa sehingga a dan b: • jika • jika a = b • jika Contoh: tabel presedensi yang lalu mempunyai tabel fungsi sbb:

  18. Chapter 6: Shift dan Reduksi Algoritma pembentukan fungsi presedensi Input: matrik presedensi operator. Output: fungsi­fungsi presedensi yang merepresentasikan matrik input, atau suatu tanda tak ada relasi. Metoda: • Buatkan simbol fa dan ga untuk masing­masing terminal a atau $.

  19. Chapter 6: Shift dan Reduksi 2. Partisi simbol­simbol tersebut sebanyak mungkin sehingga jika a = b , maka fadan gbberada pada group yang sama. (anggota­anggota group mungkin saja tidak punya relasi = , contoh jika a = b dan c = b , maka fadan fcpada group yang sama, meskipun a dan c mungkin tidak punya relasi). 3. Buat suatu graph berarah yang nodenya adalah group-group pada (2). jika buatkan suatu sisi (edge) dari group gbke group fa. Jika , buat suatu sisi dari group f(a) ke g(b).

  20. Chapter 6: Shift dan Reduksi 4. Jika graf yang terbentuk mengandung siklus, maka tak ada fungsi­fungsi presedensi. Jika tidak ada siklus, f(a) adalah path terpanjang yang awalnya pada group dari f(a), g(a) adalah path terpanjang yang awalnya pada group dari ga.

  21. Chapter 6: Shift dan Reduksi Tabel relasi (**) mempunyai graf: f$ dang$ tak punya sisi yang keluar: f$ = g$ = 0 panjang dari path terpanjang dari gt= 1, g(t) = 1, ada path dari g(id) kef* ke g* ke f+ ke g+ke f$.Jadi g(id) = 5

  22. Chapter 6: Shift dan Reduksi Fungsi-fungsi presedensinya adalah:

  23. Chapter 6: Shift dan Reduksi Mengatasi error: Sintak error terjadi pada kasus-kasus: • Tidak ada relasi presedensi antara terminal pada puncak stack dengan simbol input. (Tidak bisa dideteksi kalau memakai fungsi presedensi). • Handel ditemukan (diapit antara < dan >), tetapi tidak ada produksi yang sisi kanannya adalah handel ini.

  24. Chapter 6: Shift dan Reduksi Kasus(2), karena tidak bisa melakukan reduksi, yang baik adalah menampilkan pesan error. Jenis kesalahan/pesan tergantung pada handel yang ditemukan pada sisi kanan yang ada. Misalkan abc adalah handel yang ditemukan, tetapi tidak ada sisi kanan produksi yang mengandung a,b atau c, maka bisa dilakukan penghapusan a,b atau c. Contoh : jika ada sisi kanan aEcE, maka tampilkan: 'illegal b on line (line containing b) di sini bisa dilakukan perubahan atau penyisipan terminal, tetapi bagaimana?

  25. Chapter 6: Shift dan Reduksi Jika ada sisi kanan abEdc, bisa ditampilkan: missing d on line (line containing c) atau jika ada sisi kanan aEbc, tampilkan: missing E on line (line containing b) Secara umum, pesan error yang ditampilkan tergantung pada apakah ada sejumlah hingga atau tak hingga string yang dapat dipop (pada baris 10­12 algoritma).

  26. Chapter 6: Shift dan Reduksi Dikatakan sejumlah hingga, jika tabel presedensi mempunyai sejumlah hingga terminal yang dihubungkan oleh relasi = , (path dari terminal awal ke terminal akhir tak punya siklus), jika punya siklus → tak hingga. Suatu string b1… bk dapat dipop jika ada simbol a dalam stack (mungkin $) sedemikian rupa sehingga a <·b, dan ada simbol c sedemikian rupa sehingga bk ·> c (b1 disebut terminal awal, bk terminal akhir)

  27. Chapter 6: Shift dan Reduksi Contoh: untuk grammar E  E+E | E-E | E*E | E/E | E↑E | (E) | -E | id, graf matrik presedensinya adalah: Hanya ada satu sisi (→), karena hanya (dan) yang dihubungkan oleh = . Panjang path untuk +,-,*,/, ↑,id adalah 1, sedang (→) adalah 2. Jadi, tidak ada siklus.

  28. Chapter 6: Shift dan Reduksi Karena panjang pathnya adalah 1 dan 2, pemeriksa error akan melakukan: 1. Jika +,-,*,/ atau ↑ direduksi, akan diperiksa bahwa nonterminal harus ada pada dua sisinya. Kalau tidak ada, maka ditampilkan pesan : missing operand 2. Jika id direduksi, akan diperiksa bahwa harus tidak ada nonterminal di salah satu sisinya, kalau ada, ditampilkan pesan : missing operator

  29. Chapter 6: Shift dan Reduksi 3. Jika ( ) direduksi, harus dipastikan bahwa ada nonterminal diantara tanda kurung itu. Kalau tidak, maka ditampilkan : no expression between parantheses Jika banyaknya string yang dapat dipop tak hingga, tak dapat dilakukan cara seperti di atas. Hanya bisa dibandingkan string tersebut dengan sisi kanan (yang mirip) dari suatu produksi, lalu ditampilkan pesan bahwa produksi itu yang diinginkan. Kalau tidak ada produksi yang mirip, maka bisa ditampilkan pesan bahwa ada sesuatu yang tidak benar dalam baris yang bersangkutan.

  30. Chapter 6: Shift dan Reduksi Kasus (1), tidak ada relasi, (konflik shift/reduksi). (terjadi pada baris 6 dan 9 algoritma). Jalan keluar → ubah stack atau input atau keduanya. Contoh : - pada stack ada a,b pada input ada cd, dimana a ≤·c maka b dapat dipop - jika b≤·d maka c harus dihapus Secara umum, entri kosong pada matrik presedensinya, diisi dengan rutin untuk mengatasi error yang bersangkutan.

  31. Chapter 6: Shift dan Reduksi Contoh (dari (*)): e1: {dipanggil sewaktu tidak ada ekspresi} sisipkan id ke dalam input tampilkan pesan: “operand hilang”

  32. Chapter 6: Shift dan Reduksi e2: {dipanggil sewaktu ekspresi dimulai dengan (} hapus ) pada input tampilkan pesan: “kurung tutup tak seimbang” e3: {dipanggil sewaktu id atau ) diikuti oleh id atau (} sisipkan + pada input tampilkan pesan: “operator hilang” e4: {dipanggil sewaktu ekspresi diakhir oleh kurung buka} pop ( dari stack tampilkan pesan: “kurung tutup hilang”

More Related