Chapter 8 Tabel Penguraian LR Kanonik & LALR
Definisi item diperluas sehingga mempunyai dua komponen. Jadi, item mempunyai bentuk [A ., a], dimana: A suatu produksi a adalah terminal atau $ item ini disebut item LR(1). Angka 1 menyatakan panjang komponen ke dua, disebut lookahead suatu item. Item [A . , a] dikatakan valid untuk prefik viabel jika ada derivasi S A dimana: = a adalah simbol pertama dari , atau adalah dan a adalah $.
Contoh : S BB B aB | b karena ada derivasi S aaBab aaaBab maka item [B a .B, a] adalah valid untuk prefik viabel = aaa, dimana = aa, A = B, = ab, = a, dan = B.
Algoritma Pembentukan himpunan-himpunan item LR(1) Input : grammar G’ Output : himpunan-himpunan LR(1), dimana anggotanya valid untuk satu atau lebih prefik viabel dari G’. Metoda : gunakan prosedur items(G’) berikut.
function closure(I) begin repeat for masing-masing item [A . B, a] di dalam I, masing-masing produksi B di dalam G’, dan masing-masing terminal b di dalam FIRST( a) sedemikian rupa sehingga [B . , b] tidak di dalam I do tambahkan [B . , b] ke I until tidak ada item yang dapat ditambahkan ke I. return end;
function goto(I,X); begin misalkan J himpunan item [A X ., a] sedemikian rupa sehingga [A . X, a] di I return closure(J). end
procedure items(G’); begin C := {closure ({s’ .s})}; repeat for masing-masing himpunan item I di C dan masing-masing simbol grammar X sedemikian rupa sehingga goto(I,X) tidak kosong dan tidak di C do tambahkan goto(I,X) ke C until tidak ada himpunan item, yang dapat ditambahkan ke C end
Contoh: S’ S S CC C cC | d mulai dengan closure {[S’ .S, $]}, dengan menyamakan [S’ .S, $] dengan [A . B, a] (pada prosedur closure), kita peroleh A = S’, = , B = S, = , dan a = $. Tambahkan [B ., b] ke closure untuk masing-masing produksi B dan terminal b anggota FIRST(a). Dalam hal ini B adalah S CC, karena = , dan a = $ maka FIRST(a) = FIRST($), dan b = $. Jadi, [S .CC, $] anggota closure. [C ., b], b di FIRST(C$) FIRST(C$) = FIRST(C) = {c,d} Jadi, [C .cC, c], [C .cC, d], [C .d, c], [C .d, d] anggota closure
I0: S’ .S, $ S .CC, $ C .cC, c/d C .d, c/d I1: goto(I0, X), untuk X = S S’ S., $ I2: goto(I0, X), untuk X = C closure {[S C.C, $]}, FIRST($)={$} C . cC, $ C . d, $
I3: goto(I0, X), untuk X = c closure {[C c.C, c/d]}, FIRST(c)={c}, FIRST(d)={d} C c.C, c/d C .cC, c/d C .d, c/d I4: goto(I0, X), untuk X = d closure {[C d., c/d]} C d., c/d I5: goto(I2, C) S CC., $
I6: goto(I2, c) C c.C, $ C .cC, $ C .d, $ I7: goto(I2, d) C d.,$ I8: goto(I3, C) C cC., cd goto(I3, c) = I3 goto(I3, d) = I4 I9: goto(I6, C) C cC., $
Algoritma Pembentukan tabel penguraian LR kanonik Input : G’ Output : fungsi action dan goto dari tabel penguraian LR kanonik
Buat C = {I0, I1, ..., In}, koleksi dari himpunan LR(1) Perhatikan state Ii, aksi untuk state i ditentukan sbb: Jika [A .a, b] di dalam Ii dan goto [Ii, a] = Ij . Jadi action [i,a] = shift j dimana a adalah terminal. Jika [A ., a] di Ii, A S’. Jadi, action [i,a] = reduksi oleh A . Jika [S’ S . , $] di Ii, maka [i, $] = accept. Jika ada konflik gagal. goto untuk state i ditentukan sbb: Jika goto [Ii, A] = Ij , maka goto [i,A] = j, dimana A non Terminal entri yang tak terdefinisi adalah error. state awal adalah state yang dibuat dari himpunan yang mengandung [S’ .S, $]
maka tabel penguraian LR kanoniknya adalah sebagai berikut: STATE action goto c d $ S C s3 s4 1 2 acc s6 s7 5 3 8 4 r3 r1 6 9 7 r2 Contoh: S’ S S CC C cC | d maka tabel penguraian LR kanoniknya adalah sebagai berikut:
Diagram transisi
Algoritma Pembentukan tabel penguraian LALR Input: G’ Output: action dan goto dari G’
Metoda: Bentuk C = {I0, I1, ..., In}, koleksi himpunan item LR(1). Untuk masing-masing core (himpunan komponen pertama dari suatu item) pada himpunan item LR(1), cari semua himpunan yang mempunyai core tersebut, dan ganti dengan unionnya. Misalkan C’ = {J0, J1, ..., Jn} adalah hasil proses (2), action pada state i dibentuk dari Ji dengan memakai algoritma yang lalu. Jika ada konflik, proses gagal. Tabel goto dibuat sbb: Jika J adalah union dari satu atau lebih himpunan item LR(1) (J = I1 I2, ..., Im), maka core dari goto (I1,X), goto (I2, X), ..., goto (Ik, X) adalah sama sebab I1, I2, ..., Ik punya core yang sama. Misalkan K adalah union dari semua himpunan item LR(1) yang corenya sama dengan core dari goto (I1, X), maka goto (J,X) = K.
Contoh: grammar yang lalu dengan himpunan item LR(1)nya. Perhatikan item LR(1) [A ., a] . Himpunan item LR(1) yang komponen pertamanya sama. Contoh: I4 C d., c/d I7 C d., $ I47 = I4 I7 = {C d., c/d/$} I36 = I3 I6 C c.C, c/d/$ C .cC, c/d/$ C .d, c/d/$ I89 = I8 I9 C cC., c/d/$
goto(I3, C) = I8, sedang I8 merupakan bagian dari I89 Pada gambar (*) goto(I3, C) = I8, sedang I8 merupakan bagian dari I89 Jadi, goto(I3, C) = I89 goto(I6, C) = I9 goto(I6, C) = I89 goto(I2, C) = I36 STATE action goto c D $ S C s36 s47 1 2 acc 5 36 89 47 r3 r1 r2