Bab 5 Grammar Bebas Konteks

download Bab 5 Grammar Bebas Konteks

of 27

Transcript of Bab 5 Grammar Bebas Konteks

BAB V GRAMMAR BEBAS KONTEKS Pendahuluan Dalam bagian ini akan dibahas kelas yang lebih besar dari bahasa regular yaitu bahasa yang memiliki notasi rekursif yang dinamakan grammar bebas konteks (Context Free Grammar, CFG). CFG memiliki peranan penting dalam teknologi kompilator sejak tahun 1960-an. Baru-baru ini, CFG telah digunakan untuk menjelaskan format dokumen, menggunakan apa yang dinamakan document-type definition (DTD) yang digunakan dalam komunitas XML (extensible markup language) untuk pertukaran informasi pada web. Bab ini membahas materi tentang definisi dari CFG, penurunan string menggunakan CFG, bahasa dari CFG, parse tree, grammar yang ambigu dan aplikasi dari CFG. Setelah mempelajari bab ini, mahasiswa akan dapat menjelaskan gambaran umum CFG, melakukan penurunan string menggunakan CFG, membuat parse tree dari sebuah string, menentukan apakah sebuah CFG adalah ambigu atau tidak, menghilangkan ambiguitas dari grammar serta mengetahui aplikasi dari CFG, khususnya markup language: HTML dan XML. Penyajian Grammar merupakan alat untuk menjelaskan dan menganalisis bahasa. Sebagai contoh, misal = {0,1}. Bahasa Lpal dari polindrom-polindrom pada didefinisikan secara rekursif sebagai berikut: Basis: , 0, 1 adalah polindrom. Induksi : Jika w adalah sebuah polindrom, begitu juga 0w0 dan 1w1. Tidak ada string lain dalam Lpal selain string yang diperoleh dari basis dan induksi. CFG adalah sebuah notasi formal untuk menyatakan definisi rekursif dari bahasa. Sebuah grammar terdiri dari satu atau lebih variabel yang merupakan kelaskelas dari string yaitu bahasa. Dalam contoh bahasa Lpal, terdapat hanya satu variabel p yang menyatakan himpunan dari polindrom-polindrom yaitu kelas-kelas dari string-string yang membentuk bahasa Lpal. Terdapat aturan-aturan yang menyatakan bagaimana string dalam setiap kelas dikonstruksi. Konstruksi dapat menggunakan simbol-simbol dari alphabet, string yang diketahui ada dalam satu kelas tertentu atau keduanya. Contoh 5.1: CFG untuk polindrom adalah 1. 2. 3. 4. 5. P P0 P1 P 0P0 P 1P1

72

5.1 Definisi CFG Komponen-komponen dalam deskripsi gramatikal dari sebuah bahasa adalah sebagai berikut: 1. Terdapat sebuah himpunan berhingga dari simbol yang membentuk string dari bahasa yang didefinisikan. Alphabet ini dinamakan terminal-terminal atau simbol-simbol terminal. Dalam Contoh 5.1, simbol terminal adalah 0 dan 1. 2. Terdapat sebuah himpunan berhingga dari variabel-variabel. Variabel-variabel tersebut dinamakan nonterminal atau kategori syntactic. Setiap variabel menyatakan sebuah bahasa yaitu sebuah himpunan dari string. Dalam Contoh 5.1, hanya terdapat 1 variabel, yaitu P, yang menyatakan kelas dari polindrompolindrom pada alphabet {0,1}. 3. Salah satu dari variabel-variabel menyatakan bahasa yang sedang didefinisikan. Variabel tersebut dinamakan start symbol. Variabel-variabel lain menyatakan kelas-kelas pembantu dari string-string yang digunakan untuk mendefinisikan bahasa dari start symbol. Dalam Contoh 5.1, hanya terdapat 1 variabel, yaitu P, yang dinamakan start symbol. 4. Terdapat sebuah himpunan berhingga dari produksi-produksi atau aturan-aturan yang menyatakan definisi rekursif dari sebuah bahasa. Setiap produkasi terdiri dari: 1. Sebuah variabel yang didefinisikan (secara parsial) oleh produksi. Variabel ini sering kali dinamakan head dari produksi. 2. Simbol produksi 3. Sebuah string dari nol atau lebih terminal dan variabel. String ini dinamakan body dari produksi, yang menyatakan salah satu cara untuk membentuk string dalam bahasa dari variabel dari head. Terminal-terminal tidak diubah dan setiap variabel dari body disubstitusi dengan string yang diketahui dalam bahasa dari variabel tersebut. Dalam Contoh 5.1 terdapat 5 produksi. Keempat komponen yang baru saja dijelaskan membentuk sebuah CFG atau hanya grammar, notasinya adalah G = (V, T, P, S), dengan V : Himpunan variabel-variabel T : Terminal P : Himpunan produksi S : Start symbol. Contoh 5.2: Grammar Gpal untuk polindrom-polindrom dinyatakan oleh Gpal = ({P}, {0,1}, A, P) dengan A adalah himpunan dari 5 produksi seperti dalam Contoh 5.1. Contoh 5.3: Sebuah CFG menyatakan ekspresi dalam bahasa pemrograman. Ekspresi dibatasi hanya mengandung operator + dan (penjumlahan dan perkalian). Argumen juga

73

