Anda di halaman 1dari 63

Rangkuman Tehnik Kompilasi

Dosen

: Nahot Frastian S.Kom

Mata Kuliah

: Tehnik Kompilasi

Disusun Oleh

: Khusnan Hidayat Aji R 201043501534

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

: Sangat sulit dipelajari manusia

1.2 Bahasa Assembly (Mnemonic Code)


Merupakan bentuk simbolik dari bahasa mesin, dianggap sebagai bahasa
pemrograman yang pertama kali berbentuk string dan lebih mudah dimengerti
manusia.Setiap kode bahasa mesin memiliki simbol sendiri dalam bahasa
assembly.
Misalnya ADD untuk penjumlahan, MUL untuk perkalian, SUB untuk
pengurangan, dan lain-lain.
2

Kelebihan

1. Eksekusi cepat
2. Masih bisa dipelajari daripada bahasa mesin
3. File hasil sangat kecil.
Kekurangan

1. Tetap sulit dipelajari


2. Program sangat panjang.

1.3 Bahasa Tingkat Tinggi (High Level Language) / User Oriented


Bahasa ini lebih dekat dengan bahasa manusia. Bahasa ini juga
memberikan banyak sekali fasilitas kemudahan pembuatan program, misalnya:
variabel, tipe data, konstanta, struktur kontrol, loop, fungsi, prosedur dan lain-lain.
Contoh: Pascal,dephi dll
Keuntungan

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.

Gambar 1.1. Alur kerja Translator

Ada beberapa macam translator, yaitu :


a. Assembler
Source code adalah bahasa assembly, object code adalah bahasa mesin
contoh : Turbo Assembler, Macro Assembler

Gambar 1.2. Alur kerja Assembler

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

: mudah bagi user, debuging cepat

Kekurangan

: eksekusi program lambat, tidak langsung menjadi program executable.

Gambar 1.3. Alur kerja Intepreter

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

: debugging lebih lambat

Keuntungan

: eksekusi program lebih cepat, menghasilkan file executable yang berdiri sendiri.

Gambar 1.4. Alur kerja Compiler

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.

Tahap-tahap yang harus dilalui pada saat mengkompilasi program, yaitu:


a. Analisa Leksikal
b. Analisa Sintaks

Tahap analisa (front-end)

c. Analisa Semantik
d. Pembangkit Kode Antara
e. Code optimization

Tahap sintesa (back-end)

f. Object code generation

Gambar 1.5. Skema blok kompilator


Keterangan :
6

Analisa Leksikal (scanner)


Berfungsi memecah teks program sumber menjadi bagian-bagian kecil yang mempunyai
satu arti yang disebut token, seperti : konstanta, nama variabel, keyword, operator.

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).

Pembangkit Kode Antara


Berfungsi membangkitkan kode antara.

Code optimation
Berfungsi mengefisienkan kode antara yang dibentuk.

Code generator
Berfungsi membangkitkan kode program target dalam bahasa target yang ekivalen dengan
bahasa sumber .

Symbol table management


Berfungsi mengelola tabel simbol selama proses kompilasi. Tabel simbol adalah struktur
data yang memuat record untuk tiap identifier dengan atribut-atribut identifier itu.

Penangan Kesalahan (Error handler)

Berfungsi menangani kesalahan yang berlangsung selama proses kompilasi.

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

mempertimbangkan bermacam macam factor perancangan.


Bagian bagian sebuah Kompilator :
4.1 Analisis
a. Mengenali masukan (Scanner)
b. Memeriksa kebenaran tata bahasa masukan (Parser)
c. Menangkap makna masukan (pengenal semantic)
4.2 Sintesis
a. Pembangkit Kode
b. Pengoptimal Kode
Semua bagian tersebut dalam operasinya didukung dan merefer ke tabel symbol

Program Sumber

Program Objek

ANALISIS
Penganalisis Leksikal
(Scanner)

Penganalisis
Syntax

SINTESIS

Penganalisis
Semantik

(Parser)

Pembangkit Kode

Pengoptimal Code

(Code Generator)

(Optimizer)

TABEL SIMBOL

Scanner : memecah program sumber menjadi besaran leksik/token.


Parser : memeriksa urutan kemunculan token.
Analisis Semantik : biasanya digabungkan dengan intermediate code generator (bagian yang
berfungsi membangkitkan kode antara).
8

Code Generator : membangkitkan kode objek.


Code Optimizer : memperkecil hasil dan mempercepat proses.
Tabel Simbol : menyimpan semua informasi yang berhubungan dengan kompilasi.
Token : besaran pembangun bahasa/representasi dari besaran leksik

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

6.4 Bootstrap (diperkenalkan oleh Wirth).


