Anda di halaman 1dari 23

1

Chapter 5
Pengurai Prediktif
& Bottom Up Parsing
(penguraian bawah atas)
2
Contoh Penguraian Prediktif Non-
rekursif
3
Contoh pergerakan Penguraian
Prediktif Non-rekursif
4
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).

5
Perhitungan
FIRST(X), "X simbol grammar.
Lakukan langkah berikut sampai tidak ada terminal atau e yang
dapat ditambahkan ke himpunan FIRST.
1. Jika X adalah terminal, maka FIRST(X) adalah {X}.
2. Jika X e suatu produksi, tambahkan e ke FIRST(X)
3. Jika X adalah non-terminal dan X Y
1
Y
2
Y
k
adalah produksi,
maka a di dalam FIRST(X) jika untuk beberapa i, a ada di
dalam FIRST(Y
i
) dan e ada di dalam semua FIRST(Y
1
), ,
FIRST(Y
i-1
). (Y
1
Y
i-1
=> . Jika e ada di dalam FIRST(Y
j
)
untuk "
j
= 1, , k, maka e ada di dalam FIRST(X). Sebagai
contoh, " yang ada di FIRST(Y
1
) selalu ada di FIRST(X). Jika
Y
1
tidak menderivasi e, maka tidak ada yang ditambahkan lagi
ke FIRST(X), tetapi jika Y1 => , maka tambahkan FIRST(Y
2
)
ke FIRST(X), dst.
6
Perhitungan (2)
Untuk membuat FIRST(X
1
X
2
X
n
) :
Tambahkan semua simbol e yang ada di FIRST(X
1
) ke
FIRST(X
1
X
2
X
3
).
Jika e ada di FIRST(X
1
), tambahkan semua simbol yang e
yang ada di FIRST(X
2
) ke FIRST(X
1
X
n
). Akhirnya tambahkan
e ke FIRST(X
1
X
n
), jika "
i
FIRST(X
i
) mengandung e).
Follow(A), " non-terminal A :
1. Tambahkan $ ke FOLLOW(S), dimana S adalah simbol awal
dan $ adalah tanda akhir input.
2. Jika ada produksi A aBb, maka semua yang ada di FIRST(b)
(kecuali e) dimasukkan ke dalam FOLLOW(B).
3. Jika ada produksi A aB, atau produksi A aBb, dimana
FIRST(b) mengandung e (B maka yang di FOLLOW(A)
dimasukkan ke FOLLOW(B).
"
7
Contoh Perhitungan
Contoh : grammar pada 6-1

8
Pembuatan Tabel Pengurai
Prediktif
Algoritma 4 :
Input : grammar G
Output : tabel penguraian M
Cara :
1. Untuk masing-masing produksi A a dari G, lakukan langkah
2 dan 3.
2. Untuk masing-masing terminal a di FIRST(a), tambahkan A
a ke M[A,a].
3. 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,$].
4. Untuk masing-masing entru dari M yang tak terdefinisi,
berikan simbol error.
9
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
10
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
11
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
1. a dan b kedua-duanya tidak akan menderivasi string yang
awalnya adalah terminal a.
2. Paling banyak hanya satu dari a dan b dapat menderivasi string
kosong.
3. Jika B -> , maka a tidak akan menderivasi string yang awalnya
merupakan suatu terminal di FOLLOW(A).
Grammar (*) LL(1) sedang (**) bukan.
12
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 :
1. Untuk statement, gunakan penguraian prediktif
2. Untuk ekspresi, gunakan presedensi operator
13
Error dalam Penguraian Prediktif
Mengatasi error dalam penguraian prediktif
a. Mode panic, melewati simbol-simbol input sampai ditemukan
simbol yang termasuk himpunan token penyelaras
Beberapa petunjuk :
1. Token penyelaras <- FOLLOW(A), " A non-terminal. Simbol
input dilewati (pada saat error) sampai ditemukan elemen
dari FOLLOW(A). Lalu pop A.
2. 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.
14
Error dalam Penguraian Prediktif
(2)
3. Token penyelaras FIRST(A), A non-terminal. Lewati
simbol input sampai ditemukan elemen FIRST(A).
4. Jika non-terminal dapat membentuk string kosong,
produksinya yang menderivasi dapat dipakai sebagai
default. hanya menunda error, tidak dapat menghindari.
5. Jika suatu terminal dalam stack simbol input. Terminal
dapat di-pop, keluarkan pesan terminal seharusnya
muncul di sini.

e
15
Error dalam Penguraian Prediktif
(3)
Contoh : contoh yang lalu dengan entri synch sebagai
himpunan token penyelaras.

16
Error dalam Penguraian Prediktif
(4)
17
Error dalam Penguraian Prediktif
(5)
b. 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.
18
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
19
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 gdimana 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.

b
b
20
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 id
1
+ id
2
* id
3
adalah :
E E + E
E + E * E
E + E * id
3

E + id
2
* id
3

id
1
+ id
2
* id
3


21
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$
22
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 :
1. Shift, simbol input berikutnya dipindahkan ke puncak stack.
2. Reduksi, parser tahu handel ada di puncak, lalu handel
direduksi
3. Accept, proses selesai, tak ada error.
4. Error, error ditemukan.
Contoh : id
1
+ id
2
* id
3,
23
Penguraian Bawah-Atas
(Bottom-up Parsing) (5)

Anda mungkin juga menyukai