dapat berupa identifier yang dibatasi hanya untuk huruf a dan b, dan digit 0 dan 1. Setiap identifier haruslah diawali dengan a atau b dan dapat diikuti oleh string dalam {a, b, 0, 1}*. Terdapat dua variabel dalam grammar ini yaitu: E menyatakan ekspresi yang juga merupakan start symbol dan merepresentasikan bahasa dari ekspresi yang didefinisikan. I menyatakan identifier. CFG yang dimaksud memiliki produksi-produksi berikut 1. E I 2. E E + E 3. E E*E 4. E (E) 5. I a 6. I b 7. I Ia 8. I Ib 9. I I0 10. I I1 Secara formal CFG yang dimaksud adalah G = ({E,I}, T, P, E) dimana T adalah himpunan simbol-simbol {+, *, (, ), a, b, 0, 1} dan P adalah himpunan produksiproduksi. Produksi-produksi A 1, A 2 , A 3 ,..., A n dapat digantikandengan notasi A 1 2 n . Dalam Contoh 5.1, grammar untuk polindrom dapat ... ditulis sebagai P | 0 | 1 | 0P0 | 1P1.

5.2 Penurunan Menggunakan Sebuah Grammar

Produksi-produksi dari sebuah CFG dapat digunakan untuk menyimpulkan bahwa string-string tertentu dalam bahasa dari sebuah variabel. Terdapat 2 pendekatan untuk inferensi tersebut, yaitu 1. Inferensi rekursif, menggunakan aturan dari body ke head: Ambil string-string yang diketahui ada dalam bahasa dari setiap variabel dari body. Rangkai string-string tersebut, dalam urutan yang sesuai, dengan terminalterminal muncul dalam body. Simpulkan bahwa string yang dihasilkan adalah dalam bahasa dari variabel pada head. 2. Derivation, menggunakan aturan dari head ke body: Perluas start symbol menggunakan salah satu produksinya (yaitu gunakan salah satu produksi yang memiliki head adalah start symbol).

74

Perluas string yang dihasilkan dengan mengganti salah satu dari variabel dengan body dari salah satu produksi-produksinya, dan seterusnya sampai diperoleh sebuah string yang mengandung terminal-terminal saja. Bahasa dari grammar adalah semua string-string dari terminal-terminal yang dapat diperoleh dengan cara ini. Contoh 5.4: Inferensi rekursif Tabel berikut menyatakan proses inferensi menggunakan grammar pada Contoh 5.3: Baris (i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix)String yang diperoleh a b b0 b00 a b00 a + b00 (a + b00) a*(a + b00)

Untuk Bahasa dari I I I I E E E E E

Produksi yang digunakan 5 6 9 9 1 1 2 4 3

String-string yang digunakan (ii) (iii) (i) (iv) (v), (vi) (vii) (v), (viii)

Proses penurunan string dengan menggunakan produksi-produksi dari head ke body memerlukan definisi dari simbol relasi baru yaitu . Anggap G = (V,T,P,S) adalah sebuah CFG. Misalkan A adalah sebuah string dari terminal-terminal dan variabel-variabel dengan A adalah sebuah variabel. Bahwa dan adalah string dalam (VT), dan A V. Misalkan A adalah sebuah produksi dari G. Maka kita katakan A . Jika G dimengerti, kita hanya mengatakan A .G

Perhatikan bahwa satu langkah derivation mengganti suatu variabel dalam string dengan body dari salah satu produksinya. Kita dapat memperluas hubungan untuk menyatakan 0, 1 atau banyak langkah penurunan. Notasi * menyatakan 0 atau banyak langkah dengan definisi sebagai berikutBasis:

Untuk suatu string dari terminal-terminal dan variabel-variabel kita katakan

, artinya suatu string menurunkan dirinya sendiri.G

Induksi:

Jika dan , maka . Bahwa jika dapat menjadi dengan 0 atauG G G

lebih langkah, dan satu langkah lagi mengambil ke , maka dapat menjadi . Dalam pernyataan lain, notasi berarti bahwa terdapat serangkaian stringstring 1, 2 ,..., n untuk n 1 sedemikian sehinggaG

75

1. = 1 2. = n 3. Untuk i = 1, 2, ... , n1, diperoleh i i + 1 . Jika grammar G dimengerti, digunakan untuk menggantikan .G

Contoh 5.5: Tunjukkan bahwa a*(a+b00) adalah dalam bahasa dari variabel E pada Contoh 5.3. Berikut adalah salah satu penurunan tersebut : E E*E I*E a*E a*(E) a*(E+E) a*(I+E) a*(a+E) a*(a+I) a*(a+I0) a*(a+I00) a*(a+b00) Kita dapat menggunakan hubungan untuk menyingkat penurunan. Dari basis diperoleh E E. Penggunaan berulang bagian induksi menghasilkan E E*E E I*E dan seterusnya sampai diperoleh E a*(a+b00).** *

*

Dengan menggunakan inferensi rekursif dan penurunan, sebuah string dari terminal w disimpulkan ada dalam bahasa dari suatu variabel A jika dan hanya jika A w.Leftmost dan Rightmost Derivation*

Sebagai cara untuk membatasi banyaknya pilihan dalam penurunan sebuah string, seringkali berguna untuk menginginkan bahwa pada setiap langkah kita mengganti leftmost variable dengan salah satu dari body-body produksinya. Penurunan demikian dinamakan leftmost derivation. Notasi relasi dalam penurunan demikian adalah untuk satu langkah dan untuk banyak langkah. Secara samalm

lm

kita menginginkan bahwa setiap langkah, rightmost variable diganti oleh salah satu dari body-nya. Penurunan demikian dinamakan righmost derivation. Notasi relasi dalam penurunan demikian adalah untuk satu langkah dan untuk banyakrm rm