Ide : kita bisa membangun sesuatu yang besar dengan dimulai dari bagian intinya.

PO dibuat dengan assembly,


P1 dibuat dari P0, dan
P2 dibuat dari P1, jadi compiler untuk bahasa P dapat dibuat tidak harus dengan menggunakan
assembly secara keseluruhan

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

1. Istilah Dalam Bahasa


Tata bahasa (grammar) adalah sekumpulan dari himpunan variabel-variabel, simbol-simbol
terminal, simbol non-terminal, simbol awal yang dibatasi oleh aturan-aturan produksi
Aturan produksi adalah pusat dari tata bahasa yang menspesifikasikan bagaimana suatu tata
bahasa melakukan transformasi suatu string ke bentuk lainnya
Syntax : suatu aturan yang memberitahu apakah sesuatu kalimat (string) adalah valid dalam
program atau tidak
Semantic : suatu aturan-aturan yang memberikan arti kepada program
Pengertian dasar
a. Setiap anggota alfabet, dinamakan sebagai simbol terminal atau token
b. Himpunan simbol terminal dinyatakan sebagai VN, sedangkan himpunan simbol
nonterminal dinyatakan sebagai VT.
c. Simbol-simbol berikut adalah simbol terminal :
i. Huruf kecil awal alfabet, misal x, y, z.
ii. Simbol operator, misal +, -, dan xKonsep dan notasi bahasa 2
iii. Simbol tanda baca, misal (,), dan ;
iv. String yang tercetak tebal, misal, if, then, dan else
d. Simbol-simbol berikut adalah simbol non terminal
i. Huruf besar awal alfabet, misal X, Y, Z.
ii. Huruf S sebagai simbol awal
iii. String yang tercetak miring, misal expr dan stmt
e.

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

sebagai simbolhampa karena keduanya tersusun dari nol buah simbol.


2. Hierarki Chomsky

a. Tata Bahasa Sederhana :

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.

TATA BAHASA REGULER


Teori bahasa membicarakan bahasa formal (formal language), terutama untuk
kepentingan perancangan kompilator (compiler) dan pemroses naskah (text processor).
Bahasa formal adalah kumpulan kalimat. Semua kalimat dalam sebuah bahasa
dibangkitkan oleh sebuah tata bahasa (grammar) yang sama. Sebuah bahasa formal bisa
dibangkitkan oleh dua atau lebih tata bahasa berbeda. Dikatakan bahasa formal karena
grammar diciptakan mendahului pembangkitan setiap kalimatnya.
Tata bahasa (grammar) adalah sekumpulan dari himpunan variabel-variabel,
simbol-simbol

terminal,

simbol

non-terminal,

simbol

awal

yang

dibatasi

oleh aturan-aturan produksi.


B.

HIRARKI TATA BAHASA


Menurut Noam Chomsky (1950), Tata-bahasa formal dapat dikelompokkan
menjadi 4 tingkatan (hierarchi), biasa disebut hierarki tata-bahasa menurut Chomsky.
Pengelompokan tata-bahasa menurut Chomsky ini ditentukan oleh aturan produksi yang
dimiliki oleh grammar, yaitu tata-bahasa Tipe-0, Tipe-1, Tipe-2 danTipe-3.
Andaikan aturan produksi dalam suatu grammar G dituliskan sebagai :

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.

Tata-bahasa Tipe 0 (Non-restricted Grammar):


