SKRIPSI
Oleh:
Vinsentia Asri Budiarti
NIM : 003114035
i
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
HALAMAN PERSEMBAHAN
iv
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
Saya menyatakan dengan sesungguhnya bahwa skripsi yang saya tulis ini
tidak memuat karya atau bagian karya orang lain, kecuali yang telah disebutkan
dalam kutipan dan daftar pustaka, sebagaimana layaknya karya ilmiah.
v
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
ABSTRAK
Parsing dengan metode Brute Force adalah parsing yang memilih aturan
produksi mulai dari paling kiri, dan melakukan expand semua non terminal pada
aturan produksi sampai yang tertinggal adalah simbol terminal. Kemungkinan
pertama string masukan sukses di-parsing, bisa juga bila terjadi expansi yang
salah untuk suatu simbol variabel maka akan dilakukan backtrack. Algoritma ini
membangun pohon parsing yang top down, yaitu mencoba segala kemungkinan
untuk setiap simbol non terminal.
vi
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
ABSTRACT
The Brute Force Parsing method is a method which choosing left most
symbol on a production rule and expanding all of non terminal symbol on it until
only a terminal symbol left. The first possibility is input string parsed
successfully, otherwise it will perform backtracking when expansion have an
error. This algorithm create a top-down parse tree which will trying all
possibilities for each non terminal symbol.
vii
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
KATA PENGANTAR
meninggalkanNya kita mampu melewati segala rintangan dan kesulitan yang kita
hadapi. Akan tetapi kita sering lupa bahwa kasih dan cintaNya senantiasa
menyertai kita sepanjang hidup. Dan dengan campur tangan Allah semua dapat
terselesaikan dengan mudah. Bunda Maria perawan suci yang telah mengajarkan
kepada kita untuk tidak pernah berhenti memohon dalam kesulitan apapun yang
mengabulkan doa-doaku dengan perantaraan Bunda Maria, Ibu sejati dan Ratu
petunjuk serta bimbingan yang sangat berharga dari berbagai pihak.. Oleh karena
itu dengan ketulusan hati ijinkan penulis secara pribadi menyampaikan ucapan
1. Bpk Ir. Ig. Aris Dwiatmoko, M.Sc. selaku Dekan FMIPA Universitas Sanata
Dharma, terima kasih atas saran dan motivasi yang diberikan kepada penulis.
2. Bpk Y.G. Hartono, S.Si., M.Sc. selaku Ketua Program Studi Matematika,
terima kasih atas semangat yang diberikan kepada penulis hingga penulis
3. Ibu M.V. Any Herawati, S.Si., M.Si. selaku Dosen Pembimbing Akademik,
viii
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
4. Bpk Iwan Binanto, S.Si. selaku dosen pembimbing skripsi, terima kasih
kepada penulis hingga selesainya penulisan skripsi ini. Penulis tidak akan
5. Terima kepada semua dosen pengajar serta staff FMIPA atas kerjasamanya
6. Bapak dan ibu tercinta JB. Tukidjo, serta kakakku tersayang Mas Bowo,
terima kasih atas kasih sayang, perhatian, semangat, kesabaran dan kebaikan
7. Tak lupa ucapan terima kasih kepada calon suamiku, dr. Aloysius Sulistyanto,
M.D., Akp, terima kasih buanyak atas kesabaran, kesetian, cinta, kasih
sayang, motivasi, pengertian, ketulusannya hingga saat ini. Sekali lagi terima
8. Sahabatku Tatik, terima kasih atas semangat yang diberikan, terima kasih
9. Teman-teman kampus angkatan 2000: Tatik, Ayu, Bunga, Pras, Felix, Willy,
Tony, Niza, Eros, Tildy, Sinta, Megi, Eros, Tika, Elin, Sunarto, Deny, Wiwid
ndut, Dewi, Susi, Wiwid, Andy, Lia, Nety, Heri, Jeng-jeng, polo, Mira, Ferry,
ix
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
12. Semua pihak yang secara langsung maupun tidak langsung yang turut
membantu dalam penulisan skripsi ini, maaf tidak dapat disebutkan satu
persatu.
Penulis menyadari bahwa skripsi ini masih jauh dari kata sempurna, oleh
karena itu segala kritik dan saran yang bersifat membangun dari semua pihak akan
penulis terima dengan senang hati. Akhir kata penulis mohon maaf atas segala
kekurangan dan penulis berharap smoga skripsi ini dapat bermanfaat bagi kita
semua.
Penulis
x
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
DAFTAR ISI
HALAMAN JUDUL.............................................................................................. i
HALAMAN PERSEMBAHAN............................................................................ iv
ABSTRAK............................................................................................................. vi
ABSTRACT...........................................................................................................vii
KATA PENGANTAR..........................................................................................viii
BAB I PENDAHULUAN……..…………………………………………………1
A. Latar Belakang…………………………………………………………….1
B. Perumusan Masalah……………………………………………………….3
C. Pembatasan Masalah……………………………………………............... 3
D. Tujuan Penulisan………………………………………..…………………4
E. Manfaat Penulisan…………………………………………………………4
F. Metode Penulisan………………………………………………………….4
G. Sistematika Penulisan....…………………………………………..............4
xi
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
D. Parsing…………………………………………………………………...33
D.2. Ambiguitas………………………………………………………….39
E. Pointer Di Pascal…………………………………………………………43
BAB IV PENUTUP………………………………………………………………63
A. Kesimpulan……………………………………………………………….63
B. Saran……………………………………………………………………...63
LAMPIRAN……………………………………………………………………...65
xii
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
BAB I
bahasa sebagai himpunan semua untai yang menggerakkan untai dari state awal ke
salah satu state yang diterimanya (himpunan state akhir). Dalam skripsi ini
digunakan tata bahasa reguler dan tata bahasa bebas konteks sebagai dasarnya.
Bila pada tata bahasa reguler terdapat pembatasan pada ruas kanan atau hasil
produksi maka pada tata bahasa bebas konteks tidak terdapat pambatasan hasil
produksinya.
Sebuah tata bahasa bebas konteks adalah suatu cara yang menunjukkan
parsing. Tata bahasa bebas konteks menjadi dasar dalam pembentukan suatui
simbol awal diganti oleh suatu untai. Setiap nonterminal dalam untai ini, secara
bergantian digantikan oleh untai yang lain, dan seterusnya sampai tinggal tersisa
1
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
untai yang hanya terdiri dari simbol-simbol terminal. Selanjutnya tidak ada lagi
kontribusi dari masing-masing non terminal pada untai akhir dari terminal-
terminal. Gambar seperti ini dinamakan pohon penurunan atau pohon penguraian
Metode parsing ada dua, pertama Top Down dan yang kedua Bottom Up.
Top Down sendiri meliputi Backtrack: Brute Force dan No Backtrack: Recursive
Descent Parser. Dalam skripsi ini penulis hanya membahas parsing dengan
menggunakan metode Top Down Brute Force. Metode ini akan memilih aturan
produksi mulai dari paling kiri dan melakukan expand semua non terminal pada
Force karena penulis merasa bahwa dasar teori untuk membahas parsing dengan
metode Brute Force pernah penulis terima selama kuliah. Sedangkan parsing
dengan metode Recursive Desent Parser dasar teori untuk membahasnya belum
pernah penulis terima karena ini tentang compiler (dasar teorinya misal membahas
alamat untuk item data. Pascal memungkinkan untuk membuat variabel yang akan
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
menunjuk ke data dengan tipe khusus. Variabel pointer mengandung alamat dari
B. Perumusan Masalah
Force itu?
Brute Force?
C. Pembatasan Masalah
metode Brute Force dengan aturan produksi tata bahasa sebagai berikut:
S → Ba | Ab
A → Sa | AAb | a
B → Sb | BBa | b
D. Tujuan Penulisan
Tujuan yang ingin dicapai adalah ingin lebih memahami dan mendalami
E. Manfaat Penulisan
semakin memahami dan mengerti tentang konsep parsing dengan metode Brute
Pascal.
F. Metode Penulisan
membaca dan mempelajari buku-buku yang berkaitan dengan bahan yang telah
dipilih.
G.Sistematika Penulisan
Pada bab II tentang dasar teori yang isinya membahas Finite State
bahasa regular, Tata bahasa bebas kontrks yang meliputi bahasa-bahasa bebas
Pada Bab III membahas tentang perancangan dan diagram alur program
BAB II
DASAR TEORI
dengan FSA, bukanlah mesin fisik tetapi suatu model matematika dari suatu
sistem yang menerima input dan output diskrit. Finite State Automata merupakan
mesin otomata dari bahasa reguler. Suatu finite state automata memiliki state
yang banyaknya berhingga, dan dapat berpindah-pindah dari suatu state ke state
yang lain. Perubahan state ini dinyatakan oleh fungsi transisi. Jenis otomata ini
terbatas. Teori mengenai finite state automata adalah suatu tool yang berguna
0110
01101
bila data:
0111
01110
6
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
bila suatu saat penerima memperoleh jumlah bit 1 yang genap, misal
10010
pengiriman.
Bisa dibuat sebuah otomata yang akan memeriksa apakah suatu barisan
input memiliki bit 1 dalam jumlah ganjil atau genap. Mesin ini akan mempunyai
dua state, sebut saja sebagai state EVEN (genap) dan state ODD (ganjil).
0 0
EVEN
1
ODD
Pada finite state automata, arti dari bentuk-bentuk seperti yang ada pada
Gambar seperti diatas biasa disebut sebagai graph transisi atau diagram
keadaan (state). Pada gambar diatas state awalnya adalah EVEN. Karena mesin ini
merupakan pemeriksa pariti ganjil, maka himpunan state akhir yang menyatakan
input diterima adalah ODD. Simbol input yang ada {0,1}. Jika mesin
mendapatkan input:
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
1101
101
Meskipun pada contoh diatas state akhirnya hanya satu, pada umumnya
bisa terdapat sejumlah state akhir. Istilah state akhir tidak berarti komputasi (disini
berupa perpindahan/transisi) berhenti (halt) begitu state akhir tercapai. State akhir
yang diterima.
M=(Q,Σ,δ,S,F), dimana:
Q = himpunan state/kedudukan
δ = fungsi transisi
F adalah jumlah state akhir, jadi jumlah state akhir pada suatu finite state
Q = {ODD,EVEN}
Σ = {0,1}
S = EVEN
F = {ODD}
deterministik,.
selanjutnya disebut dengan DFA, dari suatu state ada tepat satu state berikutnya
untuk setiap simbol masukan yang diterima. Sebagai contoh, misal ada otomata
a a b
b b
q0 q1 q2
a
Q = {q0,q1,q2}
Σ = {a,b}
S = q0
F = {q2}
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
10
δ(q0,a) = q0
δ(q0,b) = q1
δ(q1,a) = q1
δ(q1,b) = q2
δ(q2,a) = q1
δ(q2,b) = q2
state dan input. Tabel transisi dari fungsi transisi diatas sebagai berikut:
δ a b
q0 q0 q1
q1 q1 q2
q2 q1 q2
Tabel 1.1
sebuah state berikutnya yang unik untuk setiap pasangan state-input. Jadi untuk
sebuah state dan input yang berlaku, bisa ditentukan tepat satu state berikutnya.
apapun state saat itu atau inputnya, selalu terdapat satu dan hanya satu state
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
11
berikutnya. State berikutnya itu ditentukan oleh informasi yang ada di dalam
pasangan state-input.
Suatu string x dinyatakan diterima bila δ(S,x) berada pada state akhir.
Biasanya secara formal dikatakan bila M adalah sebuah finite state automata,
Misal pada contoh gambar 2.1 diberi input string ‘abb’ pada mesin
tersebut. Maka :
misal pada ontoh gambar 2.1 di beri input string ‘baba’ pada mesin tersebut,
maka:
karena q1 tidak termasuk state akhir, maka ‘baba’ tidak berada dalam L(M).
a,b a
q0 q1
b
δ a b
q0 q1 q1
q1 q1 q0
Tabel 1.2
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
12
Jadi dari suatu gambar/ diagram transisi dapat dibuat tabel transisinya.
δ a b
q0 q0 q1
q1 q0 q0
Tabel 1.3
Dengan S = q0
F = {q1}
Maka diagram transisinya dapat dilihat pada gambar 2.3 berikut ini:
a
b
q0 q1
a,b
gambar 2.3
terdapat 0,1, atau lebih busur keluar (transisi) berlabel simbol input yang sama.
state-input, bisa memiliki nol atau lebih pilihan untuk state berikutnya.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
13
Contoh:
a,b
a,b
q0 q1
a
gambar 2.4 mesin otomata NFA
Dari gambar 2.4, dari state q0 terdapat dua busur keluar yang berlabel
input ‘a’. Dari state q0 bila mendapat input ‘a’ bisa berpindah ke state q0 atau q1,
δ(q0,a)= {q0,q1}
δ a b
q0 {q0,q1} {q1}
q1 {q1} {q1}
Tabel 2.1
Perlu diperhatikan bahwa cara penulisan state hasil transisi pada tabel transisi
untuk Non-deterministic Finite State Automata digunakan kurung kurawal ‘{‘ dan
terdapat suatu urutan sehubungan dengan input string tersebut dari state awal
menuju state akhir. Misalkan saja L(M) adalah bahasa yang diterima oleh Non-
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
14
Deterministic Finite Automata pada gambar 2.4. Tentukan apakah string ‘ab’
semua kemungkinan yang ada sampai terdapat satu yang mencapai state akhir.
δ(q0,ab) = δ(q1,b) = q1
Finite Automata tersebut dibuktikan dulu suatu urutan transisi yang menuju state
akhir .
b a
q0 q1
gambar 3.2
Terlihat tidak ada busur keluar dari state q1 untuk simbol input ‘b’ atau
δ(q1,b) = φ
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
15
Tabel 2.2
δ a b
q0 {q1} {q0}
q1 {q0} φ
Sebuah bahasa dinyatakan regular jika terdapat finite state automata yang
matematika dari suatu sistem yang menerima input dan output diskrit dan juga
merupakan mesin otomata dari bahasa reguler. Bahasa-bahasa yang diterima oleh
suatu finite state automata bisa dinyatakan secara sederhana dengan ekspresi
memberikan suatu pola untuk untai dari suatu bahasa. Semua untai yang cocok
dengan sebuah pola tertentu, dan hanya untai-untai itu, yang menyusun bahasa
bahasa sebagai himpunan semua untai yang menggerakkan untai dari kedudukan
dari segi teoritis karena membentuk koleksi terkecil dari bahasa-bahasa atas ∑
16
untuk a Є ∑.
kosong, semua bahasa singleton, termasuk { ε }, dan semua bahasa yang dibentuk
Contoh:
{ ab } adalah reguler.
{ ai | i ≥ 0 } adalah regular.
17
Notasi dari ekspresi regular yaitu sebagai berikut: ‘*’, ‘+’, ‘+’, ‘∪’, ‘.’
• * yaitu karakter asterisk, berarti bisa tidak muncul, bisa juga muncul
ER: ab*cc
ER: 010*
ER: a + d
ER: a * ∪ b *
Contoh string yang dibangkitkan: a, b, aa, bb, aaa, bbb, aaaaa, bbbb
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
18
ER: ( a ∪ b )
ER: ( a ∪ b )*
Contoh string yang dibangkitkan: a, b, ab, ba, abb, bba, aaaa, bbbb
ER: 01 * 0
himpunan semua untai yang menggerakkan dari state awal ke salah satu state
a
Q2
ε b
a
Q0 Q1 Q4
b Q4
qq
ε Q3
ε b
sebuah lintasan diambil dari kedudukan awal ke yang lain, “keluaran” simbol itu
19
Untai yang dipakai dalam bahasa regular a(a* ∪ b*)b terdiri dari sebuah
a yang diikuti oleh suatu “bagian akhir”. Misal E dianggap bagian akhir, secara
simbolis observasi ini menyajikan S → aE. Anak panah (→) bisa dibaca seperti
“dapat ” atau “terdiri dari”. Bagian akhir dari sebuah untai demikian terdiri dari
satu dari dua susunan para a dan para b. Jadi bisa ditulis E → A dan E → B untuk
menunjukkan kemungkinan ganda untuk E. Dua susunan dari para a dan para b
sebuah untai dari para a diikuti oleh sebuah b atau sebagai B → bB bersama
dengan B → b, yang menunjukkan sebuah untai para b diikuti oleh b yang lain.
S → aE
E→A
E→B
A→b
A → aA
B→b
B → bB
20
berikut:
1. S → aE
2. E → A | B
3. A → aA | b
4. B → bB | b
aturan 1 untuk mandapatkan aE, kemudian aturan 2 untuk mendapatkan aA, dan
kemudian aturan 3 untuk mendapatkan aaA dan aaaA; akhirnya bagian kedua dari
“membangkitkan”.
S, P), dimana:
∑ = sebuah abjad
simbol)
21
Contoh:
∑ = { a, b }
N = { S, A }
P : S → bA
A → aaA| b | ε
L (G) memuat semua untai yang berbentuk ba2nb dan ba2n. yaitu L (G) =
b (a2)*(b ∪ ε).
G = ( N, ∑, S, P )
terminal-terminal )
22
tata bahasa regular adalah sebuah CFG, didapatkan juga bahwa suatu tata bahasa
Seperti sebuah tata bahasa regular, sebuah CFG adalah sebuah cara yang
juga menggunakan notasi => untuk menunjukkan aksi dari generasi itu sebagai
lawan pada →, yang merupakan bagian dari sebuah aturan produksi. Ketika
bagian tak terturunkan dari untai itu. Dalam hal tata bahasa-tata bahasa regular,
bagian tak terturunkan itu selalu terjadi pada salah satu ujung. Dalam CFG yang
tidak merupakan tata bahasa-tata bahasa regular bisa terdapat lebih banyak dari
satu bagian tak terturunkan dan bisa terjadi dimana saja dalam untai itu. Ketika
penurunan itu telah lengkap, semua bagian tak terturunkan telah diganti oleh
S → aSb | ε
bahasa-bahasa regular.
mengizinkan ruas kanan dari produksi itu dibentuk dari suatu untai atas N ∪ ∑.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
23
Satu-satunya tempat yang tersisa untuk generalisasi pada ruas kiri dari aturan-
adalah salah satu tata bahasa yang ruas kiri aturan-aturan produksinya itu bisa
dibentuk dari suatu untai tak kosong atas N ∪ ∑, yang memuat suatu nonterminal.
Jadi untuk sebuah tata bahasa frasa-terstruktur, koleksi dari aturan-aturan produksi
P memenuhi:
P ⊆ ( N ∪ ∑ )* N ( N ∪ ∑ )* × ( N ∪ ∑ )*
Tata bahasa-tata bahasa frasa tersruktur juga dikenal sebagai tata bahasa-
grammer ) adalah tata bahasa-tata bahasa frasa terstruktur yang disini dibatasi
sebuah bentuk normal untuk tata bahasa-tata bahasa ini yang setiap produksinya
yang sama banyak dengan tata bahasa-tata bahasa frasa terstruktur, tetapi tata
didalam cara yang dapat diduga. Walaupun demikian, perhatikan bahwa karena
24
pemrograman sering kali dirancang agar konteks sensitif sebagai sebuah cara
Contoh :
S → AA
A → AAA | a | bA | Ab
Tata bahasa bebas konteks diatas dapat menurunkan untai b2aba2ba sebagai
berikut:
kerumitan yang tidak perlu atau aturan produksi yang tidak berarti.
S → A
A → B
B → C
C → D
D → a|A
Tata bahasa bebas konteks tersebut memiliki kelemahan terlalu panjang jalannya
25
Suatu tata bahasa bebas konteks dapat disederhanakan dengan tiga cara
sebagai berikut:
3. Penghilangan produksi ε.
Selanjutnya akan dibahas satu persatu cara penyederhanaan tata bahasa bebas
konteks tersebut.
(berlebihan).
Contoh :
S → aAb | cEB
A → dBE | eeC
B → ff
C → ae
D → h
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
26
penurunan
maka dari tata bahasa bebas konteks diatas, produksi yang useless:
S → cEB
A → dBE
B → ff
D → h
S → aAb
A → eeC
C → ae
S → aBD
B → cD | Ab
D → ef
A → Ed
F → dc
Dari tata bahasa bebas konteks diatas dapat diterangkan sebagai berikut:
27
maka dari tata bahasa bebas konteks tersebut yang useless yaitu:
B → Ab
A → Ed
F → dc
Jadi aturan produksi untuk tata bahasa bebas konteks tersebut setelah
disederhanakan menjadi:
S → aBD
B → cD
D → ef
lagi aturan produksi yang tersisa, apakah semua produksi yang useless sudah
dihilangkan.
Produksi unit adalah produksi dimana ruas kiri dan ruas kanan aturan
Keberadaan produksi unit membuat tata bahasa bebas konteks memiliki kerumitan
Contoh:
S → Cba | D
A → bbC
B → Sc | ddd
C → eA | f | C
D → E | SABC
E → gh
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
28
Penggantian yang dilakukan dari tata bahasa bebas konteks diatas adalah:
D →E menjadi D → gh
C → C dihapus
S → D menjadi S → gh | SABC
S → Cba | gh | SABC
A → bbC
B → Sc | ddd
C → eA | f
D → gh | SABC
E → gh
S → A
S → Aa
A → B
B → C
B → b
C → D
C → ab
D → b
Penggantian yang dilakukan dari tata bahasa bebas konteks diatas adalah:
1). C → D menjadi C → b
3). A → B menjadi A → ab | b
4). S → A menjadi S → ab | b
29
S → ab | b
S →Aa
A → ab | b
B → ab
B → b
C →b
C → ab
D → b
3. Penghilangan Produksi ε.
produksi ε, atau biasa disebut nullable. Prinsip penggantiannya bisa dilihat kasus
berikut:
S → bcAd
A → ε
maka variabel A bisa ditiadakan. Hasil penyederhanaan tata bahasa bebas konteks
menjadi:
S → bcd
S → bcAd
A → bd | ε
30
S → bcAd | bcd
A → bd
Contoh:
S → AB
A → abB | aCa | ε
B → bA | BB | ε
C → ε
A → aCa menjadi A → aa
B → bA menjadi B → bA | b
B → BB menjadi B → BB | B
A → abB menjadi A → abB | ab
S → AB menjadi S → AB | A | B | ε
C → ε, B → ε, A → ε dihapus
S → AB | A | B | ε
A → abB | ab | aa
B → bA | b | BB | B
S → dA | Bd
A → bc
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
31
A → ε
B → c
dilakukan bersama pada suatu tata bahasa bebas konteks, yang nantinya
menyiapkan tata bahasa bebas konteks tersebut untuk diubah ke dalam suatu
Bentuk Normal Chomsky . Bentuk Normal Chomsky tidak penulis bahas. Hal yang
memerlukan perhatian dari tata bahasa bebas konteks adalah penghilangan suatu
tipe produksi bisa menghasilkan produksi tipe yang lain, hal ini didasari
Maka semua produksi yang tidak diinginkan bisa dihapuskan dengan melakukan
• Menghilangkan produksi ε
32
Hasil yang diperoleh nanti adalah tata bahasa yang sudah bebas dari ketiga jenis
produksi tersebut.
Contoh:
S → AA | C | bd
A→ Bb | ε
B→ AB | d
C→ de
• Pertama-tama dilakukan penghilangan produksi ε, sehingga aturan
produksinya menjadi :
S → A | AA | C | bd
A→ Bb
B→ B | AB | d
C→ de
• Selanjutnya penghilangan produksi unit, sehingga aturan produksinya
menjadi:
S → Bb | AA | de | bd
A→ Bb
B→ AB | d
C→ de
• Penghilangan produksi useless, maka hasilnya menjadi:
S → Bb | AA | de | bd
A→ Bb
B→ AB | de
Jadi hasil akhir aturan produksi tidak lagi memiliki produksi ε, produksi unit
33
D. Parsing
simbol awal diganti oleh suatu untai. Setiap nonterminal dalam untai ini, secara
bergantian digantikan oleh untai yang lain, dan seterusnya sampai tinggal tersisa
untai yang hanya terdiri dari simbol-simbol terminal. Selanjutnya tidak ada lagi
terminal. Gambar seperti ini dinamakan pohon penurunan atau pohon penguraian
Sebuah pohon (tree) adalah suatu graph terhubung tidak sirkuler, yang
memiliki satu simpul (node)/vertex disebut akar (root) dan dari situ memiliki
simbol variabel akan diturunkan menjadi terminal, sampai tidak ada simbol
Misal terdapat tata bahasa bebas konteks dengan aturan produksi (simbol
awal S, selanjutnya didalam bahasan ini S digunakan sebagai simbol awal untuk
S → AA
A → AAA | a | bA | Ab
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
34
tersebut simbol awal akan menjadi akar (root). Setiap kali penurunan dipilih
anak akan menjadi simbol terminal. Jadi gambar dari aturan produksi tersebut
adalah:
A A
b A A A A
b A b A a b A
a a a
S → aAS | a
A → SbA | ba
Untuk memperoleh untai ‘aabbaa’ dari tata bahasa bebas konteks diatas
35
1. Dengan penurunan terkiri : S => aAS => aSbAS => aabAS =>
2. Dengan penurunan terkanan : S => aAS => aAa => aSbAa =>
a A S
S b A a
a b a
adalah untuk mencari penurunan yang hasilnya menuju kepada suatu untai yang
ditentukan. Dalam hal ini, perlu untuk melakukan percobaan pemililihan aturan
sebagai berikut:
S → aAd | aB
A→b|c
B → ccd | ddc
S
a B
c c d
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
36
Contoh:
S → Ba | Ab
A → Sa | AAb | a
B → Sb | BBa | b
Dari tata bahasa bebas konteks tersebut diperoleh penurunan untai ‘bbaaaabb’ sebagai
berikut:
S =>Ab => AAbb => SaAbb => BaaAbb =>BBaaaAbb => bBaaaAbb =>
A b
A A b
S a a
B a
B B a
b b
S → aB | bA
A → a | aS | bAA
B → b | bS | aBB
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
37
a B
a B B
a B B b S
b b S b A
a B a
Metode Parsing
2. Penanganan kesalahan
3. Penanganan kode
1. Top Down
38
2. Bottom Up
Pada skripsi ini hanya dibahas parsing dengan metode Top Down Brute
Force.
Metode ini memilih aturan produksi mulai dari paling kiri, dan
melakukan expand semua non terminal pada aturan produksi sampai yang
di-parsing, bisa juga bila terjadi expansi yang salah untuk suatu simbol variabel
maka akan dilakukan backtrack. Algoritma ini membangun pohon parsing yang
top down, yaitu mencoba segala kemungkinan untuk setiap simbol non terminal.
S → aAd | aB
A → b|c
B → ccd | ddc
Misal ingin dilakukan parsing untuk string: ‘accd’. Tahapan yang terjadi
i) S ii) S iii) S
a A d a A d
b
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
39
iv) S v) S vi) S
a A d a B a B
c c c d
backtrack dan penurunan iv) yang dilakukan adalah expansi A → c. karena terjadi
kegagalan maka backtrack lagi, dan ‘naik’ ke atas sampai terjadi penurunan v)
S → aB. Penurunan vi) B → ccd memberikan hasil akhir bahwa ‘accd’ diterima
D.2. Ambiguitas
dalam bagian pada struktur, seperti halnya dengan bahasa-bahasa asli dan
dekomposisi dan jika kontruksi sebagian menentukan arti, maka arti itu adalah
mendua arti. Sebagai contoh dari hal mendua arti yang mengaburkan arti yaitu
A → I := E
I → a | b | c
E → E+E | E*E(E) | I
Dalam tata bahasa diatas simbol-simbol terminal itu telah digaris bawahi.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
40
pernyataan penugasan ini. Ada dua pohon penurunan yang berbeda untuk tata
A A
I := E I := E
a E + E a E * E
I E * E E + E I
b I I I I a
c a b c
Jika dicoba untuk menentukan berapa nilai pada sebelah kanan dari
operator penugasan itu (simbol :=) dihitung, akan terdapat dua hasil yang
tidaklah sama.
Contoh:
S → SbS | ScS | a
nonterminal terkiri yang selalu diperluas. Begitu juga dalam sebuah penurunan
Jadi untuk tata bahasa bebas konteks diatas, penurunan terkiri untuk untai
‘abaca’ yaitu”
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
41
S => ScS => Sca => SbSca => Sbaca => abaca
S c S
S b S a
a a
Dalam tata bahasa berikut ini yang juga menurunkan untai ‘abaca’ :
S => SbS => abS => abScS => abacS => abaca dan
S => SbS => SbScS => SbSca => Sbaca => abaca
Kehadiran dari dua penurunan terkiri dan terkanan yang berbeda ada
hubungannya dengan keberadaan dua pohon penurunan yang berbeda. Jadi sebuah
tata bahasa yang mendua arti dapat dicirikan sebagai salah satu tata bahasa yang
mempunyai dua atau lebih penurunan terkiri dan terkanan yang berbeda untuk
42
S b S
a S c S
a a
Contoh lain dari tata bahasa bebas konteks yang ambigu adalah:
S → aB | bA
A → a | aS | bAA
B → b | bS | aBB
S => aB => aaBB => aabB => aabbS => aabbaB => aabbaaBB =>
S => aB => aaBB => aabSB => aabbAB => aabbaB => aabbaaBB
Pohon penurunannya:
S S
a B a B
a B B a B B
b b S b S a B B
a B b A b b
a B B a
b b
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
43
Jadi untuk menunjukkan bahwa suatu tata bahasa bebas konteks ambigu,
dari satu pohon penurunan. Ambiguitas dapat menimbulkan masalah pada bahasa-
bahasa tertentu, baik bahasa alami maupun pada bahasa pemrograman. Bila suatu
E. Pointer Di Pascal
komputer dimana data yang diwakili oleh nama perubah tersebut disimpan. Pada
saat sebuah program dikompilasi, kompiler akan melihat pada bagian deklarasi
perubah (var) untuk mengetahui nama-nama perubah apa saja yang akan
untuk suatu nama perubah, maka dalam program tersebut perubah yang dimaksud
akan tetap menempati lokasi yang telah ditentukan dan tidak mungkin diubah.
Dengan melihat pada sifat-sifat perubah statis maka banyaknya data yang bias
diolah adalah terbatas. Sebagai contoh, missal diketahui perubah dengan deklarasi
sebagai berikut:
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
44
100X50 = 5000 buah data. Jika tetap nekat untuk menambah data pada perubah
tersebut, eksekusi program akan terhenti karena deklarasi lariknya kurang. Jika
ingin mengolah data yang banyaknya tidak bias dipastikan sebelumnya, maka
pada saat diperlukan, yaitu setelah program dieksekusi. Dengan kata lain, pada
Kompiler hanya akan mencatat bahwa suatu perubah akan diperlakukan sebagai
dinamis tersebut bias dihapus pada saat program dieksekusi, sehingga ukuran
pengingat akan selalu berubah. Hal inilah yang menyebabkan perubah dinamakan
pointer yang artinya menunjuk ke sesuatu. Dalam perubah dinamis, nilai data
45
Bentuk umum:
Contoh:
Var
P : ^integer;
hanya perlu ditambahkan simbol topi (^) sebelum tipe datanya. Simbol topi
Bentuk Umum:
Type
<NamaPointer>= <^NamaRecord>;
<NamaRecord> = Record
<item1> : <TipeData1>;
<item2> : <TipeData2>;
…..
<itemN> : <TipeDataN>;
End;
Var
<Namavar> : <NamaPointer>;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
46
Contoh:
Type
Str30 = String[30];
Point = ^Data;
Data = record
Nama : string[24];
Alm : string[30];
Pekerjaan: string[30];
End;
Var
P1,P2 : point;
A,B,C : string[30];
New (perubah);
New(P1);
New(P2);
Maka sekarang dipunyai dua buah simpul yang ditunjuk oleh P1 dan P2.
P1
P2
dalam sembarang cara dengan menggunakan referensi P1^ dan P2^. Sebagai
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
47
contoh, pernyataan berikut akan menyerahkan nilai 2.0 ke item yang ditunjuk
P1^ := 2.0;
P2^ := P1^ + 1.0;
Isi memori dapat digambarkan sebagai berikut:
P1 2.0
P2 3.0
dua variable yang mempunyai tipe sama. Asumsikan P1 dan P2 menunjuk ke item
P2 := P1;
ditunjukkan:
P1 2.0
P2 3.0
Maka isi dari P2 (yang berupa alamat) telah diganti dengan nilai (yang
berupa alamat) yang dikandung dari P1. yang terjadi adalah item data yang
sebelumnya ditunjuk dengan P2 masih ada, tetapi tidak ada cara untuk mengakses
isi tersebut.
Salah satu keistimewaan yang sangat berguna pada tipe data pointer
akan sangat penting dalam menerapkan struktur data abstrak. Sebagai contoh,
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
48
andaikata akan membuat dua record dengan cara seperti itu bahwa satu record
pertama
Salah satu cara untuk membuat nilai awal (inisialisasi) elemen dengan
menggunakan:
New(Pertama);
Pertama^.Nama:= ’Ina’;
Pertama Ina ?
(bagian pointer pada record) belum didefinisikan pada tahap ini. Sekarang dapat
membuat record lain untuk data berikut dengan menggunakan variable Temp:
New(Temp);
Temp^.Nama:=’Ira’;
Bagian memori sekarang menjadi
Temp
Sekarang adalah melengkapi record yang mengandung ‘Ina’ dan record yang
ditunjuk dengan Temp. Dapat dibuat hubungan tersebut dengan sangat sederhana
sebagai berikut:
Pertama^.Berikut := temp;
Temp
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
49
Temp^.berikut := nil;
Bagian memori tersebut pada saat ini ditunjukkan struktur yang telah komplit:
adalah dengan menggunakan konstanta pointer yaitu nil. Jika variabel pointer
diserahi nilai nil, ini berarti bahwa tidak menunjuk dimanapun juga, artinya
pernyataan
P := nil;
Menyebabkan nilai P diset ke nil. Nilai nil untuk variabel pointer disimbolkan
Hal yang penting untuk mengerti perbedaan antara variable pointer yang
belum didefinisikan dan variabel pointer yang mempunyai nilai, isi dari variabel
yang belum didefinisikan (sama dengan dideklarasikan tapi tidak ada nilainya
sebelum diserahi suatu nilai ke variabel tersebut) tidak diketahui. Prosedur new
membuat item data dan menetapkan nilai pada variabel pointer. Penyerahan nilai
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
50
nil ke variabel pointer juga menetapkan nilai variabel pointer tersebut, tetapi tidak
memori kembali dalam head yang tidak diperlukan, ini dilakukan dengan
Dispose(variable_pointer);
Sebagai contoh, andaikan PtrP1 dan PtrP2 menunjuk item data real,
seperti ditunjukkan:
P1 2.0
P2 3.0
Dispose (PtrP1);
Nilai PtrP1 akan mnjadi nil, dan ruangan yang telah dialokasikan untuk variable
dan dialokasikan kembali jika diperlukan. Pada penunjuk ini diagram memorinya
sebagai berikut:
P1
P2 3.0
dengan PtrP2 dan membebaskan penunjuk data dengan PtrP1. Hal pertama harus
Dispose (PtrP1);
PtrP1 := PtrP2;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
51
Setelah eksekusi prosedur dispose ini, memori akan kelihatan sebagai berikut:
P1
P2 3.0
P1
P2 3.0
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
BAB III
(linked list). Senarai berantai adalah kumpulan komponen yang disusun secara
simpul (node). Dengan demikian setiap simpul dalam suatu senarai berantai
terbagi menjadi dua bagian. Bagian pertama disebut medan informasi, yang berisi
informasi yang akan disimpan dan diolah. Bagian kedua disebut medan
penghubung (link field), yang berisi alamat simpul berikutnya. Penghubung dalam
elemen terakhir selalu mempunyai nilai nil. Ini berguna sebab pada elemen
tersebut tidak ada data yang melewati elemen ini, sehingga penghubung ini tidak
menunjuk kemanapun.
berantai dengan 8 simpul. Setiap simpul digambar dalam dua bagian. Bagian kiri
adalah medan informasi dan bagian kanan adalah medan penyambung, sehingga
adalah suatu pointer yang menunjuk ke simpul berikutnya, sehingga nilai dari
Dari gambar 3.1., pointer awal, yang bukan merupakan bagian dari
52
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
53
(pointer) dari suatu simpul yang tidak menunjuk simpul lain disebut dengan
Awal
b b a a a a b b
Nilai awal pada Temp adalah isi pada kepala. Pada saat nilai pada Temp
tidak sama dengan nil, dapat menggunakan bagian data pada bagian ini
mengganti Temp dengan nilai pada Temp^.berikut yaitu isi pada bagian
penghubung pada elemen sekarang (elemen yang ditunjuk oleh pointer Temp).
harapkan. Sebelum suatu program dibuat, alangkah baiknya kalau dibuat logika/
urut-urutan perintah program dalam suatu diagram yang disebut diagram alur.
3. Mengeluarkan/mencetak hasil
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
54
Diagram alur untuk program parsing yang penulis buat adalah sebagai
berikut:
Start
Inisialisasi aturan
produksi dan ekspresi
Masukkan string
2
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
55
Buat Nleft
SP = SU ya Valid
tidak
ya
SP < SU
tidak
ya Adakah aturan
produksi untuk Nleft
yang belum diuji
tidak
Tidak valid
Selesai
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
56
Catatan :
n = banyaknya string
yang diambil sesuai dengan kondisi yang saat itu terjadi, BENAR atau
SALAH
halaman).
57
Langkah 0 memberi nil pada ChildTree untuk i = panjang anak turun 1 dikerjakan
58
menempatkan nama dalam elemen tersebut dan memberi nilai awal pada bagian
new(Node);
Node^.token := Child[i];
Node^.child := nil;
Pertama ruangan dibuat untuk nama, yang meliputi menyimpan Node dalam
lokasi dan memberi nilai ChildTree pada penghubung. Pointer Temp digunakan
new(Temp);
Temp^.Node := Node;
Temp^.Next := ChildTree;
ChildTree := Temp;
elemen baru.
Root^.Child := ChildTree;
1. Temp = Root^.child
5. End while
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
59
A B C
Root^.child
sebagai berikut:
A B C
Root^.child
Temp
Nilai pada temp tidak nil, sehingga isi elemen sekarang ini (yang
A B C
Root^.child
Temp
Sampai disini nilai awal Temp masih tidak nil, maka menggunakan isi elemen ini
A B C
Root^.child
Temp
Lagi nilai Temp masih belum nil, sehingga data dalam elemen ini
digunakan dan bagian penghubung pada elemen ini menjadi nilai baru pada Temp.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
60
A B C
Root^.child
Temp
Sekarang nilai pada Temp sudah nil, sehingga Daftar telah lengkap
Untuk membuat linked list pada program ini, pertama akan memasukkan
nama dan diakhiri dengan ‘End’. Program akan membuat struktur linked list yang
Pada program ini akan memerlukan record yang mengandung Node dan
record yang mengandung token dan child serta record yang mengandung input
dan result. Dalam program ini memerlukan variabel pointer untuk ptrParseTree,
variabel strSentence yang bertipe string, variabel Expresion yang berupa larik
(array) yang komponennya bertipe char dan banyaknya 255 buah dan variabel
prRules yang berupa larik (array) yang bertipe ^TproductionRule dan banyaknya
255 buah (merupakan variabel yang digunakan untuk pengujian sentence). Tipe
Type
TPtrList = ^TList;
TPtrNode = ^TNode;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
61
TList = record
Node : TPtrNode;
Next : TPtrList;
end;
TNode = record
Token : string;
Child : TPtrList;
end;
TProductionRule = record
Input : string;
Result : string;
end;
Var
{variabel untuk menyimpan data grammar }
intExprCount : Integer;
Expression : array[0..255] of char;
intRuleCount : Integer;
prRules : array[0..255] of ^TProductionRule;
{variabel yang digunakan untuk pengujian sentence }
strSentence : string;
ptrParserTree : TPtrNode;
Program berakhir ketika dimasukkan ‘End’. Program ini akan mencetak isi pada
berikut:
2. Mengecek apakah string dari tree sama dengan string yang diuji
3. Kalau string dari tree lebih panjang dari string yang diuji, maka lakukan
backtrack
4. Kalau string dari tree sama dengan string yang diuji, maka string yang diuji
valid.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
62
5. Jika string dari tree kurang dari string yang diuji,maka kembali ke langkah 1
program parsing ini. Program parsing secara lengkap dapat dilihat dalam listing
program.
Contoh kasus: Misal string yang akan diuji adalah string yang
menurunkan untai ‘abba’, maka pertama kali yang dilakukan adalah melakukan
B a
S b
S b
B a
String yang dibentuk dari pohon untainya tidak sama dengan untai dari string
yang diuji dan jumlah string dari pohon lebih besar dari string yang diuji maka
B a
S b
A b
Jadi string yang dibentuk sama dengan string yang diuji maka valid.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
63
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
BAB IV
PENUTUP
A. Kesimpulan
aturan produksi mulai dari yang paling kiri dan akan melakukan expand semua
variabel pada aturan produksi sampai yang tertinggal adalah simbol terminal.
Metode Brute Force ini, bila terjadi expand yang salah untuk suatu simbol
1. Mencoba untuk semua aturan produksi yang ada sehingga menjadi lambat
Setelah penulis membaca dan belajar lagi maka penulis merasa lebih memahami
pascal.
B. Saran
Dalam program parsing yang penulis buat ini, masih banyak mengalami
kekurangan, karena penulis hanya membuat program parsing dengan satu aturan
produksi saja. Maka penulis menyarankan kepada para pembaca agar dapat
63
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
DAFTAR PUSTAKA
64
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
LAMPIRAN
Listing Program
Program Parsing;
type
TPtrList = ^TList;
TPtrNode = ^TNode;
TList = record
Node : TPtrNode;
Next : TPtrList;
end;
TNode = record
Token : string;
Child : TPtrList;
end;
TProductionRule = record
Expression : string;
Result : string;
end;
var
{variabel untuk menyimpan data grammar }
intExprCount : Integer;
Expression : array[0..255] of char;
intRuleCount : Integer;
prRules : array[0..255] of ^TProductionRule;
procedure Initialize;
{inisialisasi expresi dan aturan produksi yang ada }
var
i : Integer;
begin
intExprCount := 3;
Expression[0] := 'S';{anggap sentence sebagai sebuah}
Expression[1] := 'A';{expresi juga }
Expression[2] := 'B';
intRuleCount := 8;
for i := 0 to intRuleCount - 1 do
new(prRules[i]);
prRules[0]^.Expression := 'S';
prRules[0]^.Result := 'Ba';
prRules[1]^.Expression := 'S';
65
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
66
prRules[1]^.Result := 'Ab';
prRules[2]^.Expression := 'A';
prRules[2]^.Result := 'Sa';
prRules[3]^.Expression := 'A';
prRules[3]^.Result := 'AAb';
prRules[4]^.Expression := 'A';
prRules[4]^.Result := 'a';
prRules[5]^.Expression := 'B';
prRules[5]^.Result := 'Sb';
prRules[6]^.Expression := 'B';
prRules[6]^.Result := 'BBa';
prRules[7]^.Expression := 'B';
prRules[7]^.Result := 'b';
end;
procedure CleanUp;
{Prosedur untuk menghapus aturan produksi dari memori}
var
i : Integer;
begin
for i := 0 to intRuleCount - 1 do
Dispose(prRules[i]);
end;
var
i : Integer;
begin
IsExpression := false;
for i := 0 to intExprCount - 1 do
if Token = Expression[i] then begin
IsExpression := true;
Break;
end;
end;
var
Temp : TPtrList;
MostLeftNode : TPtrNode;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
67
begin
MostLeftNode := nil;
if IsExpression(Node^.Token) then begin
if (Node^.Child = nil) then begin
MostLeftNode := Node;
end else begin
Temp := Node^.Child;
while (Temp <> nil) do begin
MostLeftNode := GetMostLeftExpressionNode(Temp^.Node);
if MostLeftNode <> nil then
Break;
Temp := Temp^.Next;
end;
end;
end;
GetMostLeftExpressionNode := MostLeftNode;
end;
var
ChildTree : TPtrList;
Temp : TPtrList;
Node : TPtrNode;
i : Integer;
begin
ChildTree := nil;
{gunakan downto biar tree yang terbentuk urut sesuai
dengan sentence}
for i := Length(Child) downto 1 do begin
new(Node);
Node^.token := Child[i];
Node^.child := nil;
new(Temp);
Temp^.Node := Node;
Temp^.Next := ChildTree;
ChildTree := Temp;
end;
Root^.Child := ChildTree;
end;
var
Child,
Temp : TPtrList;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
68
begin
Child := Node^.Child;
while Child <> nil do begin
Temp := Child;
if Temp^.Node <> nil then begin
if Temp^.Node^.Child <> nil then
DeleteChild(Temp^.Node);
Dispose(Temp^.Node);
end;
Child := Child^.Next;
end;
Node^.Child := nil;
end;
begin
if Node^.Child <> nil then
DeleteChild(Node);
Dispose(Node);
end;
var
Temp : TPtrList;
Buffer : string;
begin
if Root = nil then begin
GetSentence := '';
end else if Root^.Child = nil then begin
GetSentence := Root^.Token;
end else begin
Buffer := '';
Temp := Root^.child;
while (Temp <> nil) do begin
if (Temp^.Node^.Child <> nil) then
Buffer := Buffer + GetSentence(Temp^.Node)
else Buffer := Buffer + Temp^.Node^.Token;
Temp := Temp^.Next;
end;
GetSentence := Buffer;
end;
end;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
69
var
strTemp : string;
i : Integer;
MostLeftExpr : TPtrNode;
blnResult : boolean;
begin
{ jika sudah tidak ada expresi lagi test}
blnResult := false;
MostLeftExpr := GetMostLeftExpressionNode(Root);
strTemp := GetSentence(Root);
if MostLeftExpr = nil then begin
if (Sentence = strTemp) then
blnResult := true;
end else begin
for i := 0 to intRuleCount - 1 do begin
if (prRules[i]^.Expression = MostLeftExpr^.Token)
then begin
ExpandTree(MostLeftExpr, prRules[i]^.Result);
strTemp := GetSentence(Root);
if (Length(strTemp) > Length(Sentence)) then
DeleteChild(MostLeftExpr)
else
blnResult := DoValidate(Root, Sentence);
end;
if blnResult = true then
break;
end;
end;
DoValidate := blnResult;
end;
var
Root : TPtrNode;
i : Integer;
MostLeft : TPtrNode;
begin
new(Root);
Root^.Token := 'S';
Root^.Child := nil;
Validate := DoValidate(Root, Sentence);
DeleteNode(Root); {bebaskan memori yang dipakai oleh
pohon penelusuran }
end;
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
70
var
strSentence : string;
begin
{ inisialisasi aturan produksi }
Initialize;
write('Masukkan string ?'); readln(strSentence);
if Validate(strSentence) then begin
writeln('String yang dimasukkan Valid ..');
end else begin
writeln('String yang dimasukkan Tidak valid ..');
end;
{ dealokasikan aturan produksi }
CleanUp;
readln;
end.
PLAGIAT MERUPAKAN TINDAKAN TIDAK TERPUJI
71
Output Program
72