langkah. Contoh 5.6: Penurunan dari Contoh 5.5 merupakan leftmost derivation

76

E E*E I*E a*E a*(E) a*(E+E) a*(I+E) a*(a+E) lm lm lm lm lm lm lm lm

a*(a+I) a*(a+I0) a*(a+I00) a*(a+b00)lm lm lm

Secara singkat dapat dinyatakan E a*(a+b00).lm

Contoh lain dari ekspresi untuk beberapa langkah adalah E*E a*(E). Sedangkanlm

rightmost derivation a*(a+b00) adalah

E E*E E*(E) E*(E+E) E*(E+I) E*(E+I0) E*(E+I00)rm rm rm rm rm rm

E*(E+b00) E*(I+b00) E*(a+b00) I*(a+b00) a*(a+b00)rm rm rm rm rm

Secara singkat dapat dinyatakan E a*(a+b00).rm

Baik menggunakan leftmost atau rightmost derivation, jika w adalah terminalstring dan A adalah variabel maka A w jika dan hanya jika A w dan A wlm * *

jika dan hanya jika A w.rm

5.3 Bahasa dari Sebuah Grammar

Jika G = (V,T,P,S) adalah sebuah CFG, bahasa dari G dinotasikan L(G) adalah himpunan dari string-string terminal yang memiliki penurunan dari start symbol. Bahwa L(G) = w dalam TS w . G

Jika sebuah bahasa L adalah bahasa dari CFG, maka L dikatakan CFL (Context Free Language). Sebagai contoh, himpunan dari polindrom-polindrom adalah CFL (Bukti dapat dilihat pada buku rujukan).5.4 Bentuk-Bentuk Sentential

Penurunan dari start symbol menghasilkan string-string yang memiliki aturan khusus. Aturan khusus tersebut dinamakan bentuk-bentuk sentential. Bahwa, jika G = (V,T,P,S) adalah sebuah CFG, maka string dalam (VT)* sedemikian sehingga s adalah bentuk sentential. Jika s maka adalah bentuk leftlm

*

sentential. Jika s maka adalah bentuk right sentential. Perhatikan bahwarm

77

bahasa L(G) adalah bentuk-bentuk sentential yang ada dalam T*; yaitu hanya terdiri dari terminal. Contoh 5.7: Perhatikan Grammar untuk ekspresi dalam Contoh 5.3. Sebagai contoh, E*(I+E) adalah sebuah bentuk sentential karena terdapat sebuah penurunan E E*E E*(E) E*(E+E) E*(I+E) Contoh bentuk left sentential adalah a*E, karena terdapat penurunan berikut E E*E I*E a*Elm lm lm

Contoh bentuk right sentential adalah E*(E+E), karena terdapat penuruan berikut E E*E E*(E) E*(E+E)rm rm rm

5.5 Parse Tree Tree, dikenal sebagai parse tree ketika digunakan dalam sebuah kompilator, merupakan struktur data untuk merepresentasikan source program. Dalam sebuah kompilator, struktur terdiri dari source program memfasilitasi translasi dari source program ke dalam executable code. Eksistensi dari parse tree terkait erat dengan eksistensi dari penurunan dan inferensi rekursif. Parse tree dikonstruksi sebagai berikut, misal Grammar G = (V,T,P,S). Parse tree untuk G adalah tree dengan kondisi-kondisi berikut:

1. Setiap node interior diberi label sebuah variabel dalam V. 2. Setiap daun/leaf diberi label oleh sebuah variabel, sebuah terminal atau . Jika leaf diberi label , maka leaf tersebut haruslah merupakan anak satu-satunya dari parent-nya. 3. Jika sebuah node interior diberi label A, dan anak-anaknya diberi label berturutturut X1, X2,..., Xk dari kiri, maka A X1, X2,..., Xk adalah produksi dalam P. Satu-satunya perkalian dari para X dapat menjadi adalah jika perkalian tersebut merupakan label dari satu-satunya anak (child), dan A adalah produksi dari G. Contoh 5.8:Parse tree berikut menujukkan penurunan I+E dari E. Root diberi label variabel E.

Produksi yang digunakan pada root adalah E E+E karena terdapat 3 anak dari root yang berturut-turut mempunyai label E, + dan E dari kiri. Pada anak paling kiri dari root, produksi E I digunakan, karena terdapat satu anak dari node tersebut, diberi label I.

78

Contoh 5.9:Parse tree berikut adalah parse tree untuk grammar palindrom.

Hasil dari Sebuah Parse Tree

Jika kita lihat leaf-leaf dari parse tree dan merangkainya dari kiri, akan diperoleh sebuah string, yang dinamakan hasil dari tree. String-string tersebut diturunkan dari variabel root. Hal-hal yang harus diperhatikan berkaitan dengan hasil dari sebuah parse tree adalah 1. Hasil adalah sebuah string terminal. Bahwa, semua leaf diberi label sebuah terminal atau . 2. Root diberi label oleh start symbol.Tree dengan ketentuan di atas adalah parse tree yang memiliki hasil adalah string-string dalam bahasa dari grammar tertentu. Dapat dinyatakan pula bahwa bahasa dari sebuah grammar adalah himpunan dari hasil-hasil dari parse tree yang memiliki start symbol pada root dan sebuah string terminal sebagai hasil.

Contoh 5.10:Parse tree yang menujukkan bahwa a*(a+b00) adalah dalam bahasa dari grammar dalam Contoh 5.3:

79

E

E I a

*

E

(

E

)

E I a

+

E I

I

0

I b

0

5.6 Inferensi, Penurunan dan Parse Tree