Tata-bahasa tipe-0, atau biasa disebut sebagai non-restricted grammar adalah tata
bahasa yang paling luas, juga biasa disebut PHRASE STRUCTURED GRAMMAR.
Tata-bahasa Tipe-0 adalah tata-bahasa yang memiliki aturan produksi :
dengan batasan :
: minimal terdiri dari 1 simbol Non terminal , atau {(N)* N (N)*}
: tidak dibatasi, atau : {(N)*

15

2.

Tata-bahasa Tipe 1 (Context Sensitive Grammar):


Tata-bahasa tipe-1, adalah tata-bahasa tipe-0 yang memiliki aturan produksi :
dengan tambahan batasan :
| | < | | jika tidak dalam bentuk S
yaitu panjang string lebih kecil atau sama dengan panjang string

3.

Tata-bahasa Tipe 2 (Context -Free Grammar):


Tata-bahasa tipe-2, adalah tata-bahasa tipe-1 yang memiliki aturan produksi :
dengan tambahan batasan :
: HANYA terdiri dari 1 simbol Non terminal saja, atau N
: tidak dibatasi, atau : {(N)*

4.

Tata-bahasa Tipe 3 ( Regular Grammar):


Tata-bahasa tipe-3, adalah tata-bahasa tipe-2 yang memiliki aturan produksi :
dengan tambahan batasan :
: HANYA terdiri dari 1 simbol Non terminal saja, atau N
: dalam bentuk salah satu diantara : a, aB, atau dimana a adalah simbol terminal
dan B adalah simbol Non terminal.

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

Definisi Ekspresi Regular :


1.

= {} = (himpunan kosong) adalah sebuah ekspresi regular

2.

{} =string kosong adalah ekspresi regular

3.

Untuk setiap a , maka a adalah ekspresi regular

4.

Jika a dan b adalah ekspresi regular maka ab , ab dan a* adalah ekspresiregular.

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.

a* = a** = a*a* = (a)* = a*(a ) = (a ) a* = aa*

10. aa* = a*a

D.

TATA BAHASA REGULER


Seperti telah dituliskan dalam bab sebelumnya, bahasa regular merupakan kelas
bahasa yang dibangkitkan oleh tata bahasa regular. Tata bahasa ini memiliki aturan
produksi dengan batasan :
: HANYA terdiri dari 1 simbol Non terminal saja, atau N
: dalam bentuk salah satu diantara : a, aB, atau
Contoh 3.3:
Tentukan bahasa yang dihasilkan oleh tata bahasa regular berikut :G(, N, S, P) ; dimana
={ a,b } N = { A, B} danP ={ SaS ; SaB ; SA ; Bb; BbB; B; Aa}

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

AHD, AHN, dan AHN_


1.

AH didefinisikan sebagai pasangan 5 tupel : (K, V T , M, S, Z).


K : himpunan hingga stata,
V T : himpunan hingga simbol input (alfabet)
M : fungsi transisi, menggambarkan transisi stata AH akibat pembacaan simbol input.
Fungsi transisi ini biasanya diberikan dalam bentuk tabel.
S K : stata awal
Z K : himpunan stata penerima.

2.

Ada dua jenis automata hingga : deterministik (AHD, DFA = deterministic finite
automata) dan non deterministik (AHN, NFA = non deterministik finite automata).
-

AHD : transisi stata AH akibat pembacaan sebuah simbol bersifat tertentu.


M(AHD) : K V T K

AHN : transisi stata AH akibat pembacaan sebuah simbol bersifat tak tentu.
M(AHN) : K V T 2K

18

1.

AUTOMATA HINGGA DETERMINISTIK (AHD)


Berikut ini sebuah contoh AHD F(K, V T , M, S, Z), dimana :
K = {q0, q1, q2}

M diberikan dalam tabel berikut :

V T = {a, b}

S = q0

q0

q0

q1

Z = {q0, q1}

q1

q0

q2

q2

q2

q2

Ilustrasi graf untuk AHD F adalah sebagai berikut :


Lambang stata awal adalah node dengan anak panah.
Lambang stata akhir/penerima adalah node ganda.

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.

AUTOMATA HINGGA NONDETERMINISTIK (AHN)


Berikut ini sebuah contoh AHN F(K, V T , M, S, Z), dimana :
K = {q 0 , q 1 , q 2 ,q 3 , q 4 }
V T = {a, b,c}

M diberikan dalam tabel berikut :


A

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

Ilustrasi graf untuk AHN F adalah sebagai berikut :

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.

M(q, ) = {q} untuk setiap q K

2.

M(q, t T) = M(p i , T) dimana t V T , T adalah V T *, dan M(q, t) = {p i }

3.

M({q 1 , q 2 , , q n }, x) = M(q i ,x), untuk x V T *

Sebuah kalimat di terima AHN jika :


a.

salah satu tracing-nya berakhir di stata penerima, atau

b.

himpunan stata setelah membaca string tersebut mengandung stata penerima

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.

Analisa Leksikal (Scanner)


Dalam kaitan ini aliran karakter yang membentuk program sumber dibaca dari kiri ke
kanan dan dikelompokkan dalam apa yang disebut token yaitu barisan dari karakter yang dalam
suatu

kesatuan

mempunyai suatu arti tersendiri. Analisa

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

mengerjakan pengelompokkan urutan-urutan karakter ke dalam komponen pokok: identifier,


delimeter,

simbol-simbol

operator,angka,

keyword, noise word,blank, komentar,

dan

seterusnya menghasilkan suatu Token Leksikal yang akan digunakan pada Analisa Sintaktik.
Model dasar untuk membentuk suatu Analisa Leksikal adalah Finite- State Automata.

Dua aspek penting pembuatan Analisa Leksikal adalah :


- Menentukan token-token bahasa.
- Mengenali token-token bahasa dari program sumber.
Token-token dihasilkan

dengan cara memisahkan

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

string ke tabel simbol,

mengidentifikasi sebagai

Type atau typedef, sehingga analisa leksikal dapat memeriksa tabel simbol untuk menentukan
apakah lexeme adalah tipe token atau identifier.

Tugas Analisa leksikal


Tugas tugas analisa leksikal antara lain :
a. Melakukan pembacaan kode sumber dengan merunut karakter demi karakter.
b. Mengenali besaran leksik (identifier, keywords, dan konstanta).
c. Mentransformasi menjadi sebuah token dan menentukan jenis tokennya.
d. Mengirimkan token.
e. Membuang atau mengabaikan white-space dan komentar dalam program.
f. Menangani kesalahan.
g. Menangani tabel simbol.

Tahap Pelaksanaan Analisa Leksikal

Pada single one pass

22

Terjadi interaksi antara scanner dan parser. Scanner dipanggil saat parser memerlukan token
berikutnya.
-

Pada separate pass / multi pass

Scanner

memproses

secara

terpisah,

dilakukan

sebelum

parsing.

Hasil

scanner

disimpan dalam file. Dari file tersebut, parsing melakukan kegiatannya.


Implementasi Analisa Leksikal
a.

Pengenalan Token

- Scanner harus dapat mengenali token


- Terlebih dahulu dideskripsikan token-token yang harus dikenali
b. Pendeskripsian Token
- Menggunakan reguler

grammar. Menspesifikasikan

aturan-aturan

pembangkit token-

token dengan kelemahan reguler grammar menspesifikasikan token berbentuk pembangkit,


sedang scanner perlu bentuk pengenalan.
- Menggunakan ekspresi grammar. Menspesifikasikan token-token dengan ekspresi reguler.
- Model matematis yang dapat memodelkan pengenalan adalah finite-state acceptor
(FSA) atau finite automata.
c.

Implementasi Analisa Leksikal sebagai Finite Automata

Pada pemodelan analisa leksikal sebagai pengenal yang menerapkan finite automata, analisa
leksikal tidak cuma hanya melakukan mengatakan YA atau TIDAK.
d.

Penanganan Kesalahan di Analisa Leksikal

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:
-

Panic mode dengan menghapus karakter-karakter berikutnya sampai analisa leksikal

menemukan token yang terdefinisi bagus


- Menyisipkan karakter yang hilang
- Mengganti karakter yang salah dengan karakter yang benar

- Mentransposisikan 2 karakter yang bersebelahan.

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

Bahasa merupakan himpunan kalimat (baik terhingga maupun tak terhingga).Bahasa


dapat disajikan dengan menyebut kalimatnya satu persatu.Untuk bahasa tak hingga, penyebutan
seperti itu tidak mungkin. Chomsky mengelompokkan Grammar menjadi 4 kelompok :
1. Tipe nol : UnRestricted Grammar (Tata Bahasa Tidak Terbatasi)
2. Tipe satu : Context Sensitive Grammar (Tata Bahasa Tergantung Konteks)
3. Tipe dua : Context Free Grammar ( Tata Bahasa Bebas konteks)
4. Tipe tiga : Regular Grammar
Regular Grammar merupakan subset dari Context Free Grammar.
Context Free Grammar merupakan subset dari Context Sensitive Grammar.
Context Sensitive Grammar merupakan subset dari UnRestricted Grammar.
1. Tata Bahasa Bebas Konteks/Context Free
TBBK (tata bahasa bebas konteks) adalah sekumpulan simbol-simbol variabel (nonterminal), yang masing-masing merepresentasikan bahasa.Bahasa yang direpresentasikan dengan
simbol-simbol non terminal tersebut diproses secara rekursif dengan suatu aturan-aturan yang
disebut aturan produksi.
Tata bahasa bebas konteks (tipe 2) memiliki elemen:
Terminal : simbol dasar yang tidak dapat diturunkan lagi. Terminal disebut juga token.
Non terminal : variabel sintaktik yang masih dapat diturunkan lagi.
TBBK (Tata Bahasa Bebas Konteks)
Contoh TBBK untuk pasangan kurung yang selalu berpasangan:
S => R
25

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

interaktif,tag-tag markup, atau beberapaInterface terdefinisi lainnya,dan memecahkannya


menjadi bagian-bagian Sebuahparser bisa juga mengecek apakah semua input yang diperlukan
sudah disediakan dengan lengkap dan sesuai.
Bagian sintaks dalam suatu kompilator kebanyakan di definisikan dalam tata bahasa bebas
konteks. Pohon penurunan ( derivation tree/parse tree) berguna untuk menggambarkan simbolsimbol variabel menjadi simbol-simbol terminal setiap simbol variabel akan di turunkan menjadi
terminal sampai tidak ada yang belum tergantikan.
Contoh, terdapat CFG dengan aturan produksi sebagai berikut dengan simbol awal S :
S AB
A aA | a
B bB | b
Maka jika kita ingin mencari gambar pohon penurunan dengan untai : aabbb hasilnya adalah
seperti di bawah :
A
AA
aAbB
|
abB
|
b
Proses penurunan / parsing bisa dilakukan dengan cara sebagai berikut :

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.

Modifikasi Tata bahasa

Modifikasi Tata Bahasa dilakukan dengan cara Penyederhanaan.Penyederhanaan tata bahasa


bebas konteks bertujuan untuk melakukan pembatasan sehingga tidak menghasilkan pohon
penurunan yang memiliki kerumitan yang tak perlu atau aturan produksi tak berarti.
Missal :
S AB | a
Aa
Kelemahanya adalah aturan produksi S AB tidak berarti karena B tidak memiliki penurunan.
Penyederhanaan tata bahasa bebas konteks dapat di lakukan dengan 3 cara :
1. Penghilangan Produksi Useles
Produksi yang memuat simbol variabel yang tidak memiliki penurunan yang akan
menghasilkan terminal-terminal seluruhnya. Produksi yang tidak akan pernah dicapai dengan
penurunan apapun dari simbol awal sehingga produksi itu redundan.
Contoh :
S aSa | Abd | Bde
A Ada
B BBB |a
Langkah penyederhanaannya :
Hilangkan aturan yang tidak menuju terminal.
Hapus anggota S yang mengandung simbol himpunan ke terminal yang tidak berguna

30

Hilangkan Redundan ( Anggota yang tidak ada di S dan Sebaliknya )


Maka, hasil penyederhanaanya adalah sbb :
S aSa | Bde
B BBB | a
2. Penghilangan Produksi Unit
Produksi unit adalah produksi dimana ruas kiri dan kanan aturan produksi hanya berupa satu
simbol variabel, misalkan : A B, C D. Keberadaanya membuat tata bahasa memiliki
kerumitan yang tak perlu, maka bisa dihilangkan.
Langkah penyederhanaanya :
Jabarkan masing-masing himpunan
Sederhanakan ruas kiri dan kanan yang hanya berupa variabel simbol sama
Hapus simbol variabel yang tidak berguna / tidak mempunyai turunan
Contoh suatu CFG sbb :
S Sb
SC
CD
C ef
D dd
Jabarkan penurunan masing masing himpunan :
C D => C dd
31

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)

a. Pohon Syntax (syntax tree)


menjelaskan mengenai bahasa secara teoritis dan formal, kita lihat terlebih dahulu sebuah
kalimat sehari-hari dalam bahasa Indonesia, yaitu :
Si kucing kecil menendang bola besar

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

Penurunan untuk string aaabbabba


Proses parsing merupakan tahapan analisis sintaksis yang berguna untuk memeriksa urutan
kemunculan token.Di dalam mengimplementasikan sebuah metode parsing ke dalam program
perlu diperhatikan tiga hal sebagai berikut.
1.Rentang waktu eksekusi.
2.Penanganan kesalahan.
3.Penanganan kode.
Metode parsing bisa digolongkan sebagai berikut.
1.Top Down
Jika dilihat dari terminologi pohon penurunan, metode ini melakukan
proses penelurusan dariroot/puncak menuju keleaf/daun (simbol awalsampai simbol terminal).
Metodetop down
sendiri meliputi:
a.Backtrack/backup : Brute Force.
b.No backtrack : Recursive Descent Parser.
2.Bottom Up
Metode ini melakukan penelurusan darileaf/daun menuju root/puncak.
parsing dengan Brute Force Metode ini memilih aturan produksi mulai dari paling kiri, dan
melakukan expand semua non terminal pada atuan produksi sampai yang tertinggal adalah
simbol terminal.
TBBK Rekursif Kiri
TBBK yang memiliki simbol non terminal di ruas kanan dari simbol non terminal yang ada di
ruas kiri.Simbol non terminal itu terletak di ruas kanan terdepan.
Contoh :
36

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.

Salah satu cara untuk meng-aplikasikan bahasa context free

b. Simbol terminal maupun simbol variabelnya sudah bukan sebuah karakter


c.

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

e. Tidak pernah mengambil token secara mumdur (back tracking)


a. Beda dengan turing yang selalu maju dan mundur dalam melakukan parsing
Aturan Produksi memakai Recursif Descent :
1. Semua simbol variabel dijadikan prosedur/fungsi
2.Jika ketemu simbol terminal pada aturan produksi , maka panggil prosedurnya
3. Penelusuran bersifat top down mengikuti sintaks sesuai pola pada diagram sintaks
4. Fungsi/prosedur ditulis untuk setiap non terminal dari suatu produksi.

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)

