Dosen
Mata Kuliah
: Tehnik Kompilasi
Disusun Oleh
Kelas
: R6P
Program Studi
: Teknik Informatika
Universitas Indraprasta
2013
i
BAB I
PENGENALAN TEHNIK KOMPILASI
Teknik kompilasi merupakan teknik dalam melakukan pembacaan suatu program
yang ditulis dalam bahasa sumber, kemudian diterjemahkan ke dalam suatu bahasa lain
yang disebut bahasa sasaran. Dalam melakukan proses penerjemahan tersebut, sudah
barang tentu kompilator akan melaporkan adanya keanehan-keanehan atau kesalahan yang
mungkin ditemukannya. Proses penerjemahan yang dilakukan oleh kompilator ini disebut
proses kompilasi (compiling).
1.
Bahasa Pemrograman
Bahasa pemrograman adalah bahasa yang menjadi sarana manusia untuk
berkomunikasi dengan komputer.Pikiran manusia yang tidak terstruktur harus dibuat
terstruktur agar bisa berkomunikasi dengan computer.
Penggolongan bahasa pemrograman berdasarkan tingkat ketergantungannya
dengan mesin :
1.1 Bahasa Mesin
Bahasa mesin adalah bahasa yang berisi kode-kode mesin yang hanya
dapat diinterpretasikan langsung oleh mesin komputer.Bahasa mesin sering juga
disebut native code (sangat tergantung pada mesin tertentu). Bahasa ini
merupakan bahasa level terendah dan berupa kode biner 0 dan 1.
Keuntungan
: Eksekusi cepat
Kerugian
Kelebihan
1. Eksekusi cepat
2. Masih bisa dipelajari daripada bahasa mesin
3. File hasil sangat kecil.
Kekurangan
1. Mudah dipelajari
2. Mendekati permasalahan yang akan dipecahkan
3. Kode program pendek
Kerugian
1. Eksekusi lambat
1.4 Bahasa yang berorientasi pada masalah spesifik (specific problem oriented).
Bahasa ini adalah bahasa yang digunakan langsung untuk memecahkan suatu masalah
tertentu.
Contoh : SQL untuk aplikasi database dll
2. Translator
Translator (penerjemah) melakukan pengubahan source code / source program (program
sumber) ke dalam target code / object code / object program (program objek). Source code
ditulis dalam bahasa sumber, object code berupa bahasa pemrograman lain / bahasa mesin pada
suatu computer.
b. Interpreter
Input berupa source code yaitu bahasa scripting seperti PHP, Basic, Perl, Javascript, ASP,
Java bytecode, Basic, Matlab, Matematica, Ruby.
Interpreter tidak menghasilkan object code.Hanya menghasilkan translasi internal. Input
dapat berasal dari source code maupun dari inputan program dari user.Source code dan inputan
data user diproses pada saat yang bersamaan.
Pada interpreter, program tidak harus dianalisis seluruhnya dulu, tapi bersamaan dengan
jalannya program.
Keuntungan
Kekurangan
c. Compiler
Istilah compiler muncul karena dulu ada program yang menggunakan subrutin-subrutin atau
pustaka-pustaka untuk keperluan yang sangat khusus yang dikumpulkan menjadi satu sehingga
diistilahkan compiled.
Input berupa source code program seperti Pascal, C, C++. Object code adalah bahasa
assembly. Source code dan data input diproses pada saat yang berbeda.
Compile time adalah saat pengubahan dari source code menjadi object code. Runtime adalah
saat eksekusi object code dan mungkin menerima input data dari user. Output : bahasa assembly.
Kemudian oleh linker dihasilkan file EXE.
Kekurangan
Keuntungan
: eksekusi program lebih cepat, menghasilkan file executable yang berdiri sendiri.
3. Tahaptahap Kompilasi
5
Kompilator (compiler) adalah sebuah program yang membaca suatu program yang ditulis
dalam suatu bahasa sumber (source language) dan menterjemah-kannya ke dalam suatu bahasa
sasaran (target language).
Proses kompilasi dikelompokan ke dalam dua kelompok besar:
1. Tahap Analisa (Front-end)
Menganalisis source code dan memecahnya menjadi bagian-bagian dasarnya. Menghasilkan
kode level menengah dari source code input yang ada.
2. Tahap Sintesa (Back-end)
Membangun program sasaran yang diinginkan dari bentuk antara.
c. Analisa Semantik
d. Pembangkit Kode Antara
e. Code optimization
Analisa Sintaks(parser)
Berfungsi mengambil program sumber (sudah dalam bentuk barisan token) dan menentukan
kedudukan masing-masing token berdasarkan aturan sintaksnya dan memeriksa kebenaran
dan urutan kemunculan token.
Analisa Semantik
Berfungsi menentukan validitas semantiks/keberartian program sumber.Biasanya bagian ini
digabung denganPembangkit kode antara (intermediate code generator).
Code optimation
Berfungsi mengefisienkan kode antara yang dibentuk.
Code generator
Berfungsi membangkitkan kode program target dalam bahasa target yang ekivalen dengan
bahasa sumber .
Contoh :
pernyataan pemberian nilai (assignment) :
position := initial + rate * 60
4. Model Kompilator
Pekerjaan untuk membuat sebuah kompilator untuk suatu bahasa sumber sangat rumit.
Kerumitan serta sifat dari proses kompilasi tergantung pada tingkat keluasan dari bahasa sumber.
Kerumitan
Kompilator
dapatt
dikurangi
jika
perancang
bahasa
pemrograman
Program Sumber
Program Objek
ANALISIS
Penganalisis Leksikal
(Scanner)
Penganalisis
Syntax
SINTESIS
Penganalisis
Semantik
(Parser)
Pembangkit Kode
Pengoptimal Code
(Code Generator)
(Optimizer)
TABEL SIMBOL
5. Mutu Kompilator
5.1 Kecepatan dan waktu proses kompilasi, Tergantung pada :
a. Penulisan algoritma kompilator, yaitu algoritma yang digunakan untuk menuliskan program
kompilator tersebut.
b. Kompilator pengkompilasi, sebuah program khusus yang menghasilkan kompilator tersebut.
5.2Mutu program objek yakni ukuran dan kecepatan eksekusi dari program objek, Tergantung
pada :
Fungsi translasi yang digunakan (cara untuk melakukan perubahan dari source code ke object
code).
5.3 Integrated Environment, yaitu fasilitas-fasilitas terintegrasi yang dimiliki oleh kompilator
tersebut. Misalnya untuk melakukan editing, debugging, maupun testing.
6. Pembuatan Kompilator
Dapat dilakukan dengan :
6.1 Bahasa mesin :
a. Sangat sukar dan sangat sedikit kemungkinannya untuk membuat compiler dengan
bahasa ini, karena manusia susah mempelajari bahasa mesin,
b. Sangat tergantung pada mesin,
c. Bahasa Mesin kemungkinan digunakan pada saat pembuatan Assembler
6.2 Bahasa assembly :
a. Hasil dari program mempunyai Ukuran yang relatif kecil
b. Sulit dimengerti karena statement/perintahnya singkat-singkat, butuh usaha yang besar
untuk membuat
c. Fasilitas yang dimiliki terbatas
6.3 Bahasa tingkat tinggi.
a. Lebih mudah dipelajari
b. Fasilitas yang dimiliki lebih baik (banyak)
9
c. Memiliki ukuran yang relatif besar, misal membuat compiler pascal dengan
menggunakan bahasa C
d. Untuk mesin yang berbeda perlu dikembangkan tahapan-tahapan tambahan.
e. Misal membuat compiler C pada Dos bedasarkan compiler C pada unix
BAB II
Konsep dan Notasi Bahasa
Teori Bahasa
Bahasa adalah kumpulan kalimat.Kalimat adalah rangkaian kata.Kata adalah komponen
terkecil kalimat yang tidak bisa dipisahkan lagi.
Contoh :
Si Kucing kecil menendang bola besar = Bhs Indonesia
The little cat kicks a big ball = Bhs Inggris
for i := start to finish do A[i] := B[i]*sin(i*pi/16.0) = Bhs Pascal
10
Huruf besar akhir alfabet melambangkan simbol terminal atau non terminal, misal X, Y,
Z
f. Huruf kecil akhir alfabet melambangkan string yang tersusun atas simbol-simbolterminal,
misalnya : x, y, z.
g. Sebuah produksi dilambangkan sebagai a b, artinya : dalam sebuah derivasi
dapatdilakukan penggantian simbol a dengan simbol b.
h. Simbol a dalam produksi berbentuk a b disebut ruas kiri produksi sedangkan simbol
bdisebut ruas kanan produksi.Pengertian terminal berasal dari kata terminate (berakhir),
maksudnya derivasi berakhir jika sentensial yang dihasilkan adalah sebuah kalimat (yang
tersusun atas simbol-simbol terminal itu).
11
i. Pengertian non terminal berasal dari kata not terminate (belum/tidak berakhir),
maksudnyaKonsep dan notasi bahasa 3derivasi belum/tidak berakhir jika sentensial yang
dihasilkan mengandung simbol nonterminal.
j. String adalah deretan terbatas (finite) simbol-simbol. Sebagai contoh, jika a, b, dan c
adalahtiga buah simbol maka abcb adalah sebuah string yang dibangun dari ketiga
symbol tersebut.
k.
didefinisikansebagai cacahan (banyaknya) simbol yang menyusun string tersebut.
l. String hampa adalah sebuah string dengan nol buah simbol. String hampa
12
Contoh :
Begin
A := 1;
B := A + 2
END
b. Diagram State
Digunakan untuk mendapatkan token, mempermudah melakukan analisis lexical
Token adalah simbol terminal dari teori bahasa dan automata
3. Notasi BNF
13
4. Diagram Syntax
Diagram sintaks merupakan alat bantu dalam pembentukan parser / analisis sintaks. Notasi
yang terdapat dalam diagram sintaks :
a. Empat persegi panjang melambangkan simbol variabel / non terminal.
b. Bulatan melambangkan simbol terminal
Misalnya :
-E
14
BAB III
BAHASA REGULER
A.
terminal,
simbol
non-terminal,
simbol
awal
yang
dibatasi
dengan masing-masing dan adalah string-string yang dapat terdiri dari simbol Non
terminal atau pun simbol terminal, atau : , (N)*
maka masing-masing kelas tata-bahasa dibatasi sebagai berikut:
1.
15
2.
3.
4.
C.
EKSPRESI REGULER
Sebelum memasuki bahasan tentang ekspresi regular dan bahasa regular, dapat
dinyatakan suatu kenyataan berikut. Jika adalah suatu himpunan abjad (yang tentu saja
jumlahnya terhingga), maka :
1.
* = himpunan seluruh string yang dapat disusun dari abjad dalam (seperti yang
telah disampaikan dalam bab II) adalah berjumlah TAK HINGGA (countably
inifinite).
2.
Kumpulan dari semua bahasa yang dapat dibangkitkan dari abjad dalam berjumlah
tak terhitung (uncountably)Selanjutnya ekspresi regular dapat didefinisikan secara
rekursif dari definisi-definisiberikut :
16
2.
3.
4.
Dari definisi tentang ekspresi regular selanjutnya dapat dituliskan beberapa akibat
logis, berdasarkan aturan-aturan dalam teori himpunan, sebagai berikut :
Jika a,b,c adalah ekspresi regular dalam
1.
ab = ba
2.
a = a
3.
a a = a
4.
(a b) c = a (b c)
5.
a= a = a
a= a =
7.
(ab) c = a (bc)
8.
A (b c) = ab ac = dan (a b) c = ac bc
9.
D.
17
Jawab :
Untuk menurunkan bahasa dari suatu grammar yang diketahui, maka seluruh
kemungkinan penurunan yang dapat dilakukan oleh grammar tersebut harus dilakukan.
String-string yang dihasilkan dihimpun membentuk suatu bahasa dari grammar tersebut.
Untuk mempermudah pelacakan, tetapkan cacah aturan produksi yang ada , dalam
grammar tersebut ada 7 aturan produksi, yaitu :
E.
1.
SaS ;
2.
SaB ;
3.
SA ;
4.
Bb;
5.
BbB;
6.
B;
7.
Aa
2.
Ada dua jenis automata hingga : deterministik (AHD, DFA = deterministic finite
automata) dan non deterministik (AHN, NFA = non deterministik finite automata).
-
AHN : transisi stata AH akibat pembacaan sebuah simbol bersifat tak tentu.
M(AHN) : K V T 2K
18
1.
V T = {a, b}
S = q0
q0
q0
q1
Z = {q0, q1}
q1
q0
q2
q2
q2
q2
Contoh kalimat yang diterima AHD : a, b, aa, ab, ba, aba, bab, abab, baba
Contoh kalimat yang tidak diterima AHD : bb, abb, abba
AHD ini menerima semua kalimat yang tersusun dari simbol a dan b yang tidak
mengandung substring bb.
2.
S = q0
q0
{q 0 , q 1 }
{q 0 , q 2 }
{q 0 , q 3 }
Z = {q 4 }
q1
{q 1 , q 4 }
{q 1 }
{q 1 }
q2
{q 2 }
{q 2 , q 4 }
{q 2 }
19
q3
{q 3 }
{q 3 }
{q 3 , q 4 }
q4
Contoh kalimat yang diterima AHN di atas : aa, bb, cc, aaa, abb, bcc, cbb
Contoh kalimat yang tidak diterima AHN di atas : a, b, c, ab, ba, ac, bc
Fungsi transisi M sebuah AHN dapat diperluas sebagai berikut :
1.
2.
3.
b.
20
BAB IV
ANALISA LEKSIKAL
Bahasa Sumber
Bahasa adalah kumpulan kalimat. Kalimat adalah rangkaian kata. Kata adalah unit
terkecil komponen bahasa yang tidak bisa dipisah-pisahkan lagi. Dalam bahasa pemrograman
kalimat lebih dikenal sebagai ekspresi sedangkan kata sebagai token.
Perancangan sebuah bahasa harus memperhatikan tiga aspek berikut :
1.
spesifikasi leksikal,
2.
spesifikasi sintaks
3.
aturan-aturan semantik
Dalam spesifikasi leksikal biasanya digunakan grammar regular (GR) dalam bentuk ekspresi
regular (ER). Sebagai contoh pola token identifier ditentukan oleh grammar regular berikut
:\
IaAbAzAabz,
AaAbAzA0A1A9Aabz01
yang ekuivalen dengan ekspresi regular berikut :
I = (abz)( abz019)* = huruf(hurufangka)*
Dalam spesifikasi sintaks biasanya digunakan context free grammar (CFG). Sebagai contoh
ekspresi if-then E adalah :
E if L then, L IOA, I = huruf(hurufangka)*, O <=><=>=, A 019.
kesatuan
ini
melakukan penerjemahan
masukan menjadi bentuk yang lebih berguna untuk tahap-tahap kompilasi berikutnya.
Analisa Leksikal merupakan antarmuka antara kode program sumber dan analisa sintaktik
(parser). Scanner melakukan pemeriksaan karakter per karakter pada teks masukan,
memecah
sumber
program
menjadi
bagian-bagian
21
disebut
Token.
Analisa Leksikal
simbol-simbol
operator,angka,
dan
seterusnya menghasilkan suatu Token Leksikal yang akan digunakan pada Analisa Sintaktik.
Model dasar untuk membentuk suatu Analisa Leksikal adalah Finite- State Automata.
program sumber
tersebut
dilewatkan ke parser. Analisa Leksikal harus mengirim token ke parser. Untuk mengirim token,
scanner harus mengisolasi barisan karakter pada teks sumber yang merupakan 1 token
valid. Scanner juga menyingkirkan informasi seperti komentar, blank, batas-batas baris dan
lain-lain yang tidak penting (tidak mempunyai arti) bagi parsing dan Code Generator.
Analisa Sintaktik dapat memasukkan
mengidentifikasi sebagai
Type atau typedef, sehingga analisa leksikal dapat memeriksa tabel simbol untuk menentukan
apakah lexeme adalah tipe token atau identifier.
22
Terjadi interaksi antara scanner dan parser. Scanner dipanggil saat parser memerlukan token
berikutnya.
-
Scanner
memproses
secara
terpisah,
dilakukan
sebelum
parsing.
Hasil
scanner
Pengenalan Token
grammar. Menspesifikasikan
aturan-aturan
pembangkit token-
Pada pemodelan analisa leksikal sebagai pengenal yang menerapkan finite automata, analisa
leksikal tidak cuma hanya melakukan mengatakan YA atau TIDAK.
d.
Hanya sedikit kesalahan yang diidentifikasi di analisa leksikal secara mandiri karena analisa
leksikal benar-benar merupakan pandangan sangat lokal terhadap program sumber. Bila
ditemui situasi dimana analisa leksikal tidak mampu melanjutkan proses karena tidak ada pola
token yang cocok, maka terdapat beragam alternatif pemulihan, yaitu:
-
23
Input Buffering
Perancangan analisa leksikal seharusnya dapat membuat buffering masukkan yang
membantu mempercepat proses pembacaan dari file serta mempunyai fleksibelitas yang
tinggi agar analisa leksikal tidak bergantung platform sehingga mempunyai portabilitas
yang tinggi.
Membangun Analisa Leksikal
Scanner diimplementasikan dengan Automata Hingga Deterministik (AHD). Pada
kuliah Teori Bahasa dan Automata (atau Pengantar Automata, Bahasa Formal, dan
Kompilasi) telah dipelajari siklus transformasi : GR ER AHN AHD GR.
Token
Token merupakan unit atau elemen dasar bahasa komputer (seperti 'kata' di bahasa
manusia), dimana unit tersebut tidak terbagi lagi. Token merupakan bagian hasil dari pemecahan
sumber program yaitu penerjemahan lexeme pada saat melakukan scanner.
Token mereprentasikan nama :
identifier -> nama variabel, fungsi, tipe atau nama yang didefinisikan pemakai.
Keyword
literal string
operator
label
simbol tanda -> tanda kurung, koma, titik koma.
24
BAB V
TATA BAHASA KONTEKS FREE
R => {}
R => (R)
R => RR
Contoh TBBK untuk palindrom:
S => R
R => {} a b
R =>aRa bRb
Contoh TBBK:
S => aS
S =>bT
T => a
Maka misalkan untuk string aabamaka TBBK diatas dapat diturunkan menjadi :
S > aS
S => aaS
S => aabT
S => aaba
Artinya string aabacocok dan diterima oleh TBBK diatas.
a. Tata Bahasa Konteks Free dan hubungannya dengan Parcer atau ebagai
Penganalisa Syntax
CFG menjadi dasar dalam pembentukan suatu parser/proses analisis sintaksis.
Parser adalah sebuah program, biasanya bagian dari sebuah compiler ,yang menerima input
dalam bentuk instruksi program sumber secara sekuensial,perintah-perintah online yang
26
27
diperluas terlebih
dahulu.
Misal : Tata bahasa sbb :
S aAS | a
A SbA | ba
Untuk memperoleh untai aabbaa dari tata bahasa diatas dilakukan dengan cara :
Penurunan terkiri: S => aAS => aSbAS => aabAS => aabbaS => aabbaa
Penurunan terkanan : S => aAS => aAa => aSbAa => aAbbaa => aabbaa
AMBIGUITAS
Ambiguitas terjadi bila terdapat lebih dari satu pohon penurunan yang berbeda untuk
memperoleh suatu untai.Definisi Syntax itu sendiri dalam suatu bahasa pemrograman adalah satu
himpunan peraturan yang menjelaskan bagaimana simbol-simbol bahasa dapat dirangkai
bersama untuk membentuk pernyataan(statement)yang berarti.
b. Derivasi dan Pohon Derivasi
Dalam ilmu linguistik, derivasi adalah adalah proses pembentukan kata yang
menghasilkan leksem baru (menghasilkan kata-kata yang berbeda dari paradigma yang berbeda);
Pembentukan derivasi bersifat tidak dapat diramalkan. Konsep derivasi berkaitan dengan kaidah
sintaktik, tidak otomatis, tidak sistematik, bersifat optional/sporadis, serta mengubah identitas
leksikal.
Contoh pola derivasi bahasa Inggris dan akhiran mereka:
kata sifat-ke-kata benda: -ness (slow slowness)
kata sifat-ke-kata kerja: -ise (modern modernise) dalam Inggris Britania atau -ize
(archaic archaicize) dalam Inggris Amerika dan ejaan Oxford
28
Pohon derivasi merupakan suatu untai terminal yang tersusun dalam bentuk tree yang
merupakan suatu himpunan produksi dengan cara melakukan sederetan produksi menggunakan
produksi yang ada.
Pohon derivasi ini dapat diterapkan pada suatu ekspresi string ataupun pada ekspresi
aritmatika.
Pohon derivasi pada ekspresi string
Rumus :
<kalimat> <subyek><predikat>
<subyek> <sandang><benda><keadaan>
<predikat> <kerja><obyek>
<obyek> <benda><keadaan>
Pohon derivasi pada ekspresi aritmatika
Ada beberapa ketentuan yang sering dipakai dalam suatu penyusunan pohon derivasi
untuk ekspresi aritmatika
Rumus :
<ekspresi> <ekspresi><asop><suku> <suku>
<suku> <suku><mdop><faktor> <faktor>
<faktor> ( <ekspresi> ) operand
<asop> + <mdop> * div
Contoh : Si adik kecil menendang bola besar.
29
c.
30
S C => S dd | ef
Maka hasilnya adalah sbb :
S Sb
S dd | ef
C dd
C ef
D dd
3. Penghilangan Produksi Empty ( )
Definisi produksi empty adalah produksi kosong, (dengan bentuk ) penghilangan dapat
dilakukan dengan penggantian produksi yang memuat variabel yang menuju ke .
Langkah Penyederhanaannya :
Hilangkan simbol yang terdapat empty ( ) dalam himpunan produksi
Simbol variabel tidak di hapus jika terdapat cabang terminal / variabel yang saling berhubungan
Buat himpunan dengan simbol yang dihilangkan dan yang tidak
Contoh :
S bcAd
Ae
Maka variabel A bisa di hilangkan, sehingga menjadi :
S bcd
32
Kasus lain :
S bcAd
A bd |
Maka hasilnya akan menjadi :
S bcAd | bcd
A bd
Karena A bukan satu-satunya produksi dari A
Kasus lainya :
S Ab | Cd
Ad
C
Hasil penyederhanaan sebagai berikut :
S Ab | d
Ad
2. Parcer (Penganalisa Syntax)
33
Gambar penguraian kalimat di atas membentuk struktur pohon, yang disebut pohon sintaks dari
kalimat.Disini kalimat dibagi-bagi berdasar jenis dan fungsi kata.
Posisi Penganalisa Sintaks (Parser) dalam proses kompilasi adalah sebagai berikut :
- Deretan token : dihasilkan oleh Penganalisa Leksikal (Scanner)
- Pohon parse : suatu pohon dimana akarnya (root) adalah simbol awal grammar
(starting symbol), setiap node dalam (inner node) adalah simbol nonterminal, dan daunnya (leaf)
dibaca dari kiri ke kanan adalah deretan token masukan. Pohon parse ini dibentuk berdasarkan
aturan grammar yang ditetapkan untuk parser.
- Kesalahan sintaks : terjadi jika pola deretan token tidak memenuhi ketentuan pola yang telah
ditentukan grammar untuk parser.
b. Metode Parsing
Parsing adalah proses menganalisa urutan token dengan tujuan untuk menentukan struktur tata
bahasanya dibandingkan dengan tata bahasa normal yang diberikan Proses ini secara formal
disebut analisis sintaks.
Parser adalah sebuah program komputer yang menjalankan tugas ini,Parsing dapat dilakukan
dengan cara :
34
a. Penurunan terkiri (leftmost derivation) : simbol variable yang paling kiri diturunkan (tuntas)
dahulu
b. Penurunan terkanan (rightmost derivation): variable yang paling kanan diturunkan (tuntas)
dahulu
Misalkan terdapat ingin dihasilkan string aabbaa dari
context free language: S a AS | a,
A SbA | ba
Penurunan kiri :
S => aAS
=>aSbAS
=>aabAS
=>aaabbaS
=>aabbaa
Penurunan kanan :
S => aAS
=>aAa
=>aSbAa
=>aSbbaa
=>aabbaa
Misalnya: S -> aB | bA
A -> a | aS |bAA
B -> b | bS | aBB
35
S =>Sd
A => Aad
Menyebabkan pohon tumbuh ke kiri
Contoh Pohon
S => aAc
A => Ab {}
TBBK Rekursif Kanan
TBBK Rekursif Kanan: TBBK yang memiliki simbol non terminal di ruas kanan dari simbol non
terminal yang ada di ruas kiri.
Contoh:
S => dS
B => adB
Membuat pohon sintaks melebar ke kanan.
a. Parssing Dengan Bruteforce
Metode ini memilih aturan produksi mulai dari paling kiri, dan melakukan
expand semua non terminal pada atuan produksi sampai yang tertinggal adalah
simbol terminal.
Contoh:
S => aAd aB
A => b c
B =>ccd ddc
Misal ingin memparsing : accd.
37
S => aAd
S =>abd : gagal, maka dilakukan backtrack
S =>acd : gagal, maka dilakukan backtrack
S => aB
S =>accd : berhasil!
Kelemahan Brutal Force :
1.Mencoba untuk semua aturan produksi yang ada sehingga lambat (rentan
waktu eksekusi tidak jelas).
2.Menyulitkan untuk melakukan pemulihan kesalahan.
3.Memakan banak memori karena perlu mencatatbackuplokasibacktrack
b. Parsing dengan Recursive Descent Parser
Recursive Descent Parser adalah salah satu cara untuk mengaplikasikan bahasa bebas
konteks untuk melakukan analisis sintaksis suatu source code.
Di sini simbol terminal maupun symbol variabelnya sudah bukan sebuah karakter, tetapi
berupa besaran leksi sebagai simbol terminalnya dan besaran sintaks sebagai simbol variabelnya.
Ciri dari recursive descent parser yant menonjol adalah secara rekursive menurunkan
sebuahvariabeldari awal sampai bertemu terminal dan tidak pernah mengambil token secara
mundur serta sangat tergantung pada algoritma scan dalam mengambil token.
Parsing dengan Recursive Descent Parser
a.
Besaran leksikal sebagai simbol terminalnya, besaran syntax sebagai simbol variablenya
/non terminalnya
d. Dengan cara penurunan secara recursif untuk semua variabel dari awal sampai ketemu
terminal
38
39
BAB VII
ANALISA SEMANTIK, KODE ANTARA DAN PEMBANGKITAN KODE
1.
ANALISA SEMANTIK
Kata semantik berasal dari Bahasa Yunani: semantikos,artinya memberikan tanda,
penting, dari kata sema, tanda) adalah cabang linguistik yang mempelajari makna yang
terkandung pada suatu bahasa, kode, atau jenis representasi lain.
Analisis semantik berperan dalam memeriksa kesalahan-kesalahan yang bersifat
semantik. Salah satu peranan analisis semantik yang penting adalah pemeriksaan tipe
variabel. Contohnya operator * hanya digunakan untuk operand dengan tipe integer
ataupun real. Sedangkan operator and, or, digunakan hanya untuk operand dengan dengan
tipe boolean.
Jadi, analisis semantik adalah proses setelah melewati proses scanning dan
parsing. Pada tahap ini dilakukan pengecekan pada struktur akhir yang telah diperoleh dan
diperiksa kesesuaiannya dengan komponen program yang ada. Secara global, fungsi dari
semantic analyzer adalah untuk menentukan makna dari serangkaian instruksi yang
terdapat dalam program sumber.
A := (A + B)*(C + D)
Contoh :
Fungsi ini terkait dengan tabel simbol. Pengecekan yang dilakukan oleh analisis
semantik adalah sebagai berikut :
a)
Duplikasi : pada tahap ini dilakukan pengecekan apakah sebuah nama terjadi
pendefinisian lebih dari dua kali. Pengecekan dilakukan pada bagian pengelola
blok.
2.
b) Memeriksa tipe. Melakukan pemeriksaan terhadap kesesuaian tipe dalam statementstatement yang ada. Misalkan bila terdapat suatu operasi, diperiksa tipe operand.
Contohnya bila ekspresi yang mengikuti instruksi IF berarti tipenya boolean, akan
diperiksa tipe identifier dan tipe ekspresi. Bila ada operasi antara dua operand, maka
tipe operand pertama harus bisa dioperasikan dengan operand kedua.
Teknik-teknik pendeskripsian Semantik bahasa pemrograman:
a.
Operational Semantic
Pendekatan ini mendefinisikan suatu mesin buatan (abstract) dengan instruksiintruksi promitif, tidak perlu realistik, tetapi cukup sederhana supaya tidak muncul
kesalahpahaman. Deskripsi semantik dari bahasa pemrograman menentukan suatu
traslasi ke kode.
b.
Denotational Semantic
Pada pendekatan ini, diberikan suatu fungsi yang memetakan program-program
komputer yang ditunjuk kedalam bentuk nilai-nilai abstrak secara matematika
(angka, nilai, kebenaran, fungsi matematika).
c.
Axiomatic Semantic
Pendekatan ini mendefinisikan suatu tindakan program yang dibangun dengan
properti logika yang menyimpan status komputer sebelum dan sesudah eksekusi.
d.
Algebraic Semantic
Pendekatan ini dipertimbangkan suatu objek komputasi yang menjadi syarat-syarat
dalam aljabar multi-sorted. Program mengimplementasikan fungsi yang dapat
diwujudkan dengan suatu persamaan diantara syarat-syarat tersebut.
e.
41
Pohon sintaks yang dihasilkan digunakan untuk semantics analiyser yang bertugas
untuk menentukan maksud dari program sumber, misalnya operator penjumlahan
maka semantics analiyser akan mengambil aksi apa yang harus dilakukan.
2.
3.
4.
Melakukan pengecekan pada struktur akhir yang telah diperoleh dan diperiksa
kesesuainnya dengan komponen program yang ada.
5.
Menghasilkan suatu kode objek yang dapat dieksekusi dalam translasi sederhana,
tetapi biasanya bentuk dari kode objek yang dapat dieksekusi ini merupakan bentuk
internal dari final program eksekusi, yang kemudian dimanipulasi oleh tahap
optimisasi dari translator sebelum akhirnya kode eksekusi benar-benar dihasilkan.
6.
7.
8.
2.
KODE ANTARA
Pembentukan kode antara merupakan tahap lanjutan setelah analisis semantik.
Hasil pembentukan kode antara dapat dianggap sebagai program dengan instruksi-instruksi
bahasa mesin abstrak. Bentuk representasi kode antara harus mudah pembuatannya dan
mudah diterjemahkan dalam bahasa tujuan. Salah satu bentuk representasi kode antara
adalah kode tiga alamat. Misalnya, suatu kalimat matematik a:= b * c + d memiliki
bentuk kode tiga alamat sebagai berikut :
t1 := b * c t2 := t1 + d a := t2
Representasi kode tiga alamat memiliki bentuk yang menyerupai kode dalam
bahasa Assembly, sehingga memudahkan proses penterjemahannya, jika bahasa tujuan
adalah bahasa Assembly. Bentuk kode tiga alamat di atas memiliki karakteristik:
mengandung paling banyak tiga operand dan dua operator, serta memiliki variabel
42
sementara. Bentuk lain dari representasi kode antara adalah dalam bentuk representasi
grafik, seperti pohon maupun graf. Salah satu manfaat pembentukan kode antara adalah ia
berfungsi sebagai input untuk proses optimisasi.
Kode antara/Intermediate code merupakan hasil dari tahapan analisis, yang dibuat
oleh kompilator pada saat mentranslasikan program dari bahasa tingkat tinggi. Terdapat
dua macam kode antara, yaitu Notasi Postfix dan N-Tuple. Kegunaan dari kode antara
sebagai berikut:
1.
2.
3.
mesin abstrak tertentu. Dua sifat yang harus dipenuhi oleh kode antara adalah :
1.
2.
43
3.
NOTASI POSTFIX
Sehari-hari kita biasa menggunakan operasi dalam notasi infix (letak operator di
tengah). Pada notasi Postfix operator diletakkan paling akhir maka disebut juga dengan
notasi Sufix atau Reverse Polish.
Sintaks notasi Postfix :
<operan><operan><operator>
Misalkan ekspresi :
(a + b)*(c + d)
Kita dapat mengubah instruksi kontrol program yang ada ke dalam notasi Postfix.
Misal :
IF<exp>THEN<stmt1>ELSE<stmt2>
label1
<stmt2>
label2
Keterangan :
BZ
BR
= branch
{bercabang/meloncat tanpa ada kondisi yang dites}
44
Arti dari notasi Postfix di atas adalah sebagai berikut. Jika kondisi ekspresi salah,
maka instruksi akan meloncat ke Label1dan menjalankan statement2. Bila kondisi
ekspresi benar, maka statement1 akan dijalankan lalu meloncat ke Label2. Label1 dan
Label1 dan Label2 sendiri menunjukan posisi tujuan loncatan, untuk Label1 posisinya
tepat sebelum statement2, dan Label2 setelah statement2
Dalam implementasi ke kode antara, label bisa berupa nomor baris instruksi.
Untuk lebih jelasnya bisa dilihat contoh berikut.
IF
a > b
THEN
c := d
ELSE
c := e
12.
13.
>
14.
22
15.
BZ
16.
17.
18.
:=
{menunjuk label1}
19.
20.
25
21.
BR
22.
23.
24.
:=
{menunjuk label2}
25.
45
2.
Bila ekspresi (a > b) benar, tidak terjadi loncatan, instruksi berlanjut ke 16 sampai
18, lalu loncat ke 25.
4.
NOTASI N-TUPLE
Bila pada Postfix setiap baris instruksi hanya terdiri dari satu tupel, pada notasi N-
tuple setiap baris terdiri dari beberapa tupel. Format umum dari Notasi N-Tuple ada
sebagai berikut:
operator......(N-1) operand
contoh, instuksi :
A := D * C + B / E
*, D,C
2.
/, B, E
3.
+, (1), (2)
4.
:=, A, (3)
Operasi
perkalian/pembagian
lebih
prioritas
dibandingkan
penjumlahan/pengurangan
Kekurangan dari notasi tripel adalah sulit pada saat melakukan optimasi, maka
dikembangkan Indirect triples yang memiliki dua list (senarai), yaitu list instruksi
yang berisi notasi tripel dan list eksekusi yang berisi urutan eksekusinya.
Contoh :
46
A:= B+C*D/E
F:= C*D
List Instruksinya:
1.
*, C, D
2.
/, (1), E
3.
+, B, (2)
4.
:=, A, (3)
5.
:=, F, (1)
List Eksekusinya :
2.
1.
2.
3.
4.
5.
6.
Hasil adalah temporary variable yang bisa ditempatkan pada memory atau
register. Masalah yang ada bagaimana mengelola temporary variable (hasil)
seminimal mungkin.
Contoh instruksi :
A := D * C + B / E
47
5.
PEMBANGKITAN KODE
Hasil dari tahapan analisis akan diterima oleh bagian pembangkitan kode (code
generator). Disini kode antara dari program biasanya ditranslasikan ke bahasa assembly
atau bahasa mesin.
Contoh :
(A+B)*(C+D)
Notasi Kuadrupel :
1.
+, A, B, T1
2.
+, C, D, T2
3.
*, T1, T2, T3
ADD
STO
T1
LDA
ADD
STO
T2
LDA
T1
MUL
T2
STO
T3
Keluaran dari code generator akan diterima oleh code optimizer. Misalkan untuk
kode assembly diatas bisa dioptimasi menjadi :
LDA
ADD
STO
T1
LDA
ADD
MUL
T1
STO
T2
48
Notes :
1.
Perintah LDA
accumulator)
2.
Perintah STO
accumulator)
49
BAB VIII
PENANGANAN KESALAHAN
KESALAHAN PROGRAM
a.
Kesalahan Leksikal
Misalnya kesalahan mengeja keyword,
contoh: THEN ditulis TEN
b.
Kesalahan Sintaks
Misalnya pada operasi aritmatika kekurangan jumlah paranthesis (kurung).
contoh : A:=X+(B*(C+D)
c.
Kesalahan Semantik
i.
Tipe data yang salah, misal tipe data integer digunakan untuk variabel string.
Contoh :
Var
Siswa : Integer
Siswa := 'Aka'
ii.
2.
B := B + 1
{B belum didefinisikan}
PENANGANAN KESALAHAN
{tipe string}
Mendeteksi kesalahan
50
2.
Melaporkan kesalahan
3.
kesalahan meliputi :
1.
Kode kesalahan
2.
3.
4.
2.
3.
3.
diantaranya adalah :
1.
2)
Looping : kompilator masih berjalan tapi tidak pernah berakhir karena looping
tak berhingga (indefinite/onbounded loop)
3)
51
2.
Reaksi yang benar tapi kurang dapat diterima dan kurang bermanfaat. Kompilator
menemukan kesalahan pertama, melaporkannya, lalu berhenti (halt). Ini bisa muncul
bila pembuat kompilator menganggap jarang terjadi kemunculan error dalam
program sehingga kemampuan kompilator untuk mendeteksi dan melaporkan
kesalahan hanya satu untuk setiap kali kompilasi.
3.
ii.
b.
4.
ERROR RECOVERY
Tujuannya mengembalikan kondisi parser ke kondisi stabil (supaya bisa
melanjutkan proses parsing ke posisi selanjutnya). Strategi yang dilakukan error recovery
sebagai berikut:
1.
Mekanisme Ad Hoc
Recovery
yang
dilakukan
tergantung
dari
pembuat
kompilator
sendiri/Spesifik, dan tidak terikat pada suatu aturan tertentu. Cara ini biasa disebut
juga special purpose error recovery.
2.
Contoh :
begin
A:=A+1
B:=B+1;
C:=C+1
end;
3.
Panic mode
Maju terus dan mengabaikan teks sampai bertemu delimeter (misal ;)
contoh :
IF A := 1
Kondisi := true;
Teks diatas terjadi kesalahan karena tidak ada instruksi THEN, kompilator akan
maju terus sampai bertemu ;
b.
Unit deletion
Menghapus
keseluruhan
suatu
unit
sintaktik
(misal:
variabel)
kemunculannya.
Contoh : B:= 'nama'
53
maka
diasumsikan
tipenya
berdasarkan
2.
3.
4.
54
5.
ERROR REPAIR
Bertujuan untuk memodifikasi source program dari kesalahan dan membuatnya
valid sehingga memungkinkan kompilator untuk melakukan translasi program yang mana
akan dialirkan ketahapan selanjutnya pada proses kompilasi. Mekanisme error repair
meliputi :
1.
Mekanisme Ad Hoc
Tergantung dari pembuat kompilator sendiri / spesifik.
2.
3.
b.
4.
Spelling repair
Memperbaiki kesalahan pengetikan pada identifier.
55
BAB IX
TEKNIK OPTIMASI
A.
TEKNIK OPTIMASI
Bertujuan menghasilkan kode program dengan ukuran yang lebih kecil, sehingga
lebih cepat eksekusinya. Berdasarkan ketergantungan pada mesin :
a.
b.
1.
Optimasi Lokal
Optimasi yang dilakukan hanya pada suatu blok dari source code, dengan
cara :
a.
Folding
Nilai konstanta atau ekspresi yang bisa dievaluasi pada saat compile time
diganti dengan nilai komputasinya.
Contoh instruksi : A:=2+3+B, diganti menjadi A:=5+B
56
Optimasi Global
Dilakukan dengan analisis flow, yaitu suatu graph berarah yang menunjukkan jalur yang
mungkin selama eksekusi program. Ada 2 kegunaan optimasi global, yaitu bagi para programmer
dan untuk compiler itu sendiri.
57
Bagi Programmer
Bagi Compiler
58
BAB X
TABEL INFORMASI
A.
2.
atribut variabel yang dipergunakan pada program dari tabel. Atribut, misalnya nama, tipe,
ukuran variabel.
Tabel Simbol berisi daftar dan informasi identifier pokok yang terdapat dalam
program sumber, disebut Tabel Pokok / utama.Tabel Pokok belum mengcover semua
informasi, untuk itu disediakan tabel lagi sebagai pelengkap Tabel Pokok.
Untuk mengacu pada tabel simbol yang bersesuaian dengan suatu indentifier
tertentu, maka pada Tabel Pokok harus disediakan field yang bisa menjembatani identifier
dari Tabel Pokok ke tabel-tabel lain yang bersesuaian. Untuk itu, pemilihan elemen tabel
pada Tabel Pokok maupun tabel lainnya, merupakan sesuatu yang sangat penting.
Elemen pada Tabel Simbol bermacam-macam, tergantung pada jenis bahasanya,
misalnya :
1. No urut identifier : Menentukan nomor urut identifier dalam tabel simbol.
2. Nama identifier : Berisi nama-nama identifier (nama variabel, nama tipe, nama
konstanta, nama procedure, nama fungsi, dll) yang terdapat pada program sumber.
Nama-nama ini akan dijadikan referensi pada waktu analisa semantik, pembuatan
intermediate code, serta pembangkitan kode.
3. Tipe identifier : Berisi keterangan/informasi tipe dari
procedure dan function.
59
C.
2.
3.
Tabel Blok : Mencatat variabel-variabel yang ada pada blok yang sama.
4.
5.
6.
D.
TABEL IDENTIFIER
Memiliki field :
a.
b.
Nama identifier
c.
d.
Tipe dari identifier yang bersangkutan : integer, char, boolean, array, record, file,
no-type
60
e.
Level : Kedalaman identifier tertentu, hal ini menyangkut letak identifier dalam
program. Konsepnya sama dengan pembentukan tree, misal main program = level
0. Field ini digunakan pada run time untuk mengetahui current activation record
dan variabel yang bisa diakses.
: integer;
obj
: objek;
tipe : types;
ref
: integer;
normal : boolean;
level : 0..maxlevel;
address : integer;
end;
Dimana :
objek = (konstant, variabel, prosedur, fungsi)
types = (notipe, int, reals, booleans, chars, arrays, record)
2.
TABEL ARRAY
Contoh implementasi table array :
TabArray : array [1...tabmax] of
record
61
TABEL BLOK
Contoh implementasi table blok :
TabBlok: array [1..tabmax] of
record
lastvar, lastpar, parsize, varsize: integer;
end;
last variable = 4
variable size = 2
last parameter = 3
parameter size = 1 (dianggap char butuh satu byte)
4.
TABEL REAL
Contoh implementasi tabel real :
TabReal : array [1..tabmax] of real
(pemikiran : setiap tipe yang dimiliki oleh suatu bahasa akan memiliki tabelnya
sendiri)
5.
TABEL STRING
Contoh implementasi tabel string :
TabString: array[1..tabmax] of string
6.
TABEL DISPLAY
Urutan pengaksesan : Tabel Display Tabel Blok Tabel Simbol.
62
63