Diberikan sebuah grammar G = (V,T,P,S), pernyataan-pernyataan berikut adalah ekuivalen: 1. Prosedur inferensi rekursif menentukan bahwa string terminal w adalah dalam bahasa dari variabel A. 2. A w 3. A w 4. A wrm lm *

5. Terdapat sebuah pohon penurunan dengan root A dan hasil w. Gambar berikut menunjukkan skema pembuktian ekuivalensi pernyataanpernyataan tentang grammar.

80

Gambar 5.1 Skema pembuktian ekuivalensi pernyataanpernyataan tentang grammar Contoh pernyataan-pernyataan yang ekuivalen adalah jika w disimpulkan berada dalam bahasa dari A dengan inferensi rekursif, maka terdapat sebuah pohon penurunan dengan root A dan hasil w.Dari Inferensi ke Tree

Teorema 5.1: Misal G = (V,T,P,S) adalah sebuah CFG. Jika prosedur inferensi rekursif menyatakan bahwa string terminal w adalah dalam bahasa dari variabel A, maka terdapat sebuah pohon penurunan dengan root A dan hasil w. Bukti: Bukti adalah sebuah induksi pada banyaknya langkah-langkah yang digunakan untuk menentukan bahwa w adalah dalam bahasa A.Basis:

Basis dari prosedur inferensi adalah produksi Aw. Tree berikut dimana terdapat satu leaf untuk setiap posisi dari w

memenuhi kondisi-kondisi yang menjadi sebuah parse tree untuk grammar G. Tree tersebut memiliki hasil w dan root A. Dalam kasus khusus, w = , tree memiliki leaf tunggal yang diberi label dan tree adalah tree parse tunggal dengan root A dan hasil w.Induksi:

Anggap bahwa fakta bahwa w adalah dalam bahasa dari A disimpulkan setelah n+1 langkah inferensi dan bahwa pernyataan dari teorema dipenuhi untuk semua stringstring x dan variabel-variabel B sedemikian sehingga keanggotaan dari x dalam bahasa dari B disimpulkan menggunakan n atau lebih sedikit langkah inferensi. Perhatikan langkah terakhir dari inferensi menunjukkan bahwa w adalah dalam bahasa A. Inferensi ini menggunakan produksi untuk A, katakanlah A X1, X2,..., Xk, dimana setiap Xi adalah variabel atau terminal. Misal w = w1, w2,..., wk, dimana

81

1. Jika Xi adalah sebuah terminal, maka wi = Xi; yaitu wi terdiri dari hanya satu terminal produksi. 2. Jika Xi adalah sebuah variabel, maka wi adalah sebuah string yang sebelumnya disimpulkan ada dalam bahasa. Bahwa inferensi tentang wi ini mengambil semua langkah (n+1 langkah), karena langkah terakhir, menggunakan produksi A X1, X2,..., Xk, bukan bagian dari inferensi wi. Akibatnya, kita dapat menggunakan hipotesis induktif untuk wi dan Xi, dan menyimpulkan bahwa terdapat sebuah parse tree dengan hasil wi dan root Xi. Selanjutnya, kita dapat mengkonstruksi sebuah tree dengan root A dan hasil w seperti disarankan dalam gambar sebagai berikut:

x1 w1

x2

...

xk

w2

wk

Tree ini valid karena A X1, X2,..., Xk adalah sebuah produksi dari G. Node untuk setiap Xi dibuat root dari sebuah subtree dengan hasil wi. Dalam kasus (1), dimana Xi adalah sebuah terminal. Subtree ini adalah tree trivial dengan sebuah node yang diberi label Xi. Bahwa setiap subtree hanya terdiri dari anak Xi. Karena wi = Xi dalam kasus (1), kita menjumpai kondisi bahwa subtree adalah wi.

Dalam kasus (2), Xi adalah sebuah variabel. Maka dengan menggunakan hipotesis induktif dinyatakan bahwa terdapat beberapa tree dengan root Xi dan hasil wi. Tree ini ditempelkan ke node untuk Xi. Tree juga memiliki root A, hasilnya adalah hasil dari substree dirangkai dari kiri ke kanan. String tersebut adalah w = w1, w2,..., wk.Dari Tree ke Penurunan

Dari parse tree, kita dapat mengkonstruksi leftmost derivation atau rightmost derivation. Untuk memahami bagaimana penurunan dikonstruksi, pertama perlu dilihat bagaimana satu penurunan dari string dari sebuah variabel dapat dilekatkan dalam penurunan yang lain. Contoh 5.11: Perhatikan kembali grammar pada Contoh 5.3. Dalam contoh tersebut terdapat penurunan E I Ib ab sebagai sebuah hasil. Untuk string-string dan , adalah benar bahwa E I Ib ab artinya bahwa kita dapat membuat perubahan tubuh produksi yang sama untuk headhead dalam konteks dari dan . Sebagai contoh, jika kita mempunyai sebuah penurunan yang bermula E E+E E + (E) kita dapat mengaplikasikan penurunan ab dari E yang kedua dengan menyatakan E+( sebagai dan ) sebagai . Penurunan dilanjutkan sehingga diperoleh

82

E + (E) E + (I) E + (Ib) E + (ab)

Teorema 5.2: Misal G = (V,T,P,S) adalah sebuah CFG, dan anggap terdapat sebuah pohon penurunan dengan root diberi label oleh variabel A dan dengan hasil w, dimana w adalah dalam T*. Maka terdapat sebuah leftmost derivation A w dalam grammarlm

G. Bukti: Induksi pada tinggi dari tree.Basis:

