07. GRAMMAR
¾ Secara umum grammar didefinisikan sebagai sebuah himpunan hingga yang tak hampa dari aturan atau produksi yang menspesifikasikan sintaks dari suatu bahasa.
¾ Secara matematis, grammar dapat ditulis sebagai himpunan dengan 4 anggota (tupel) sbb.:
G = (VN, VT, S, Q)
VN = himpunan simbul non terminal, dapat berupa sebuah ekspresi
VT = himpunan simbul terminal, dapat berupa karakter
S = simbul awal dari pohon sintaks
Q = himpunan produksi, yang menggambarkan uraian penurunan dari VN menjadi beberapa VT
¾ Chomsky mengelompokkan Grammar menjadi 4 kelompok berdasarkan pembatasan pada aturan produksi, yaitu:
- Grammar tingkat nol (unrestricted grammars), atau grammar
umum yaitu grammar yang mempunyai aturan produksi yang tidak terbatasi.
- Grammar tingkat pertama (Context-sensitive grammars).
- Grammar tingkat kedua (Context-free grammars).
- Grammar tingkat ketiga (Regular grammars).
Grammar Umum
(Grammar tingkat nol)Gammar Umum dengan 4-tupel dapat dituliskan sbb.: G = (VN, VT, S, Q)
Grammar Umum (tingkat nol) Grammar Context-Sensitive
(tingkat pertama) Grammar Context-Free
(tingkat kedua) Grammar
dengan
• VT dan VN adalah himpunan simbol terminal dan himpunan simbol
non-terminal yang saling bebas (tidak bergayut).
• S adalah suatu elemen tertentu dari VN, yang disebut simbol Start.
• Q merupakan subhimpunan hingga yang tidak kosong dari relasi (VT ∪ VN) ke (VT ∪ VN)
atau secara umum, sebuah elemen (α, β) dari Q, ditulis sebagai
α → β
dan disebut sebagai produksi.
Sebagai contoh dalam mendefinisikan identifier (sebagai simbul start), dapat dituliskan Grammar berikut :
G1 = (VN, VT, S, Q)
dengan VN = {I, L, D}
VT = {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,
2,3,4,5,6,7,8,9} S = I
Q = {I → L, I → IL, I → ID, L → a, L → b, .... , L → z, D → 0, D → 1, ...., D → 9}
Grammar Peka Konteks (
Context-Sensitive Grammars
)
Seperti halnya grammar umum, grammar context-sensitive, atau Grammar tipe pertama, dapat ditulis sbb.:
G = (VN, VT, S, Q)
dengan VN, VT, dan S yang masing-masing adalah himpunan simbul
non terminal, himpunan simbul terminal, dan simbul start.
sedangkan Q yang merupakan himpunan produksi hanya terdiri dari produksi berbentuk α → β , dengan α <= β. Di sini α dan β berturut-turut menunjukkan panjang untai alpha dan untai beta.
Grammar peka konteks dapat didefinisikan dengan cara lain sbb.:
• γ yang merupakan simbul terminal, dalam hal ini harus tidak hampa. Jadi suatu grammar adalah peka konteks (context-sensitive) jika semua produksinya berbentuk:
Ini berarti bahwa simbul non terminal A dapat digantikan dengan γ dalam konteks antara Q1 dan Q2.
Grammar Context-Sensitive membentuk Bahasa Context-Sensitive. Contoh Bahasa Context-sensitive adalah bahasa :
L(G2) = {anbncn n >= 1}.
Bahasa ini dibentuk dari Grammar Context-Sensitive G2 sebagai berikut :
G2 = ({S,B,C}, {a,b,c}, S, Q)
dengan himpunan produksi Q terdiri dari produksi 1. S → aSBC 4. BC → bc
2. S → abC 5. CB → BC 3. bB → bb 6. cC → cc
Berikut ini adalah derivasi untuk untai aabbcc S → aSBC melalui produksi 1
Grammar Bebas Konteks (
Context-Free Grammars
)
Seperti halnya grammar umum, grammar context-free, atau Grammar tipe kedua, dapat ditulis sbb.:
dengan VN, VT, dan S yang masing-masing adalah himpunan simbul
non terminal, himpunan simbul terminal, dan simbul start.
sedangkan Q hanya terdiri dari produksi berbentuk : α → β, dengan α <= β, dan α adalah anggota dari VN (simbol nonterminal).
Ini berarti bahwa pada Grammar Context-Free seluruh produksinya tidak akan menghasilkan himpunan hampa, bersifat bahwa ruas kiri hanya terdiri dari satu jenis simbol, yakni satu simbol nonterminal.
Grammar Context-Free merupakan pembentuk Bahasa Context-Free. Contoh: Bahasa Context-Free :
L(G3) = {anbcn n >= 1}
dibentuk oleh Grammar Context-Free sebagai berikut :
G3 = ({S,C},{a,b},S,Q),
dengan Q adalah produksi : S → aCa
C → aCa C → b
Derivasi untuk aaabaaa, terdiri dari langkah sebagai berikut :
S → aCa → aaCaa → aaaCaaa → aaabaaa
Grammar Regular
Seperti halnya grammar umum, grammar context-free, atau Grammar tipe kedua, dapat ditulis sbb.:
G = (VN, VT, S, Q)
dengan VN, VT, dan S yang masing-masing adalah himpunan simbul non terminal, himpunan simbul terminal, dan simbul start.
sedangkan Q hanya terdiri dari produksi berbentuk : α → β, dengan α <= β, α adalah anggota VN, dan β mempunyai bentuk
aB atau a, dengan a anggota VT dan B anggota VN.
himpunan hampa, bersifat bahwa ruas kiri hanya terdiri dari satu jenis simbol, yakni satu simbol nonterminal, ruas kanan harus mengandung simbul terminal.
Bahasa yang dibentuk oleh Grammar Regular disebut Bahasa Regular.
Contoh bahasa regular yang dibentuk dari grammar regular adalah sebagai berikut :
L(G4) = {anbam n,m >= 1}, dengan
G4 = ({S,A,B,C},{a,b},S,Q)
dan produksinya adalah : S → aS
S → aB B → bC C → aC C → a
Kalimat a3ba2 atau aaabaa, mempunyai derivasi sebagai berikut :
S → aS → aaS → aaaB → aaabC → aaabaC → aaabaa
Ekspresi Regular
Ekspresi regular adalah notasi yang digunakan untuk mendefinisikan
suatu himpunan ekspresi tertentu. Ekspresi regular dibentuk berdasarkan ekspresi regular lain yang lebih sederhana dengan menggunakan beberapa aturan tertentu.
Ekspresi Regular adalah Ekspresi yang dapat dibentuk menurut ketentuan sebagai berikut:
1. φ adalah Ekspresi Regular, menunjukkan himpunan hampa.
2. ∧ adalah Ekspresi Regular, yang menunjukkan Bahasa yang hanya terdiri dari untai hampa, yaitu bahasa L = {∧}
3. Suatu huruf a anggota VT, adalah Ekspresi Regular, menunjukkan Bahasa yang terdiri dari simbol tunggal a, yaitu Bahasa L = {a}.
Bahasa L1 dan L2, maka
(a) e1e2 adalah Ekspresi Regular menunjukkan L1 ∪ L2
(b) e1e2 adalah Ekspresi Regular menunjukkan L1 L2
(c) e1 adalah Ekspresi Regular menunjukkan L1
Dalam Ekspresi Regular dapat digunakan 3 operator, yakni : - Perangkai atau concatenation
- Alternasi atau alternation - Penutup atau closure
Perangkaian
Perangkaian dua buah ekspresi e1 dan e2 yang menyajikan Bahasa L1 dan
L2, adalah sbb.:
e1e2 = {xy x ∈ L1, dan y ∈ L2}.
Alternasi
Alternasi dinotasikan dengan atau +, merupakan gabungan atau union dari bahasa yang disajikan oleh kedua ekspresi.
Berarti
e1 e2 = {x x ∈ L1, atau x ∈ L2}.
Penutup
Penutup atau closure yang dinotasikan dengan apitan kurung {}, atau dengan subskrip *, menunjukkan pengulangan dari 0 atau lebih kali Ekspresi.
Jadi
{e1} = e1* = {x x ∈ L1*}.
Di sini L1* = i 0 Li1 ∞
=
∪ atau L1* adalah penutup dari L1.
Berikut ini 3 buah contoh lain dari Ekspresi Regular, yang menyajikan himpunan Token tertentu.
(1) {identifier} = letter(letterdigit)*
(2) {PL/1 name} = (letter#$@){letterdigitzy_$} (3) {number} = (∧+-)((digit)*,digit(digit)*)
Tanda kurung bila tidak diperlukan dapat dihilangkan, sebagai contoh; ekspresi ((p) ((p)(q)) adalah sama dengan ppq. Namun dalam kasus (pq)r, tanda kurung tidak dapat dihilangkan.
Token dari Bahasa pemrograman dapat didefinisikan baik dalam penyajian Grammar Regular maupun dalam Ekspresi Regular. Sebagai contoh suatu identifier yang terdiri dari huruf dan digit, serta harus dimulai dengan huruf, dapat disajikan sebagai Grammar Regular.
S → aAbAcA...zAabc...z
A → aAbA...zA0A1A...9Aabc...z01...9 atau dengan Ekspresi Regular
(abc...z)(abc...z01...9)*
Jika kita menggunakan letter sebagai singkatan dari abc...z, dan digit untuk 01...9, maka Ekspresi dapat ditulis sebagai
letter(letterdigit)*
Operator Ekspresi Regular juga mempunyai sifat-sifat aljabar sbb.:
Alternation dan concatenation adalah asosiatif (ab)c = a(bc)
(ab)c = a(bc) Alternation juga komutatif
ab = ba
Concatenation mendistribusikan alternation a(bc) = abac
Mengubah Grammar regular menjadi Ekspresi regular
Sebagai contoh Bahasa regular LL{ambann,m >= 1}
Himpunan produksinya adalah : 1. S → aS
Mula-mula operator produksi diganti dengan tanda sama dengan. Kemudian dikombinasikan semua produksi yang mungkin menjadi satu Ekspresi dengan menggunakan operator alternasi.
Grammar di atas dapat ditulis menjadi himpunan persamaan sbb.: S = aSaB
B = bC C = aCa
Selanjutnya, himpunan persamaan diselesaikan dengan melakukan substitusi sehingga diperoleh suatu Ekspresi Regular.
Keterangan bahwa persamaan C mempunyai penyelesaian C = (a)*a. C = aCa
(a)*a = a(a)*aa
kalau ruas kanan diuraikan, akan diperoleh (a)*a = ((a)*a∧)a
(a)*a∧ = (a)*
karena ∧ dapat dihasilkan oleh kedua ruas persamaan, demikian pula a, dan setiap untai a'
Maka didapat {a}a = {a}a
Hasil dari C dapat disubstitusikan ke dalam persamaan kedua. Persamaan ketiga dapat dihilangkan.
Hasilnya, himpunan persamaan sbb.: S = a(SB)
B = b(a)*a
dengan mensubstitusikan B ke dalam persamaan pertama akan diperoleh hasil sbb.:
S = a(Sb(a)*a) = aSab(a)*a
Sehingga diperoleh S = (a)*ab(a)*a
yang merupakan suatu Ekspresi Regular.
Algoritma suatu Ekspresi Regular yang ekivalen dari suatu Grammar Regular, sbb.:
Misal suatu Grammar Regular dengan himpunan Produksi berbentuk Xi → Y, dengan Y adalah suatu bentuk aXj, atau a, dengan a anggota VT,
adalah sombol awal Grammar.
1. [Mengubah Produksi menjadi Persamaan]
Ulangi untuk setiap Produksi Xi → Y dari Grammar Regular
jika persamaan Xi = Y, tidak ada sebelumnya,
maka definisikan Xi = Y
selain itu, ubah Xi = W menjadi Xi = WY,
di sini W telah didefinisikan di bagian sebelumnya dari persamaan Xi
2. [Mengubah persamaan ke bentuk baku] Ulangi untuk i = 1,2,...n-1
Ubah persamaan Xi ke dalam bentuk Xi = WiXiYi
dengan Yi adalah bentuk Φ 0,1Φ I+1,1X I...Φ n,1X n dan W i dan
setiap Φ j,i adalah Ekspresi Regular di bawah VT
Ulangi untuk j=i+1,i+2,...,n
Substitusikan Wi untuk Xi ke dalam persamaan untuk Xj
3. [Menyelesaikan persamaan] Ulangi untuk i = n, n-1,...1
Ubah persamaan untuk Xi ke dalam bentuk WiXiYi
dengan Y1 adalah suatu Ekspresi Regular atas VTY1
Ulangi untuk j=i-1,i-2,...,1
Substitusikan penyelesaian (Wi)*}Yj untuk Xi,
ke dalam persamaan untuk Xj
4. [Mencetak penyelesaian]
Write('SOLUSI ADALAH',(Wi}*Y1)
Exit
Sedangkan yang dimaksud dengan parsing dari sebuah kalimat adalah konstruksi atau pembentukan pohon sintaks untuk kalimat tersebut.
Hubungan struktural antar bagian kalimat, dapat dilihat dari bentuk pohon sintaks kalimat tersebut. Sebagai contoh sebuah derivasi dari identifier x2 adalah
<identifier> Ö <identifier><digit> Ö <letter> <digit> Ö x <digit>
Ö x2
ini dapat dilihat pada gambar berikut. Gambar ini memuat sebuah barisan diagram, dengan masing-masing diagram bersesuaian dengan sebuah bentuk sentensial dalam derivasi dari kalimat tersebut.
Contoh bentuk sentensial:
Sebuah Grammar G sbb:
G = ({<identifier>,<letter>,<digit>}, {a,b,....,z,0,1,....,9}, <identifier>, Q) dengan produksi Q adalah:
<identifier> → <letter> <identifier><letter> <identifier><digit> <letter> → ab...yz
<digit> → 01...9
Bentuk sentensial dari identifier ini diperoleh dari deretan produksi :
<identifier> → <identifier><letter>
→ <identifier><digit><letter> → <letter><digit><letter>
Di sini terdapat beberapa phrase yaitu; <letter>, <identifier><letter>, <identifier><digit><letter>, <letter><digit><letter>. Sedangkan <digit> tidak terdapat dalam derivasi ini, jadi <digit> adalah bukan phrase dari bentuk sentensial ini.
dari Grammar. Dari akar kita gambar dua cabang ke bawah (lihat gambar) yang dimaksudkan untuk menulis kembali <identifier> dengan <identifier><digit>. Simbol <identifier> dalam bentuk sentensial <identifier><digit> kemudian ditulis menjadi <letter>, sesuai dengan produksi <identifier> → <letter>. Proses ini berlangsung terus untuk masing-masing produksi yang digunakan sampai diperoleh pohon sintaks lengkap untuk x2.
Pohon sintaks untuk sebuah kalimat selalu mempunyai sebuah simpul akar yang diberi label berupa simbol Start dari Grammar. Simpul Daun dari pohon sintaks menyajikan simbol terminal dalam kalimat yang telah diuraikan. Semua simpul bukan daun menyajikan simbol nonterminal. Tiap-tiap simpul non-terminal mempunyai sejumlah cabang ke bawah. Masing-masing cabang menyajikan sebuah simbol pada ruas kanan dari produksi yang dipergunakan.
Sebagai contoh derivasi identifier b33, adalah sebagai berikut: <identifier>Ö <identifier><digit>
Ö <identifier><digit><digit> Ö <letter><digit><digit> Ö b <digit><digit>
Ö b3 <digit> Ö b33
Kemungkinan lain derivasi untuk identifier yang sama adalah: <identifier>Ö <identifier><digit>
Ö <identifier><digit><digit> Ö <identifier><digit>3
Ö <identifier>33 Ö <letter>33 Ö b33
Contoh lain membuat pohon sintaks dari sebuah Grammar sbb.: G = ({<ekspresi>,<faktor>,<term>}, {i,+,*,(,)}, <ekspresi>, Q) dengan Q terdiri dari produksi
<faktor> → i <ekspresi>
<term> → <faktor> <ekspresi> * <faktor> <ekspresi> → <term> <ekspresi> + <term>
Di sini i digunakan untuk menyatakan sebuah identifier atau nama variabel. Pohon sintaks dari bentuk sentensial <ekspresi> + <term> * <faktor> diberikan pada gambar berikut dengan <ekspresi> + <term> * <faktor> dan <term> * <faktor> adalah phrase. Di sini <term> * <faktor> adalah simple phrase.
Perlu dicatat bahwa untuk sebuah pohon sintaks dapat ada satu atau lebih derivasi.
Selain itu perlu dijelaskan bahwa pada kalimat yang sama dapat mempunyai dua phrase yang berarti mempunyai dua pohon sintaks yang berbeda. Hal ini dapat dijelaskan sbb.:
Sebuah Grammar G dengan produksi sbb.: S → S * S
S → a
di sini a adalah simbol terminal.
Salah satu derivasinya adalah S Ö S * S
Ö S * S * S Ö a * S * S Ö a * a * S Ö a * a * a atau
Kedua derivasi ini dapat digambarkan dengan pohon sintaks sbb.:
Definisi
Sebuah kalimat yang dihasilkan oleh sebuah Grammar adalah Ambiguous, jika terdapat lebih dari satu Pohon Sintaks yang dapat membentuk kalimat tersebut. Sebuah Grammar adalah Ambiguous, jika ia menghasilkan paling sedikit satu kalimat Ambiguous.
Ada beberapa metode pengurai (parser) untuk suatu Grammar. Metoda-metoda yang lazim dipakai dalam kompilator dapat diklasifikasikan sebagai metoda atas-bawah (top-down parser) dan bawah-atas (bottom-up parser). Pengurai top-down membentuk pohon urai (parse tree) dari atas (akar) ke bawah (daun), sedangkan pengurai bottom-up memulai dari daun dan bergerak ke akarnya. Pada kedua metoda itu, masukan pengurai tersebut disaring dari kiri ke kanan, sekali satu symbol.
PARSING TOP-DOWN
Konstruksi pohon sintaks atau parsing top-down dapat digambarkan sbb.: Di sini akar dan daun mewakili simbol terminal dalam kalimat.
Ada beberapa metode yang dapat digunakan untuk menyelesaikan konstruksi ini. Pertama, usahakan konstruksi pohon dapat dimulai dari akar dan dilanjutkan turun ke bawah menuju daun. Metode ini disebut Top-Down Parsing.
Untuk menjelaskan tentang metode top-down parsing, pandang identifier x2 yang dibentuk oleh Grammar sbb.:
G = ({<identifier>,<letter>,<digit>}, {a,b,...,z,0,1,....,9}, <identifier>, Q)
Langkah pertama adalah mengkonstruksi derivasi langsung <identifier> Ö <identifier><digit>
untuk membentuk bentuk sentensial berikutnya. Proses dalam mengidentifikasikan x2 ditunjukkan pada pohon sintaks sbb.:
Secara garis besar ada 2 metode Top-Down parsing, yakni metode dengan backup, dan metode tanpa backup. Backup adalah pengulangan penggunaan suatu produksi dengan alternatif produksi yang lain, bila produksi yang digunakan tidak sesuai dengan simbol input. Metode yang pertama (metode dengan backup) di antaranya adalah teknik Brute Force, dan metode yang kedua (metode tanpa backup) di antaranya adalah teknik Recursive Descent.
Berikut ini merupakan contoh yang memperlihatkan cara kerja metode Brute Force, berdasarkan Grammar dengan produksi berikut:
1. S → aAd 2. S → aB 3. A → b 4. A → c 5. B → ccd 6. B → ddc
Di sini S, A, dan B adalah simbol nonterminal, dengan S adalah simbol Start. Sedangkan a, b, c, dan d adalah simbol terminal.
Ekivalensi Grammar Regular Dan Automata Hingga
D
apat dibuktikan bahwa bahasa yang diterima oleh Automata hingga adalah sama dengan bahasa yang dapat dihasilkan oleh Grammar Regular.Teorema
Ada suatu AHN F = (K,VT,M,S,Z) yang dapat menerima bahasa yang
dihasilkan oleh Grammar Regular G = (VN,VT,S,Q).
Bukti
AHN F dengan Stata K sebagai VN ∪ {X}, dengan X bukan anggota VN.
Stata Awal dari Automata Hingga adalah S (simbol start dari Grammar), dan Stata Akhirnya adalah X. Untuk masing-masing produksi Grammar dibuat fungsi M, dengan cara berikut:
1. Aj anggota M(Ai,a), jika terdapat produksi
Ai → aAj pada G
2. Ai anggota M(Ai,a), jika terdapat produksi
Ai → a pada G
Grammar Regular, perhatikan Grammar Regular G = (VN,VT,S,Q)
dengan
VN = {S,A,B} VT = {a,b}
himpunan produksi Q adalah : 1. S → aS 4. A → aB 2. S → bA 5. B → b 3. A → aA
Kita tentukan AHN F = (K,VT,M,S,Z) dengan
K = {S,A,B,X} VT = {a,b}
Z = {X}
dan M ditentukan oleh :
1. M(S,a) = {S}, dari produksi S → aS 2. M(S,b) = {A}, dari produksi S → bA
3. M(A,a) = {A,B}, dari produksi A → aA dan A → aB 4. M(B,b) = {B}, dari produksi B → b
5. M(A,b) = M(B,a) = HAMPA, karena tidak ada produksi yang berkoresponsi dengan pemetaan (fungsi).
Jadi F adalah suatu Automata Hingga Nondeterministik yang menerima bahasa yang digambarkan oleh Grammar Regular G.
Sama halnya seperti Automata Hingga Nondeterministik yang dapat dikonstruksi dari suatu Grammar Regular, Grammar Regular juga dapat diturunkan dari suatu Automata Hingga.
Teorema berikut memberikan prosedur yang diperlukan untuk membuat suatu Grammar dari AHN yang diketahui.
Teorema
Akan selalu ada suatu Grammar Regular G = (VN,VT,S,P), yang
menghasilkan bahasa yang diterima oleh suatu AHD tertentu F = (K,VT,M,S,Z).
Bukti
Definisikan Grammar Regular G dengan anggota K (Stata internal dari F) menjadi simbol Non-terminaldari G. Simbol start dari G adalah S (Stata Awal dari F), dan himpunan produksi P ditentukan sebagai berikut :
1. Ai → aAj anggota P, jika M(Ai,a) = Aj
2. Ai → a anggota P, jika M(Ai,a) = Aj, dan Aj anggota Z.
tambahkan produksi S → ∧ ke dalam P.
Misalnya x = a1,a2,...,an anggota L(F), dan n >= 1.
Kemudian terdapat himpunan transisi : M(S,a1) = A1
M(A1,a2) = A2
... M(An-1,an) = An
dengan An adalah Stata Akhir dari F.
Jadi G memuat produksi S → a1A1
A1 → a2A2
... An-1 → an
dan Grammar G dapat menghasilkan untai yang diterima oleh F.
Pertanyaan dan Latihan Soal
1. Menurut Noam Chomsky, Grammar dibagi menjadi 4 tipe. Sebutkan keempat tipe Grammar tersebut dan jelaskan masing-masing Grammar tersebut
2. Sebutkan apa yang dimaksud dengan notasi infix maupun postfix.
3. Apa yang dimaksudkan dengan produksi di dalam Grammar. Jelaskan dengan beberapa contoh.
4. Sebutkan 4 tipe Grammar yang kamu ketahui, dan jelaskan perbedaan masing-masing.
5. Buatlah pohon sintak (syntax tree) dan directed acyclic graph (DAG) untuk ekspresi dan statement berikut:
6. Turunkan sebuah Grammar Regular dari Automata Hingga Deterministik
F = ({A,B,C},{a,b},M,A,{C}) dengan M didefinisikan sbb.:
MASUKAN
STATA a b A
B C
A A C
B C B
7. Konversikan Grammar G menjadi suatu Automata Hingga (Finite State Acceptor) Bila
G = ({A,B,C,D},{0,1},A,Q) dan Q adalah 1. A → 0B 5. C → 0D
2. A → 1C 6. C → 1 3. B → 1A 7. D → 0 4. C → 0C