Upload presentasi
Presentasi sedang didownload. Silahkan tunggu
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 terminalterminal. 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 βi adalah є atau nonterminal tunggal αi adalah terminal tunggal.
6
Chapter 6: Shift dan Reduksi
Misalkan diantara αi, αi+1 hanya 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: id + * $ Id ·> <·
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. Fungsifungsi 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 Contoh: tabel presedensi yang lalu mempunyai tabel fungsi sbb:
18
Chapter 6: Shift dan Reduksi
Algoritma pembentukan fungsi presedensi Input: matrik presedensi operator. Output: fungsifungsi presedensi yang merepresentasikan matrik input, atau suatu tanda tak ada relasi. Metoda: Buatkan simbol fa dan ga untuk masingmasing terminal a atau $.
19
Chapter 6: Shift dan Reduksi
2. Partisi simbolsimbol tersebut sebanyak mungkin sehingga jika a = b , maka fa dan gb berada pada group yang sama. (anggotaanggota group mungkin saja tidak punya relasi = , contoh jika a = b dan c = b , maka fa dan fc pada 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 gb ke 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 fungsifungsi 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$ dan g$ tak punya sisi yang keluar: f$ = g$ = 0 panjang dari path terpanjang dari gt = 1, g(t) = 1, ada path dari g(id) ke f* 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 1012 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”
Presentasi serupa
© 2024 SlidePlayer.info Inc.
All rights reserved.