Basis adalah tinggi tree = 1, bahwa sebuah parse tree dengan sebuah hasil dari terminal. Tree tersebut digambarkan sebagai berikut

Karena tree ini adalah parse tree, Aw haruslah merupakan sebuah produksi. Dengan demikian, A w terdiri dari satu langkah, dan merupakan leftmostlm

derivation dari w dari A. Induksi:

Jika tinggi dari tree adalah n, n 1 . Tree tersebut digambarkan sebagai berikut

x1 w1

x2

...

xk

w2

wk

Dari tree tersebut dinyatakan 1. Jika Xi adalah sebuah terminal, definisikan wi menjadi string yang terdiri dari Xi. 2. Jika Xi adalah sebuah variabel, maka Xi adalah root dari subtree dengan sebuah hasil yaitu terminal, yang dinamakan wi. Dalam kasus ini, tinggi dari subtree lebih kecil dari n, sehingga hipotesis induksi digunakan terhadap subtree tersebut. Bahwa terdapat leftmost derivation Xi wilm

Perhatikan bahwa w = w1, w2,..., wk. Kita mengkonstruksi leftmost derivation dari w sebagai berikut:

83

Mulai dengan langkah : A X1, X2,..., Xklm

Selanjutnya, untuk setiap i =1,2,...,k, kita tunjukkan bahwa A w1w2...wi Xi+1Xi+2...Xklm

Pernyataan tersebut dibuktikan menggunakan induksi pada i melalui langkahlangkah berikut:Basis: i = 0, diketahui A X1, X2,..., Xklm

Induksi: Asumsikan bahwa A w1w2...wi-1XiXi+1...Xklm

a. Jika Xi adalah sebuah terminal, tidak ada yang dikerjakan. Nyatakan Xi sebagai string terminal wi, sehingga A w1w2...wi Xi+1Xi+2...Xklm

b. Jika Xi adalah sebuah variabel, lanjutkan penurunan dari wi dari Xi, bahwa jika penurunan ini adalah Xi 1 2... wilm lm lm

Kita proses dengan w1w2...wi-1XiXi+1...Xk w1w2...wi-11Xi+1...Xk w1w2...wi-12Xi+1...Xk ...lm lm lm

w1w2...wiXi+1 Xi+2...Xklm

hasilnya adalah penurunan A w1w2...wi Xi+1Xi+2...Xk . Ketika i = k, hasillm

adalah leftmost derivation dari w dari A. Contoh 5.12:Leftmost derivation dari parse tree tersebut diperoleh dengan menentukan penurunan yang berkaitan dengan subtree. Subtree pada anak yang pertama dari root memiliki leftmost derivation E I a. Subtree padalm lm

anak yang ketiga dari root memiliki leftmost derivation berikut E (E) (E+E) (I+E) (a+E)lm lm lm lm

(a+I) (a+I0) (a+I00) (a+b00)lm lm lm lm

84

Untuk membuat leftmost derivation dari seluruh tree kita mulai dari langkah pada root: E E*E. Kemudian, kita ubah E yang pertama berdasarkan penurunannya mengikuti setiap langkah dengan *E untuk menerangkan konteks yang lebih besar dimana penurunan tersebut digunakan. Dengan demikian, leftmost derivation sekarang: E E*E I*E a*Elm lm lm

Selanjutnya dengan menggunakan penurunan dari E (a+b00)lm

Penurunan adalah E E*E I*E a*E a*(E) a*(E+E) a*(I+E) a*(a+E)lm lm lm lm lm lm lm

a*(a+I) a*(a+I0) a*(a+I00) a*(a+b00)lm lm lm lm

Dari Penurunan ke Inferensi Rekursif

Jika terdapat sebuah penurunan A w untuk CFG, maka fakta bahwa w adalah dalam bahasa dari A ditemukan dalam prosedur inferensi rekursif. Anggap bahwa terdapat penurunan A X1, X2,..., Xk w Nyatakan w = w1w2...wk sedemikian sehingga Xi wi.5.7 Aplikasi dari CFG Markup Language: HTML String dalam markup language adalah dokumen-dokumen dengan mark-mark tertentu (dinamakan tag-tag). HTML (Hypertext Markup Language) adalah standar bahasa yang digunakan untuk menampilkan dokumen web. Tag-tag HTML diterjemahkan menjadi halaman web dengan menggunakan browser. Dokumen HTML dibuat dengan menggunakan HTML editor, contoh Dreamweaver dan notepad. Setiap dokumen HTML diawali dan diakhiri dengan tag HTML:

Bentuk dari tag HTML adalah Dengan elemen menyatakan nama tag, atribut merupakan atribut dari tag dan nilai menyatakan nilai dari atribut. Contoh tag HTML adalah

85

Contoh dokumen HTML: Dokumen HTML 1

Contoh lain, diberikan teks berikut: The things I hate: 1. Moldy bread 2. People who drive too slow in the fast lane Tag HTML untuk teks tersebut adalah The things I hate: Moldy bread People who drive too slow in the fast lane

Terdapat sejumlah kelas dari string yang berkaitan dengan dokumen HTML, yang penting diantaranya adalah: Text: string dari karakter, tidak memiliki tag. Contoh elemen teks adalah Moldy bread. Char: string yang terdiri dari karakter tunggal yang legal dalam teks HTML. Blank termasuk karakter. Doc: menyatakan dokumen yang merupakan serangkaian elemen. Element: bisa berupa sebuah string Text atau sepasang tag dan dokumen di dalamnya, atau unmatched tag yang diikuti oleh sebuah dokumen. ListItem: tag diikuti dengan sebuah dokumen, yang merupakan sebuah list item tunggal. List: serangkaian 0 atau banyak List item. CFG yang menjelaskan struktur dari bahasa HTML adalah 1. 2. 3. 4.Char a A Text Char Text Doc Element Doc Element Text Doc Doc List 4. ListItem Doc 5. List ListItem List