Memeriksa keberlakuan nama-nama meliputi pemeriksaan berikut.


1.

Duplikasi : pada tahap ini dilakukan pengecekan apakah sebuah nama terjadi
pendefinisian lebih dari dua kali. Pengecekan dilakukan pada bagian pengelola
blok.

2.

Terdefinisi : Melakukan pengecekan apakah sebuah nama yang dipakai pada


tubuh program sudah terdefinisi atau belum. Pengecekan dilakukan pada semua
tempat kecuali blok.
40

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.

Structured Operational atau Natural Semantic


Seperti dalam pengambilan keputusan secara alamiah dengan logika. Program diberi
suatu arti dari aturan yang diturunkan yang menggambarkan penilaian gagasan suatu
bahasa.

41

Tugas dari Analisa Semantik:


1.

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.

Terdapat statement: (A+B) * (C+D)

3.

Akan menghasilkan bentuk sintaksis.

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.

Berperan dalam memeriksa kesalahan-kesalahan yang bersifat semantik. Salah satu


peranan analisis semantik yang penting adalah pemeriksaan tipe variabel.

7.

Memeriksa keunikan suatu nama.

8.

Menganalisis kebenaran source program.

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.

Untuk memperkecil usaha dalam membangun kompilator dari sejumlah bahasa ke