86

Markup Language: XML

XML (eXtensible Markup Language) digunakan untuk menyusun dan menyajikan informasi dengan format yang dikehendaki (bukan format standar). XML dirancang untuk menjelaskan data. Seperti HTML, mengandung elemen yang ditandai dengan tag pembuka dan tag penutup. Dengan XML, tag dan atribut dapat digunakan sesuai kebutuhan. XML mencoba untuk menjelaskan semantik dari teks. XML bukan menggantikan HTML. XML dan HTML dirancang untuk tujuan yang berbeda yaitu: XML dirancang untuk menjelaskan data dan fokus pada data apa. HTML dirancang untuk menampilkan data dan fokus pada bagaimana data terlihat. XML adalah komplemen untuk HTML. Sintaks XML dinyatakan sebagai berikutElemen Root Tove Jani Reminder Don't forget me this weekend! Akhir dari elemen Root Deklarasi XML, mendefinisikan versi XML dan character encoding yang digunakan. Dalam hal ini digunakan versi 1.0 dan ISO-8859-1 (Latin-1/West European) character set.

Elemen anak dari root (to, from, heading, and body).

Gambar 5.2 Contoh sintaks XML (sumber: www.w3schools.com)Elemen XML

Diberikan contoh deskripsi buku sebagai berikut:My First XML Introduction to XML What is HTML What is XML XML Syntax Elements must have a closing tag Elements must be properly nested

Dokumen XML untuk deskripsi tersebut adalah My First XML Introduction to XML What is HTML What is XML

87

XML Syntax Elements must have a closing tag Elements must be properly nested

Dalam dokumen XML di atas, dinyatakan hal-hal berikut: Book adalah root element. Title, prod, dan chapter adalah child element dari book. Book adalah parent element dari title, prod, dan chapter. Title, prod, dan chapter adalah sibling (atau sister element) karena mereka memiliki parent yang sama. Elemen memiliki Content. Elemen dapat memiliki tipe content yang berbeda. Sebuah elemen XML adalah segala sesuatu dari tag awal dari elemen (termasuk tag tersebut) sampai ke tag akhir dari elemen (termasuk tag tersebut). Sebuah elemen dapat memiliki element content, mixed content, simple content, atau empty content. Sebuah elemen juga dapat memiliki attribute. Dalam contoh, book memiliki element content, karena book mengandung elemen-elemen lainnya. Chapter memiliki mixed content karena mengandung teks dan elemen lainnya. Para memiliki simple content (atau text content) karena hanya mengandung teks saja. Prod memiliki empty content, karena tidak membawa informasi apapun. Elemen prod memiliki attributes. Attribute diberi nama id memiliki value "33657". Attribute yang diberi nama media memiliki value "paper". Diagram Hirarki XML diberikan dalam gambar berikut:Root Element

-

-

Child Element 1

Child Element 2

Child Element 3

Sub Child Element

Sub Child Element

Gambar 5.3 Diagram hirarki XMLDocument-Type Definition (DTD)

DTD berfungsi untuk mendefinisikan tipe dokumen XML. DTD mendefinisikan struktur dokumen XML dengan daftar elemen yang digunakan. DTD secara esensial merupakan sebuah CFG, dengan notasinya sendiri untuk menjelaskan variabel dan produksi. Bentuk dari sebuah DTD adalah: Definisi elemen memiliki bentuk:

88

Deskripsi elemen secara esensial merupakan ekspresi regular. Basis dari ekspresiekspresi ini adalah Nama elemen lainnya, menyatakan bahwa elemen dari satu tipe dapat muncul dalam elemen tipe lain. Term khusus #PCDATA menyatakan teks yang tidak tercakup dalam tag-tag XML.

Contoh deklarasi element adalah

Parsed character data (PCDATA) menunjukkan isi elemen hanya terdiri dari teks yang perlu diproses oleh parser. ]> Budi Bogor laki-laki bendahara

File DTD dipisahkan dengan dokumen XML-nya dan misalkan disimpan dalam file organisasi.dtd.

Dokumen XML yang memanggil file organisasi.dtd: Budi Bogor

89

lak-laki bendahara