sejumlah mesin.

2.

Proses optimasi masih lebih mudah.

3.

Bisa melihat program internal yang mudah dimengerti.


Kode antara (intermediate code) adalah sebuah representasi yang disiapkan untuk

mesin abstrak tertentu. Dua sifat yang harus dipenuhi oleh kode antara adalah :
1.

Dapat dihasilkan dengan mudah

2.

Mudah ditranslasikan menjadi program sasaran (target program).

Contoh Parse tree:

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)

kalau kita nyatakan dalam postfix :


ab + cd + *

Kita dapat mengubah instruksi kontrol program yang ada ke dalam notasi Postfix.
Misal :
IF<exp>THEN<stmt1>ELSE<stmt2>

diubah ke dalam Postfix


<exp><label1>BZ<stmt1><label2>BR

label1

<stmt2>

label2

Keterangan :
BZ

= branch if zero (zero = salah)


{bercabang/meloncat jika kondisi yang dites salah}

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

Bila diubah ke dalam Postfix


11.

12.

13.

>

14.

22

15.

BZ

16.

17.

18.

:=

{menunjuk label1}

19.
20.

25

21.

BR

22.

23.

24.

:=

{menunjuk label2}

25.

Notasi Postfix di atas bisa dipahami sebagai berikut.


1.

Bila ekspresi (a > b) salah, maka loncat ke instruksi no.22

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

Selanjutnya akan dibahas notasi 3 tupel dan 4 tupel.


1.

Notasi 3 Tupel atau Triple Notation


Notasi tripel memiliki format sebagai berikut :
<operator><operan><operan>

contoh, instuksi :
A := D * C + B / E

Kode antara tripel :


1.

*, 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.

Notasi 4 Tupel atau Quadruples Notation


Format notasi kuadrupel :
<operator><operan><operan><hasil>

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

Dapat ditranslasikan ke dalam bahasa Assembly dengan akumulator tunggal :


LDA

{Muat isi A ke akumulator}

ADD

{Tambahkan isi akumulator dengan B}

STO

T1

{Simpan isi akumulator ke 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

: Memuat isi dari register/memory ke akumulator (load to

accumulator)
2.

Perintah STO

: Menyimpan isi akumulator ke register/memory (store from

accumulator)

49

BAB VIII
PENANGANAN KESALAHAN

Sebuah kompilator akan sering menemui program yang mengandung kesalahan,


maka kompilator harus memiliki strategi apa yang harus dilakukan untuk menangani
kesalahan - kesalahan tersebut.
1.

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.

Variabel belum didefinisikan tetapi digunakan dalam operasi.


Contoh :

2.

B := B + 1

{B belum didefinisikan}

PENANGANAN KESALAHAN

Prosedur penanganan kesalahan terdiri dari :


1.

{tipe string}

Mendeteksi kesalahan
50

2.

Melaporkan kesalahan

3.

Tindak lanjut perbaikan / pemulihan


Pelaporan kesalahan yang dilakukan oleh sebuah kompilator yang menemukan

kesalahan meliputi :
1.

Kode kesalahan

2.

Pesan kesalahan dalam bahasa natural

3.

Nama dan atribut identifier

4.

Tipe tipe yang terkait bila type checking

Contoh : Error Message : Error 162 jumlah: unknown identifier


1.

Kode kesalahan = 162

2.

Pesan kesalahan = unknown identifier

3.

Nama identifier = jumlah.

3.

REAKSI KOMPILATOR PADA KESALAHAN


Pada saat kompilator menemukan kesalahan terdapat beberapa tingkatan reaksi

diantaranya adalah :
1.

Reaksi yang tidak dapat diterima (tidak melaporkan error)


1)