Operator-operator yang digunakan dalam deskripsi elemen adalah | menyatakan union Koma menyatakan perangkaian Closure operator: berarti zero or more occurences of + berarti one or more occurences of ? berarti zero or one occurence of Contoh 5.13: Berikut ini adalah standard DTD untuk mendeskripsikan berbagai PC yang dijual oleh vendor komputer. Setiap deksripsi memiliki nomor model, detail fitur dari model, seperti jumlah RAM, banyaknya dan ukuran disk dan sebagainya. PC (MODEL,PRICE,PROCESSOR,RAM,DISK+)> MODEL (\#PCDATA)> PRICE (\#PCDATA)> PROCESSOR (MANF, MODEL, SPEED)> MANF (\#PCDATA)> MODEL (\#PCDATA)> SPEED (\#PCDATA)> RAM (\#PCDATA)> DISK (HARDDISK|CD|DVD)> HARDDISK (MANF,MODEL,SIZE)> SIZE (\#PCDATA)> CD (SPEED)> DVD (SPEED)>

Bagian dari dokumen XML 4560 $2295 Intel Pentium 800Mhz 256 Maxtor Diamond 30.5GB

90

32X

Dalam Contoh 5.13 aturan untuk elemen DTD

analog berturut-turut dengan produksiProcessor Disk Manf Model Speed

HardDisk | Cd | Dvd

Sedangkan aturan untuk elemen DTD

Analog dengan produksiPc Disks Model Price Processor Ram Disks Disk | Disk Disks

Konversi dari produksi dengan body ekspresi regular ke kumpulan produksi biasa yang ekuivalen. Konversi dilakukan menggunakan induksi pada ukuran dari ekspresi dalam body.Basis: jika body adalah perangkaian dari elemen, maka prodksi merupakan bentuk legal untuk CFG-CFG Induksi: selainnya terdapat 5 kasus, tergantung pada operator final yang digunakan. Kasus tersebut adalah

-

Kasus 1: Produksi dengan bentuk A E1,E2, dimana E1 dan E2 adalah bentuk yang diperbolehkan dalam bahasa DTD. Produksi tersebut diganti dengan A BC B E1 C E2

-

Kasus 2: Produksi dengan bentuk A E1 | E2. Produksi ini diganti dengan pasangan produksi A E1 A E2

-

Kasus 3: Produksi dengan bentuk A (E1)*. Produksi tersebut diganti dengan produksi berikut dimana variabel baru B digunakan A BA A

91

B E1 Kasus 4: Produksi dengan bentuk A (E1)+. Produksi tersebut diganti dengan produksi berikut dimana variabel baru B digunakan A BA A B B E1 Kasus 5: Produksi dengan bentuk A (E1)?. Produksi tersebut diganti dengan pasangan produksi A A E1 Contoh 5.14: Konversikan DTD rule

ke produksi CFG yang legal Jawab: Jika dibuat variabel baru A dan B, maka dapat digunakan produksi-produksi berikut:Pc A B AB Model Price Processor Ram Disk+

Akan tetapi bentuk ketiga tidak legal dalam CFG, sehingga digunakan variabel baru C dan diperoleh produksi-produksi berikut B C CB | C Disk

Dalam kasus ini, variabel A dan C tidak diperlukan, sehingga diperoleh produksiproduksi berikutPc B Model Price Processor Ram B Disk B | Disk 5.8 Ambiguitas dalam Grammar Dan Bahasa

Tidak semua grammar dapat menyatakan struktur yang unik untuk setiap string dalam sebuah bahasa. Kadang-kadang, grammar dapat dirancang ulang agar dapat memberikan struktur yang unik untuk setiap string dalam sebuah bahasa. Contoh 5.15: CFG untuk ekspresi sederhana: E E E I E+E E*E

92

E I I I I I I

(E) a b Ia Ib I0 I1

E + E, E E * E ekpresi-ekspresi sederhana dapat diProduksi-produksi E generate dalam beberapa cara. Sebagai contoh, bentuk sentential E + E * E memiliki dua penurunan dari E, yaitu: 1. E E + E E + E *E 2. E E * E E + E *E Gambar berikut menyatakan parse tree yang bersesuaian dengan kedua penurunan tersebut:E

Gambar 5.4a

E

Gambar 5.4b

E

+

E

E

*

E

E

*

E

E

+

E

Gambar 5.4 Parse tree untuk E + E * EGrammar pada Contoh 5.15 di atas memberikan dua struktur yang berbeda untuk string atau terminal-terminal yang diturunkan dengan mengganti 3 ekspresi dalam E + E * E dengan identifier.

Contoh 5.16: Dengan menggunakan grammar dalam Contoh 5.15, dapat ditemukan bahwa string a + b memiliki beberapa penurunan yang berbeda, yaitu: 1. E E + E I + E a + E a + I a + b 2. E E + E E + I I + I I + b a + b

Ambiguitas disebabkan karena adanya dua atau lebih parse tree, bukan karena banyaknya penurunan. CFG G = (V, T, P, S) dikatakan ambigu jika terdapat sedikitnya satu string w dalam T* dimana kita dapat menentukan dua parse tree yang berbeda. Masing-masing parse tree tersebut memiliki root yang diberi label S dan hasil w. Jika setiap string memiliki paling banyak satu parse tree dalam grammar, maka grammar tersebut dikatakan tidak ambigu (unambiguous). Contoh 5.17: Berikut adalah parse tree yang menghasilkan string a + a * a.

93

E

Gambar 5.5aE E

E

Gambar 5.5bE

E

+

*

I

E

*

E

E

+

E

I

a

I

I

I

I

a

a

a

a

a

Gambar 5.5 Parse tree untuk a + a * aMenghilangkan Ambiguitas dari Grammar

Terdapat dua penyebab ambiguitas dalam grammar pada Contoh 5.15, yaitu: Gambar 5.4a mengelompokkan operator * sebelum operator +. Sedangkan Gambar 5.4b mengelompokkan + di depan *. Tetapkan hanya struktur dalam Gambar 5.4a yang legal dalam grammar yang tidak ambigu. Urutan operator-operator yang serupa dapat dikelompokkan dari kiri atau dari kanan. Sebagai contoh, jika para * dalam Gambar 5.4 diganti oleh para +, maka akan diperoleh dua parse tree yang berbeda untuk string E + E + E. Walaupun dalam penjumlahan dan perkalian berlaku hukum asosiatif, untuk menghilangkan ambiguitas ditetapkan pengelompokkan dari kiri. Untuk menghilangkan ambiguitas, diperkenalkan variabel-variabel berikut: 1. Faktor: sebuah ekspresi yang tidak dapat dipecah dari operator yang berdekatan, a * atau a +. Faktor-faktor berupa: Identifier Ekspresi yang diberi tanda kurung.

-

2. Term: sebuah ekspresi yang tidak dapat dipisahkan dari operator +. Dalam Contoh 5.15, term adalah product dari satu atau lebih faktor. 3. Ekspresi. Dalam Contoh 5.15, ekspresi adalah penjumlahan satu atau lebih term. Contoh 5.18: Berikut adalah grammar yang tidak ambigu yang me-generate bahasa yang sama dengan bahasa yang di-generate oleh grammar dalam Contoh 5.15: I F a | b | Ia | Ib | I0 | I1 I | (E)

94

T E

F|T*F T|E+T

Dalam grammar tersebut, F, T dan E berturut-turut menyatakan faktor, term, dan ekspresi. Grammar di atas memungkinkan hanya satu parse tree untuk string a + a * a, yaituE

E

+

T

T

T

*

F

F

F

I

I

I

a

a

a

Gambar 5.6 Parse tree untuk a + a * a Leftmost Derivation dan Ambiguitas

Penurunan dapat tidak unik walaupun grammar tidak ambigu. Dalam sebuah grammar yang tidak ambigu, leftmost derivation dan rightmost derivation akan unik. Contoh 5.19: Perhatikan parse tree dalam Gambar 5.5a dan Gambar 5.5b, yang menghasilkan E + E * E. Leftmost derivation dari kedua parse tree tersebut, berturut-turut adalah E

lm

E+E

lm

I+E

lm

a+E

lm

a+ E*E

lm

a+I*E

lmE

a+a*E E*E

lm

a+a*I

lmlm

a+a*a I+E*E

lm

lm

E+E*E

lm

a+ E*E

lm

a+I*E

lm

a+a*E

lm

a+a*I

lm

a+a*a

95

Teorema 5.3: Untuk setiap grammar G = (V, T, P, S) dan string w dalam T*, w memiliki dua parse tree yang berbeda jika dan hanya jika w memiliki dua leftmost derivation yang berbeda dari S. Bukti dapat dilihat pada buku rujukanInherent Ambiguity

Sebuah CFL L dikatakan inherently ambiguous jika semua grammargrammarnya adalah ambigu. Jika satu grammar untuk L adalah tidak ambigu, maka L adalah sebuah bahasa yang tidak ambigu. Bahasa dari ekspresi-ekspresi yang digenerate oleh grammar dalam Contoh 5.15 adalah bahasa tidak ambigu. Walaupun grammarnya ambigu, terdapat grammar yang lain untuk bahasa yang sama yang tidak ambigu, yaitu grammar dalam Contoh 5.18. Contoh 5.20: Perhatikan bahasa berikut: L = {anbncmdm | n 1, m 1} {anbmcmdn | n 1, m 1} Bahasa L berisi string-string dalam a+b+c+d+ sedemikian sehingga: Terdapat sama banyak para a dan para b dan sama banyak para c dan para d, atau Terdapat sama banyak para a dan para d dan sama banyak para b dan para c. S A B C D AB | C aAb | ab cBd | cd aCd | aDd bDc | bc

L adalah sebuah CFL. Grammar untuk L adalah:

Grammar di atas adalah grammar yang ambigu. Sebagai contoh, string aabbccdd memiliki dua leftmost derivation, yaitu:

1. S 2. S

lm

lm

AB C

lm

aAbB

lm

aabbB

lm

aabbcBd

lm

aabbccdd

lm

aCd

lm

aaDdd

lm

aabDcdd

lm

aabbccdd

Parse tree untuk kedua penurunan tersebut adalah:

96

Gambar 5.7a

Gambar 5.7b

Gambar 5.7 Parse tree untuk aabbccddPenutup Latihan Soal

1. Untuk CFG yang ditentukan oleh S A AA AAA|a|bA|Ab

Berikan sebuah penuruan untuk bbabaaba. 2. Tentukan sebuah CFG untuk setiap bahasa berikut a. {0n1n | n 0} b. {0m1n | m n} 3. Untuk CGF yang ditentukan oleh S A B AB aA|a bB|b

Tentukan leftmost atau rightmost derivation untuk aabbb. Buatlah parse tree untuk penurunan aabbb. 4. Untuk CGF yang ditentukan oleh S SbS|ScS|a Buatlah parse tree untuk Tentukan sedikitnya dua penurunan untuk abaca. penurunan-penuruan tersebut. 5. Diberikan grammar yang ditentukan oleh S I E I:=E a|b|c E+E|E*E| (E)|I

a. Berikan contoh string-string yang dapat diturunkan dari grammar tersebut. b. Jelaskan string-string seperti apa yang ada dalam bahasa dari grammar tersebut. c. Apakah string a:=b+c*a dapat diturunkan dari grammar tersebut.

97

d. Buatlah parse tree untuk string a:=b+c*a. e. Apakah grammar tersebut ambigu. 6. Diberikan grammar E +EE | *EE| EE| x | y a. Tentukan leftmost atau rightmost derivation untuk +*xyxy. b. Tunjukkan bahwa grammar tersebut ambigu. 7. Tunjukkan bahwa grammar berikut adalah ambigu S bA|aB A aaS|bAA B bbS|aBB 8. Tentukan grammar lain yang tidak ambigu untuk bahasa yang dinyatakan oleh grammar pada soal nomor 6. 9. Exercise 5.3.4 Hopcroft et al (2000) 10. Exercise 5.3.5 Hopcroft et al (2000)

98