Kompilator crash : berhenti atau hang

2)

Looping : kompilator masih berjalan tapi tidak pernah berakhir karena looping
tak berhingga (indefinite/onbounded loop)

3)

Menghasilkan program objek yang salah : kompilator melanjutkan proses


sampai selesai tapi program objek yang dihasilkan salah. Ini berbahaya bila
tidak diketahui pemrogram, karena baru akan muncul saat program dieksekusi.

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.

Reaksi-reaksi yang dapat diterima:


a.

Reaksi yang sudah dapat dilakukan, yaitu kompilator melaporkan kesalahan /


error, dan selanjutnya melakukan:
i.

Recovery / pemulihan, lalu melanjutkan menemukan kesalahan / error


yang lain bila masih ada.

ii.

Repair / Perbaikan kesalahan, lalu melanjutkan proses translasi dan


menghasilkan program objek yang valid.

b.

Reaksi yang belum dapat dilakukan, yaitu kompilator mengkoreksi kesalahan,


lalu menghasilkan program objek sesuai dengan yang diinginkan pemrogram.
Disini komputernya sudah memiliki kecerdasan untuk mengetahui maksud
pemrogram.

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.

Syntax Directed Recovery


Melakukan recovery berdasarkan syntax
52

Contoh :
begin
A:=A+1
B:=B+1;
C:=C+1
end;
3.

Secondary Error Recovery


Berguna untuk melokalisir kesalahan / error, caranya :
a.

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:

<block>,<exp>,<statement> dan sebagainya), efeknya sama


dengan panic mode tetapi unit deletion memelihara kebenaran sintaksis dari
source program dan mempermudah untuk melakukan error repairing lebih
lanjut.
4.

Context Sensitive Recovery


Berkaitan dengan semantik,misal bila terdapat variabel yang belum
dideklarasikan(undifined

variabel)

kemunculannya.
Contoh : B:= 'nama'
53

maka

diasumsikan

tipenya

berdasarkan

Empat strategi pemulihan kesalahan yang sering digunakan adalah :


1.

Mode panik (panic mode)


Strategi ini adalah metoda yang paling sederhana. Jika sebuah syntax error
ditemukan, yaitu jika M(A, a) = error untuk suatu token a, maka parser akan
melewatkan (skip) token a dan token-token berikutnya sampai ditemukan sebuah
token penyelaras (syncro- nizing token). Pengertian melewatkan sebuah token adalah
parser membaca token tersebut tetapi tanpa menganalisanya yaitu tanpa
membandingkan dengan simbol top of stack. Token-token penyelaras adalah tokentoken yang mempunyai peran yang jelas dalam source program. tugas perancang
kompilator adalah menentukan himpunan token penyelaras ini.

2.

Tingkat kombinasi kata-kata (phrase level)


Jika sebuah syntax error ditemukan maka parser akan melakukan
pembetulan lokal kepada prefix dari sisa input dengan suatu string sehingga proses
parsing bisa dilanjutkan. Contoh pembetulan yang lazim dilakukan adalah mengganti
koma dengan titik koma, menghapus titik koma yang berlebihan (seperti titik koma
sebelum token else di dalam Pascal), atau mengisi titik koma yang hilang.

3.

Produksi-produksi kesalahan (error production)


Yang dimaksud dengan produksi-produksi kesalahan adalah sekumpulan
produksi yang akan menghasilkan konstruksi yang salah (wrong parse tree, yaitu
parse tree yang mengimplementasikan sebuah statement yang salah).

4.

Pembetulan global (global correction)


Misalkan x adalah string input yang salah sedangkan y adalah string input
yang benar. Yang dimaksud dengan pembetulan global adalah sejumlah aksi
penyisipan, penghapusan, atau perubahan terhadap suatu token di dalam string x
sedemikian rupa sehingga x berubah menjadi y.

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.

Syntax Directed Repair


Menyisipkan simbol terminal yang dianggap hilang atau membuang terminal
penyebab kesalahan..

3.

Context Sensitive Repair


Perbaikan dilakukan pada kesalahan :
a.

Tipe identifier. Diatasi dengan membangkitkan identifier dummy

b.

Tipe konstanta. Diatasi dengan membangkitkan konstanta baru dengan tipe


yang tepat.

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.

Machine Dependent Optimizer


Kode dioptimasi sehingga lebih efisien pada mesin tertentu.

b.

Machine Independent Optimizer


Strategi optimasi yang bisa diaplikasikan tanpa tergantung pada mesin tujuan tempat
kode yang dihasilkan akan dieksekusi nantinya.

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

b. Redundant Subexpression Elimination


Menggunakan hasil komputasi terdahulu daripada melakukan komputasi
ulang.
Contoh urutan instruksi :
A:=B+C
X:=Y+B+C
c.

Optimasi dalam sebuah iterasi

56

Loop Unrolling : menggantikan suatu loop dengan menulis statement dalam


loop beberapa kali. Hal ini didasari pemikiran, sebuah iterasi pada
implementasi level rendah akan memerlukan operasi sebagai berikut.
Inisialisasi / pemberian nilai awal pada variabel loop. Dilakukan sekali
pada saat permulaan eksekusi loop.
Pengujian, apakah variabel loop telah mencapai kondisi terminasi.
Adjustment yaitu penambahan atau pengurangan nilai pada variabel loop
dengan jumlah tertentu.
Operasi yang terjadi pada tubuh perulangan (loop body).
Contoh instruksi :
FOR I:=1 to 2 DO
A[I]:=0; dioptimasi menjadi
A[1] := 0;
A[2] := 0;
d. Strength Reduction
Mengganti suatu operasi dengan jenis operasi lain yang lebih cepat
dieksekusi,Contoh :
Pada beberapa komputer operasi perkalian memerlukan waktu lebih
banyak untuk dieksekusi dari pada operasi penjumlahan, maka penghematan
waktu bisa dilakukan dengan mengganti operasi perkalian tertentu dengan
penjumlahan. Contoh lain :
A := A + 1 Dapat digantikan dengan INC(A)
B.

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

Unreachable / dead code : Kode yang tidak pernah dieksekusi

Unused parameter : parameter yang tidak pernah digunakan dalam prosedur

Unused variable : variabel yang tidak pernah digunakan dalam program.

Variable : variabel yang dipakai tanpa nilai awal

Bagi Compiler

Meningkatkan efisiensi eksekusi program

Menghilangkan useless code / kode yang tidak terpakai

58

BAB X
TABEL INFORMASI

A.

KEGUNAAN TABEL INFORMASI


Fungsi Tabel Informasi atau Tabel Simbol :
1.

Membantu pemeriksaan kebenaran semantik dari program sumber.

2.

Membantu dan mempermudah pembuatan intermediate code dan proses pembangkitan


kode.
Untuk mencapai fungsi tersebut dilakukan dengan menambah dan mengambil

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

record dan string, maupun

4. Object time address : address yang mengacu ke alamat tertentu.


5. Dimensi dari identifier yang bersangkutan.
6. Nomor baris variabel dideklarasikan.
7. Nomor baris variabel direferensikan.
8. Field link.
B.

IMPLEMENTASI TABEL INFORMASI


Beberapa jenis :
1.

Tabel Identifier : Berfungsi menampung semua identifier yang terdapat dalam


program.

C.

2.

Tabel Array : Berfungsi menampung informasi tambahan untuk sebuah array.

3.

Tabel Blok : Mencatat variabel-variabel yang ada pada blok yang sama.

4.

Tabel Real : menyimpan elemen tabel bernilai real.

5.

Tabel String : Menyimpan informasi string.

6.

Tabel Display : Mencatat blok yang aktif.

INTERAKSI ANTAR TABEL


Pertama kali tabel display akan menunjuk blok mana yang sedang aktif. Dari blok
yang aktif ini, akan diketahui identifier-identifier yang termasuk dalam blok tersebut.
Untuk pertama kalinya, yang akan diacu adalah identifier yang paling akhir, kemudian
identifier sebelumnya, dan seterusnya. Informasi suatu identifier ini mungkin belum
lengkap. Untuk itu dari tabel identifier ini mungkin akan dicari kelengkapan informasi dari
suatu identifier ke tabel yang sesuai (tabel real, tabel string, atau tabel array).

D.

CONTOH IMPLEMETASI TABEL SIMBOL


1.

TABEL IDENTIFIER
Memiliki field :
a.

No urut identifier dalam tabel

b.

Nama identifier

c.

Jenis/obyektif dari identifier : Prosedur, fungsi, tipe, variabel, konstanta

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.

Contoh implementasi table identifier :


TabId: array [0..tabmax] of
record
name : string;
link

: 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

indextype, elementype : types;


elemenref, low, high, elemensize, tabsize : integer
end;
3.

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

Contoh implementasi Tabel Display :


TabDisplay: array [1..tabmax]of integer

63

Anda mungkin juga menyukai