MODUL - 01
PENGENALAN COMPILER
1.1. Terminologi Bahasa Pemrograman
a. Bahasa Mesin.
b. Bentuk Simbolik.
c. Bahasa Tingkat Tinggi ( High Level Language ).
d. Bahasa Yang Problem Oriented.
1.2. Translator
Adalah penerjemah yang melakukan perubahan
Source Code/ Source Program ke dalam target
Code/ objek code/ objek program. Source code
ditulis dalam bahasa sumber, sedangkan objek
code dapat berupa bahasa pemrograman lain atau
bahasa mesin atau bahasa komputer
a. Assembler : Source code adalah bahasa Assembly,
objek code adalah bahasa mesin
Contohnya Turbo Assembler dan Macro Assembler
Gambar 1 : Sistem Assembler
Objek Code
file.EXE /
.Com
Assembler
Source
Code
berupa file
ASM
b. Compiler ( Kompilator )
Source code adalah bahasa tingkat tinggi, objek code
adalah bahasa mesin atau bahasa assembly. Source
code dan data diproses pada saat yang berbeda.
Contoh : Bahasa Pascal
Gambar 2 : Sistem Proses Kompilasi
Compile Time adalah saat perubahan source code ke objek
code. Run Time adalah saat eksekusi objek code
Data
Objek CodeSource Code HasilCompiler
Eksekusi
Komputer
c. Interpreter : Interpreter tidak membangkitkan objek code.
Hasil tranlasi hanya dalam bentuk internal. Contoh :
Basic A / GW Basic, LISP, SMALLTALK
Source code dan data diproses pada saat yang sama.
Run Time
Gambar 3 : Sistem Proses Interpretasi
Data
Source Code HasilInterpreter
1.3. Tahapan-Tahapan Dan Fase-fase
Dalam Teknik Kompilasi
Tahapan dalam teknik kompilasi digambarkan dalam
bentuk Structure Chart berikut ini, yang menggambarkan
proses-proses yang terjadi dari mulai source program
sampai dengan objek code, dapat dilihat pada gambar 4.
sedangkan fase-fase dalam teknik kompilasi adalah
operasi logis/ kongkrit yang mengambil input satu
persatu dari source program dan memproduksi output
representasi lainnya.
Ada 2 fase kompilasi, yaitu :
1. Fase Analisis : Leksikal, Sintaks dan Semantik Analisis
2. Fase Sintesis : Intermediate Code, Code Optimization
dan Code Generation.
Gambar 4 : Tahapan-Tahapan Dalam Kompilasi
Source Program
Lexical Analysis
Tabel Simbol
Syntax Analysis
Semantic Analysis
Target Program
Intermediate Code
Generation
Code Optimization
Code Generation
Error Handling
X : = a + b * 60 Operasi pemberian nilai dari suatu
variabel dapat diuraikan sebagai berikut :
X : = a + b * 60
Position : = Initial + Rate * 60
id1 : = id2 + id3 * 60
id1 : =
id2 +
id3
* 60
id1 : =
id2 +
id3
* 60.00
Lexical Analysis
Syntax Analysis
Semantic Analysis
Temp 1 : = Int to Real ( 60 )
Temp 2 : = Id3 * Temp 1
Temp 3 : = Id2 + Temp 2
Id1 : = Temp 3
MoveF Id3, R2
MulF 60.00, R2
MoveF Id2, R1
AddF R2, R1
MoveF R1, Id1
Gambar 6 : Sistem Pemrosesan Suatu Bahasa
Intermediate
Code Generation
Code Optimizer
Code Generator
Target Program
1.5. Model Kompilator
Gambar 7 : Model Kompilator
Lexical
Analyzer
(Scanner)
Tabel Simbol
Syntax
Analyzer
(Parser)
Semantic
Analyzer
Intermediate
Code
Generator
Code
Generator
Code
Optimizer
Source
Code
Inter
mediate
Code
Objek
Code
1.6. Mutu Kompilator
a. Kecepatan dan waktu kompilasi.
b. Mutu Program Objek.
c. Integrated Environment.
Gambar 8 : Pembuatan Kompilator Dengan Menggunakan
Kompilator Pengkompilasi
Source
Program
Kompilator A
Dalam
Bahasa K
Kompilator
Bahasa A
Kompilator
Pengkompilasi (K)
1.7. Pembuatan Kompilator
a. Bahasa Mesin.
b. Bahasa Assembly.
c. Bahasa Tingkat Tinggi Lain Pada Mesin Yang Sama.
d. Bahasa Tingkat Tinggi Yang Sama Pada Mesin Berbeda
e. Bootstrap ( Diperkenalkan Oleh Niklaus Wirth ).
Gambar 9 : Metode Bootstrap
P2
P1 P0
Latihan-Latihan Modul - 01
1. Mengapa kita memerlukan bahasa pemrograman ?.
2. Berikan penjelasan dari istilah-istilah berikut ini :
a. translator
b. kompilator
c. assembler
d. interpreter
3. Dari ekspresi matematik berikut ini, uraikan sistem
pemrosesan suatu bahasa dan bentuk intermediate
code nya :
a. X := ( a – b ) + c * d / e
b. Y := a / b * ( c + d ) ↑ e – 100
c. Z := a – ( b / c ) ↑ d * ( e + f )
Modul – 02
SOURCE PROGRAM/ BAHASA PEMROGRAMAN
2.1. Perancangan Bahasa Program.
Gagasan perancangan bahasa program dapat berasal dari
bahasa alami/ natural language, matematika dan bahasa
pemrograman yang sudah ada. Perancangan bahasa
program mempunyai tujuan untuk :
a. Komunikasi dengan manusia.
b. Pencegahan dan deteksi kesalahan.
c. Usability.
d. Efektifitas pemrograman.
e. Compilability.
f. Kesederhanaan ( Simplicity ) dan efisien.
g. Machine independent.
h. Uniformity, Orthogonality, Generalisasi dan Spesialisasi.
2.2. Struktur Data
Empat aspek dari struktur data adalah :
a. Deklarasi data.
b. Tipe-tipe data yang disediakan dalam bahasa program.
c. Strategi alokasi storage.
d. Lingkup dan variabel.
Data yang banyak digunakan dalam teknik kompilasi
adalah data array :
a. Array berdimensi – 1
Untuk menentukan lokasi dari A ( I ) dapat digunakan
rumus : Base + K ( I – low )
Dimana ; Base = Lokasi pertama dari elemen pertama
K = Lokasi memori per elemen.
Low = Batas bawah pada subscript
I = indeks
b. Array Berdimensi - 2
Array dimensi-2 dapat disusun secara row major atau
couloum major. Untuk menentukan lokasi dari M ( I,J )
untuk row major dapat digunakan rumus :
Untuk menentukan lokasi dari M ( I,J ) secara couloum
major dapat digunakan rumus :
Base + K { ( i - 1 ) r + ( j – 1 ) }
Base + K { ( j – 1 ) c + ( i – 1 ) }
Dimana : Base = Lokasi pertama dari elemen pertama.
K = Lokasi memori per elemen.
r = Banyaknya elemen dalam baris.
c = Banyaknya elemen dalam kolom
2.3. Operator-Operator
a. Operator Aritmatik : + , - , * , / , ↑ , ** .
b. Binary : Operator yang terdiri dari dua bagian,
Misal : A + B
c. Unary : operator yang terdiri dari satu bagian, misal : - B
d. Prefix : Operand yang didahului operatornya.
e. Postfix : Operand yang mendahului operatornya.
a + b Unary “ – “ a + b * c ( a + b ) * c
Infix a + b - a a + ( b * c ) ( a + b ) * c
Prefix + ab - a + a * bc * + abc
Postpix ab + a - abc * + ab + c *
2.4. Struktur Kompilasi
Mencakup aspek dari bahasa yang
berkaitan dengan proses kompilasi,
berhubungan dengan operasi pada
bahasa yang dikerjakan saat kompilasi
dan bagaimana kompilasi modul yang
berbeda dan terpisah dari program.
2.5. Skenario Perancangan
Skenario dasar untuk perancangan bahasa dapat
dideskripsikan dalam algoritma berikut ini :
a. Temukan apa yang diinginkan dan bagaimana
mempergunakannya.
b. Tentukan feature yang mungkin.
c. Tentukan desain keseluruhan dan integrasi feature ke
dalamnya. Amati interaksi antar feature.
d. Tentukan rinciannya, parsing dan pemeriksaan
kesalahan.
e. Tulislah definisi formal, user manual dan apapun yang
dianggap berguna.
f. Evaluasi rancangan seperti apa yang didiskusikan
sebelumnya.
g. Buatlah perubahan dan mulai dari step c lagi.
Jangan lanjutkan step g sampai g dilengkapi.
Kurangi ukuran, ulangi step sebelumnya bila
perlu.
h. Implementasikan.
i. Tunggu reaksi pengguna.
j. Umumkan kemungkinan adanya kesalahan.
k. Mulai suatu versi baru dan skenarionya.
Latihan-Latihan Modul - 02
1. Apa dasar penggunaan instruksi case dibandingkan dengan If then
else ? Berikan suatu contoh pengubahan instruksi case ke bentuk
if then else.
2. Konstruksikan sebuah perulangan for pada Pascal atau Bahasa
C ++ dengan instruksi :
a. Repeat – until
b. While do
3. Diketahui array dimensi – 2 , M ( 5,4 ) .
a. Pada elemen keberapa lokasi M ( 4,3 ) untuk row dan
couloum mayor.
b. Jika diketahui Base = 450 dan K = 4, Tentukan lokasi
M ( 3,4 ) dan M ( 5,3 ) untuk row dan couloum mayor.
4. Uraikan bentuk Postfix dan prefix dari ekspresi berikut ini :
a. A * ( B + C ) / D c. (( A / B ) ↑ C ) – D * E
b. ( A – B ) * C ↑ D + E d. A / ( B – C ) + D * - E ↑ F
MODUL – 03
3.1 KONSEP DAN NOTASI BAHASA
Bahasa Mesin Otomata Batasan Aturan Produksi
Reguler/ Tipe-3 Finite State Automata
meliputi Deterministic
Finite Automata ( DFA )
Dan Non Deterministic
Finite Automata ( NFA )
α adalah sebuah simbol
variabel.
β maksimal memiliki sebuah
simbol variabel yang bila ada
terletak pd posisi paling kanan
Bebas Konteks /
Context Free /
Tipe-2
Push Down Automata
(PDA)
α berupa sebuah simbol
variabel
Context Sensitive /
Tipe-1
Linier Bounded
Automata
│ α │ ≤ │ β │
Unrestricted /
Phase Structure /
Natural language /
Tipe-0
Mesin Turing Tidak ada batasan
3.2. Diagram Keadaan ( State Transition Diagram )
Diagram keadaan digunakan untuk mendapatkan token
(Token adalah simbol terminal pada teori bahasa), yaitu
melakukan analisis leksikal terhadap program sumber.
Misalkan suatu bahasa memiliki simbol terminal / token
berikut : ( T_PLUS, T_Min, T_ID, T_INT ). Token T_ID
(Identifier) dapat berupa nama atau keyword yang sudah
didefinisikan oleh suatu bahasa, misal terdapat
statement :
Var JUMLAH : INTEGER
maka Var dan INTEGER adalah Keyword.
Jumlah adalah sebuah nama yang dideklarasikan sendiri
oleh programmer.
Gambar 10 : Diagram Keadaan Untuk Bahasa Diatas
Blank Huruf /
Start Huruf Digit
Digit
+ _ Digit
S t_Id
t_Int
t_Min
t_Plus
3.3. Notasi BNF
Aturan produksi dapat dinyatakan dalam notasi BNF
(Back us Naur Form / Back us Norm Form ). Notasi BNF
telah banyak dipakai untuk melakukan definisi formal
bahasa program.
Beberapa simbol yang dipakai dalam notasi BNF :
꞉ ꞉ = identik dengan simbol pada aturan produksi
I Idem dengan simbol │ pada aturan produksi
< > Mengapit simbol variabel/ non terminal
{ } Pengulangan nol sampai n kali
3.4. Diagram Sintaks
Diagram sintaks merupakan alat bantu dalam
pembentukan parser/ analisis sintaksis. Notasi yang
terdapat dalam diagram sintaks :
1. Empat persegi panjang melambangkan simbol variabel /
non terminal.
2. Bulatan melambangkan simbol terminal
Misal terdapat aturan produksi :
T F * T │ F / T │T
Diagram sintaksnya dapat dilihat pada gambar 11
berikut ini :
T F
*
/
Misalkan Notasi BNF untuk Block :
< Block > :: = T_Begin < Statement> { T_Semicol
< Statement > } T_end
Gambar 12 : Diagram Sintaks Untuk Notasi BNF
Begin
;
EndStatement
Latihan-Latihan Modul - 03
1. Buatlah diagram keadaan/ state untuk sebuah bahasa
yang memiliki kumpulan token-token berikut :
Buatlah diagram sintaks untuk setiap notasi BNF berikut :
<Simple_Exp> ::= <Factor> { <Arit_Op> <Factor> } !
<Sign> <factor> { <Arit_Op> <Factor> }
<Sign> ::= + ! –
<Arit_Op> ::= + ! - ! * ! /
<Factor> ::= Integer ! Identifier
+ - / * ** <
<= > >= = <> Integer
Id
2. Jelaskan kegunaan hal-hal berikut ini dalam
pengembangan suatu kompilator :
a. Tata bahasa bebas konteks
b. Finite State Automata
c. Diagram Sintaks
d. Notasi BNF
MODUL – 04
ANALISIS LEKSIKAL
4.1. Peranan Analisis Leksikal
a. Analisis leksikal dapat merupakan suatu pass yang
terpisah dari analisis sintaks, yaitu dengan menempat
kan outputnya pada suatu fail intermediate dari mana
parser ( pengurai ) dapat mengambil sebagai inputnya.
b. Analisis leksikal bertugas sebagai scanner yaitu
mengidentifikasikan semua besaran yang membangun
suatu bahasa pada suatu program sumber.
Tugas scanner antara lain adalah sebagai berikut :
1. Melakukan pembacaan kode sumber secara karakter
demi karakter.
2. Mengenali besaran leksik.
3. Mentransformasikan menjadi sebuah token dan
menentukan jenis tokennya.
4. Mengirimkan token.
5. Membuang/ mengabaikan blank dan komentar dalam
program.
6. Menangani kesalahan.
7. Menangani tabel simbol.
4.2. Pendekatan Sederhana Desain Leksikal Analyzer
Salah satu cara untuk memulai desain satu program
adalah dengan menjelaskan sifat-sifat program tersebut
dengan satu flowchart. Pendekatan ini berguna bila
program tersebut adalah suatu lexical analyzer, karena
tindakan selanjutnya yang akan diambil sangat
tergantung pada karakter yang baru saja diperoleh. Satu
jenis flowchart khusus bagi lexical analyzer disebut State
Diagram ( Diagram Transisi ). Digambarkan sebagai
lingkaran yang disebut State ( keadaan ). Keadaan ini
dihubungkan dengan anak panah/ aliran.
Implementasi Diagram Transisi
Contoh : Perhatikan daftar token berikut ini :
Token Kode Harga
Begin 1 -
End 2 -
If 3 -
Then 4 -
Else 5 -
Identifier 6 Pointer ke Tabel Simbol
Konstanta 7 Pointer ke Tabel Simbol
< 8 1
< = 8 2
= 8 3
<> 8 4
> 8 5
> = 8 6
Gambar 13 : Diagram Transisi dari Tabel Diatas
Keyword Blanck/ Return
Start B E G I N Brs baru (1,..)
E N D Blanck/ brs baru Return ( 2,..)
L
S E Blanck/ brs baru Return ( 3,..)
I F Blanck/ brs baru Return ( 4,..)
Blanck/
T H E N brs baru Return ( 5,..)
q1 q2
q7 q8
q13
q0
q9
q18
q16
q21
q17
q3
q15
q6
q12q11
q4 q5
q10
q14
q20q19 q22
Gambar 13 : Lanjutan Gambar Diagram Transisi
Identifier Huruf/ Angka Return
Start Huruf (6, install ( ))
Bukan huruf/ angka
Konstanta Angka Angka Return
Bukan angka (7,install ( ))
Relational Operator
Start < Bukan = atau > Return ( 8,1 )
= Return ( 8,2 )
= > Return ( 8,4 )
Return ( 8,3 )
> Bukan = Return ( 8,5 )
= Return ( 8,6 )
q26
q30
q23
q27
q35
q32
q33
q24
q34
q29
q25
q28
q31
q36
q37
4.3. Reguler Expression/ Ekspresi Beraturan ( E.B )
Sebuah bahasa dinyatakan reguler jika terdapat finite
state automata yang dapat menerimanya. Bahasa-
bahasa yang dapat diterima oleh suatu FSA dapat
dinyatakan secara sederhana dengan ekspresi reguler /
ekspresi beraturan (EB). EB memungkinkan
menspesifikasikan atau mendefinisikan bahasa-bahasa,
memberikan suatu pola ( pattern ) atau template untuk
untai / string dari suatu bahasa. Untai yang menyusun
suatu bahasa reguler akan cocok ( match ) dengan pola
bahasa itu.
Penerapan EB yang nampak, misalnya pencarian
(searching ) untai karakter pada suatu file, biasanya
fasilitas ini ada pada text editor. Dalam kasus-kasus ini
dapat dilakukan penerapan FSA pada untai-untai yang
terdapat dalam file tersebut.
Contoh Ekspresi Beraturan ( E.B )
Gambar 14 : FSA menerima bilangan Integer tak bertanda
0,1,2,…..,9
Start 0,1,2,3,…….,9
Selain 0,1,2,…,9 selain 0,1,2,..,9
Dalam E.B. dinyatakan dengan : ( digit ) ( digit ) *
q0
q2
q1q1
Gambar 15 : FSA menerima Identifier
Dalam E.B. dinyatakan dengan : ( Huruf ) ( Huruf │Angka) *
Start Huruf Huruf/ angka
q0 q1
Notasi-Notasi Ekspresi Beraturan ( E.B )
1. ( * ) Yaitu karakter asterisk, bisa tidak muncul, dapat pula
muncul berhingga kali ( 0 – n ) kali.
2. ( + ) pada posisi supercript ( diatas ) berarti minimal
muncul 1 kali ( 1 – n ) kali.
3. + atau U , union , gabungan, garis tegak ( │ ) “ atau “.
4. . ( titik ) berarti konkatenasi, biasanya dapat dihilangkan.
Misal : a.b = ab
Contoh-contoh E.B dan string yang dibangkitkan :
1. E.B : ab*cc . String yang dibangkitkan ?
2. E.B : 010* . String yang dibangkitkan ?
3. E.B : a*d ; a+d . String yang dibangkitkan ?
4. E.B : a* U b* ; ( a U b ) ; ( a U b ) * ; ( 0 │1 ) + ;
5. ( a │b ) *String yang dibangkitkan ?
Recognizer
Bagian dari penganalisaan leksik yang berfungsi
mengidentifikasikan suatu token dari suatu
input. Apakah suatu input string X merupakan
sentence dari suatu language L. Diagram
transisi yang melakukan konversi (perubahan)
dari suatu ekspresi beraturan menjadi suatu
recognizer disebut dengan otomata ( automata )
berhingga.
Ada 2 jenis otomata, yaitu :
1. Deterministic Finite Automata ( DFA ).
2. Non Deterministic Finite Automata ( NFA ).
Latihan-Latihan Modul - 04
1. Jelaskan istilah-istilah berikut ini :
a. Identifier
b. Keyword
c. Delimiter
2. Buatlah prosedur scan sederhana yang mampu
membaca bilangan bulat dan identifier.
3. Gambarkanlah diagram transisi untuk token-
token yang ada dalam prosedur tersebut.
MODUL – 05
FINITE STATE AUTOMATA ( FSA )
5.1. Deterministic Finite Automata ( DFA ).
DFA dari suatu state adalah tepat satu state berikutnya
untuk setiap simbol masukan yang diterima. DFA
didefinisikan sebagai 5-tuple M = (Q, ∑, δ, q0, F ).
Fungsi δ tak hanya bekerja pada satu huruf saja, dapat
pula pada suatu kata δ* :
Q X ∑*  Q
Contoh :
δ* ( q , ε ) = q
δ* ( q , wa ) = δ ( δ* ( q , w ), a ))
δ* ( q , a ) = δ* ( q , εa ) = δ ( δ* ( q , ε ), a )) = δ ( q , a )
Definisi 1 :
Dalam Diagraph suatu automaton M = (Q, ∑, δ, q0, F )
untuk suatu kata w di ∑*, lintasan vertex qi ke vertex qj,
sehingga rangkaian-rangkaian dari label-label dari edge
yang dilaluinya membentuk kata w disebut lintasan w
dari qi ke qj . Suatu kata w termasuk di ∑* dikatakan
diterima ( accepted ) oleh automaton M jika lintasan w
dari suatu state awal q0 dapat mencapai state akhir di F.
Himpunan kata yang diterima oleh automaton M disebut
bahasa yang diterima oleh M dan dinyatakan dengan
L(M).
Catatan : kata-kata kosong ε diterima oleh M jika q0 juga
merupakan F.
Contoh : Misal ∑ = { a,b } ; M = (Q, ∑, δ, q0, F )
dimana Q = { q0 } ; F = Ø
Fungsi transisi δ dinyatakan dengan tabel sebagai berikut :
δ ( q0 , a ) = q0 ; δ ( q0 , b ) = q0
Diagram Graph atau diagram transisinya :
Start a  L ( M ) = Ø , mengapa ???
b
Misal M = (Q, ∑, δ, q0, F ) ; ∑ = { a,b } ; Q = { q0 } ; F = {q0}
Start a  L ( M ) = ∑*
b
q0
q0
δ a b
q0 q0 q0
Diketahui Automaton Berhingga M = (Q, ∑, δ, q0, F )
Q = { q0, q1, q2 } ; S = q0 ; ∑ = { a,b } ; F = { q2 }
1. Persamaan transisinya adalah sebagai berikut :
δ ( q0 , a ) = δ ( q1 , a ) = δ ( q2 , a ) =
δ ( q0 , b ) = δ ( q1 , b ) = δ ( q2 , b ) =
2. Tabel Transisinya :
Suatu string x dinyatakan diterima bila δ = ( S , x ) berada
pada state akhir. Secara formal dikatakan, bila M adalah
sebuah FSA menerima bahasa yang disebut L (M).
“ L (M) = { x │δ = ( S , x ) di dalam F } “
Misal, kita inputkan string “ abb “ pada contoh diatas, maka
δ = ( q0 , abb ) = δ ( q0 , bb ) = δ ( q1 , b ) ; δ = q2 ,
karena q2 termasuk state akhir , maka “ abb “ berada
dalam
L(M) = U { Si ; qi ϵ F }.
Contoh Lain : Coba inputkan string “ baba “
Pada DFA dari setiap state selalu tepat ada satu state
berikutnya untuk setiap simbol input yang ada.
Dari tabel (F ={q3} dan diagram transisi berikut ini, lengkapi FSA.
0
Start 1 0 1
1
0
q1q0 q2
δ a b
q0 q1 q2
q1 q3 q2
q2 q1 q3
q3 q3 q3
Latihan Soal-Soal DFA :
1. Diketahui Fungsi transisi dari DFA sebagai berikut :
dengan ; F = { q0, q1, q2 }, Lengkapi FSA nya !!
2. Diketahui Bahasa L ( M ) : ( a │b ) + ( aa │bb ) dengan
final statenya berada di F = { q1, q3 }, Lengkapi FSA
Nya.
δ a a
q0 q0 q1
q1 q0 q2
q2 q0 q3
q3 q3 q3
5.2. Non Deterministic Finite Automata ( NFA )
Suatu Automaton berhingga tak tentu ( Non Deterministic
Finite Automata / NFA ) adalah suatu 5-tuple yang terdiri
dari M = (Q, ∑, δ, q0, F ) , dimana δ : Q X ∑  2 Q
2 Q menyatakan power set dari Q atau himpunan semua
sub set dari Q. Biasanya fungsi transisi δ tidak hanya
bekerja pada sebuah huruf, tetapi juga bekerja pada
sebuah kata.
δ* : Q X ∑ *  2 Q
δ* ( q,w ) adalah suatu state di Q yang dicapai oleh
suatu state q setelah mendapat input kata w, fungsi δ*
didefiniskan sebagai :
a. δ* ( q,w ) = { q }
b. δ*(q,wa) = { p : p di δ(r,a ) untuk suatu state r di δ* (q,w)
c. δ* (p,w) = U {δ*( q,w ) : q di p } untuk setiap p subset Q
Definisi 2 :
M = (Q, ∑, δ, q0, F ) adalah NFA , maka bahasa yang
diterima oleh M yaitu L (M) menyatakan himpunan
{ w : δ ( q0,w ) mengandung suatu state akhir di F }.
Contoh : Misalkan M = (Q, ∑, δ, q0, F ) ; ∑ = { a,b } dimana
F = { q2 , q4 } dan Q = { q0, q1, q2, q3, q4 } dan tabel/
fungsi transisinya sebagai berikut :
δ a b
q0 { q0 , q1 } { q0 , q3 }
q1 Ø q2
q2 q2 q2
q3 q4 Ø
q4 q4 q4
Bila w = abaab , maka
δ ( q0 ,w ) = δ ( q0 ,a ) = { q0, q3 }
δ ( q0 ,ab ) = δ ( δ ( q0 ,a ), b ) = δ ({ q0 ,q3 }, b )
= δ ({ q0 }, b ) U δ ({ q3 }, b )
= { q0, q1 } U Ø = { q0, q1 }
δ ( q0 ,aba ) = δ ( δ ( q0 ,ab ), a ) = δ ({ q0 ,q1 }, a )
= δ ({ q0 }, a ) U δ ({ q1 }, a )
= { q0, q3 } U Ø = { q0, q3 }
δ ( q0 ,abaa ) = δ ( δ ( q0 ,aba ), a ) = δ ({ q0 ,q3 }, a )
= δ ({ q0 }, a ) U δ ({ q3 }, a )
= { q0, q3 } U { q4 } = { q0, q3 , q4 }
δ ( q0 ,abaab ) = δ ( δ ( q0 ,abaa ), b ) = δ ({ q0 ,q3 , q4 }, b )
= δ ({ q0 }, b ) U δ ({ q3 }, b ) U δ ({ q4 }, b )
= { q0 ,q3 , q4 }
5.3. NFA dengan ε move
Start ε ε
a b ε
b
ε = empty ( transisi ε ), diperbolehkan merubah state tanpa
membaca input/ tidak tergantung atas suatu input
Contoh : Dari q0 tanpa membaca input pindah ke q1
Dari q1 tanpa membaca input pindah ke q2
Dari q4 tanpa membaca input pindah ke q1
Memudahkan untuk mengkombinasikan FSA
q0
q3 q4
q1 q2
5.4. ε – Closure untuk NFA dengan ε - move
ε – closure adalah himpunan state-state yang dapat dicapai
dari suatu state tanpa membaca input. Misal :
ε – closure ( q0 ) = himpunan state yang dapat dicapai dari
state q0 tanpa baca input
Dari gambar diatas ;
ε – closure ( q0 ) = { q0, q1, q2 }
ε – closure ( q0 ) = { q1, q2 }
ε – closure ( q0 ) = { q2 }
ε – closure ( q0 ) = { q3 }
ε – closure ( q0 ) = { q1, q2, q4 }
ε – closure ( q0 ) = { q0, q1, q3 }
Contoh lainnya ;
“ Pada state yang memiliki transisi – ε, maka ε – closure
adalah state itu sendiri “.
Start ε a
ε b ε
ε – closure ( q1 ) = { q1, q3 }
ε – closure ( q2 ) = { q2, q4 }
ε – closure ( q3 ) = { q3 }
ε – closure ( q4 ) = { q4 }
q0
q3
q1 q2
q4
5.5. Ekivalensi NFA dengan ε–move ke NFA tanpa ε–move.
a
Start ε
b
Gambar a : NFA ε – move
a
a
Start
b
b
Gambar b : NFA tanpa ε – move
Untuk gambar yang kompleks diperlukan tahapan-tahapan
sebagai berikut :
a. Buat tabel transisi NFA ε – move.
b. Tentukan ε – closure untuk setiap state.
c. Carilah setiap fungsi transisi hasil perubahan dari NFA
ε–move ke NFA tanpa ε – move δ ‘ ( sebut δ ‘ ), dimana
δ ‘ didapat dengan rumus :
δ ‘( state,input ) = ε–closure ( δ (ε–closure(state,input)) .
d. Dari hasil c, baut tabel transisi dan diagram transisi dari
NFA tanpa ε – move yang ekivalen dengan NFA
ε-move tersebut.
e. Jangan lupa menentukan state-state akhir semula
ditambah dengan state-state yang ε – closure nya
menuju ke salah satu state akhir semula atau
F’ = F U { q │ (ε – closure ( q ) ∩ F ≠ Ø }
Misal ; bila semula F = { q0,q3 }, ε – closure )q1) = { q0,q2 }
maka F’ = { q0, q1, q3 }
Tabel transisi dari NFA ε – move
ε – closure untuk setiap state
ε – closure ( q0 ) = { q0,q1 }
ε – closure ( q1 ) = { q1 }
ε – closure ( q2 ) = { q2 }
ε – closure ( q3 ) = { q3 }
δ a b
q0 Ø Ø
q1 q1 q3
q2 Ø Ø
q3 Ø Ø
Kemudian dicari δ’ dengan memanfaatkan tabel transisi
dan ε – closure yang diperoleh sebagai berikut :
δ’ ( q0,a ) = ε – closure ( δ (ε – closure ( q0,a ))
= ε – closure ( δ ( { q0, q1 },a )) = ε – closure (q2) = { q2 }
δ’ ( q0,b ) = ε – closure ( δ (ε – closure ( q0,b ))
= ε – closure ( δ ( { q0, q1 },b )) = ε –closure (q3) = { q3 }
δ’ ( q1, a ) = ε – closure ( δ (ε – closure ( q1,a ))
= ε – closure ( δ ( { q1 },a )) = ε –closure ( q2 ) = { q2 }
δ’ ( q1,b ) = ε – closure ( δ (ε – closure ( q1,b ))
= ε – closure ( δ ( { q1 },b )) = ε –closure ( q3 ) = { q3 }
δ’ ( q2,a ) = ε – closure ( δ (ε – closure ( q2,a ))
= ε – closure ( δ ( { q2 },a )) = ε –closure ( Ø ) = { Ø }
δ’ ( q2,b ) = ε – closure ( δ (ε – closure ( q2,b ))
= ε – closure ( δ ( { q2 },b ))
= ε–closure ( Ø ) = { Ø }
δ’ ( q3,a ) = ε – closure ( δ (ε – closure ( q3,a ))
= ε – closure ( δ ( { q3 },a ))
= ε –closure ( Ø ) = { Ø }
δ’ ( q3,b ) = ε – closure ( δ (ε – closure ( q3,b ))
= ε – closure ( δ ( { q3 },b ))
= ε –closure ( Ø ) = { Ø }
Tabel Transisi NFA tanpa ε–move dengan F = { q3 }
δ a b
q0 q2 q3
q1 q2 q3
q2 Ø Ø
q3 Ø Ø
Latihan-Latihan Modul – 04 dan 05
Dari Berbagai bahasa tersebut di bawah ini,
lengkapi Finite State Automata ( FSA ), 6 atau 7
bagian !!.
1. L ( M ) : ( 0 │1 )+ 1 ( 10 │01 ) 0 ( 0 │1 )*
2. L ( M ) : ( aa│bb ) a ( a │b )*
3. L ( M ) : ( a │b )* ( aa│bb ) a ( a │b )+
MODUL – 06
SYNTAX GRAPH
Aturan-aturan dalam membangun grafik berdasarkan
grammar yang diberikan sebagai berikut :
a. Tiap simbol non terminal A dengan production :
A  α1 │ α2 │ α3 │…… │ αn
digambarkan dalam suatu grafik A yang strukturnya
ditentukan oleh bagian kanan dari productionnya sesuai
dengan aturan-aturan berikutnya.
b. Setiap adanya satu simbol terminal a dalam salah satu
α1 , berkaitan dengan a ditemukannya simbol tersebut
dan maju ke simbol berikutnya dari input. Keadaan ini
digambarkan dalam satu cabang dimana a terletak
dalam satu lingkaran.
c. Setiap adanya satu simbol non terminal B dalam satu α1 ,
dinyatakan dalam satu cabang dimana B terletak dalam
satu segi empat ( kotak ).
d. Satu production berbentuk : A  α1 │ α2 │ α3 │…… │ αn
e. Satu non terminal α1 , berbentuk : α = β1, β2, ……, βn
f. Satu non terminal α = { β }
Contoh : Diketahui suatu grammar sebagai berikut :
A  x │ ( B )
B  AC
C  { + A }
Gambarkan masing-masing Graph nya dan lakukan
penggabungan dari masing-masing gambar !!!.
Latihan-Latihan Modul – 06
Gambarkan masing-masing Graph nya dan lakukan
penggabungan dari gambar- gambar tersebut.
1. Diketahui suatu grammar sebagai berikut :
S  a │ ( aB ) │( C )
B  AC │{ - d }
C  bd
A  { + a }
2. Diketahui suatu grammar sebagai berikut :
K  b│ aL│{ - M }
L  Noh │{ - de }
M  bd
N  { + a }│x
MODUL – 07
ERROR HANDLING
7.1. Kesalahan Program
a. Kesalahan Leksilal : contoh then ditulis ten.
b. Kesalahan sintaks, misal operasi aritmatika dengan
jumlah parenthesis ( kurung ) yang tidak pas. Contoh :
A: = X + ( B * ( C - ).
c. Kesalahan Semantik
- Tipe data yang salah, contoh dalam program
dideklarasikan ; var siswa : integer { var siswa bertipe
integer }, tetapi selanjutnya ada instruksi yang
melakukan operasi dengan tipe yang salah pada var
siswa. Siswa := ‘Dadang’ { dilakukan operasi
assignment dengan tipe data string }.
- Var belum didefinisikan. Contoh di dalam program ada
instruksi B := B + 1 ; sementara B belum didefinisikan.
7.2. Penanganan Kesalahan
a. Langkah-langkah penanganan kesalahan.
b. Mendeteksi kesalahan.
c. Melaporkan kesalahan.
d. Tindak lanjut pemulihan/ perbaikan.
e. Kompilator yang menemukan kesalahan akan
melaporkan kesalahan.
f. Kode kesalahan.
g. Pesan kesalahan dalam bahasa natural.
h. Nama atribut identifier.
i. Tipe-tipe yang terkait
Misal terdapat pesan kesalahan :
Error 54 jumlah : unknown identifier
Dapat diartikan : kode kesalahan = 54
Pesan kesalahan = unknown identifier
Nama identifier = jumlah
7.3. Reaksi Kompilator Pada Kesalahan
a. Reaksi yang tidak dapat diterima ( tidak melaporkan
error ).
- Kompilator crash : berhenti atau hang
- Looping : loop[ing tidak berhingga ( indefinite /
onbounded loop ).
- Menghasilkan program objek yang salah :
Kompilator melanjutkan proses sampai dengan selesai
tapi program objek yang dihasilkan salah.
b. Reaksi yang benar tapi kurang dapat diterima dan
kurang bermanfaat. Komputer menemukan kesalahan
pertama, melaporkannya lalu berhenti ( halt ). Ini dapat
muncul bila pembuat kompilator menganggap jarang
terjadi error, sehingga kemampuan kompilator untuk
mendeteksi dan melaporkan kesalahan hanya satu
untuk setiap kompilasi. Programmer akan buang waktu
untuk melakukan pengulangan kompilasi setiap kali
terdapat sebuah error.
c. Reaksi-reaksi yang dapat diterima.
d. Reaksi yang sudah dapat dilakukan, kompilator
melaporkan error dan selanjutnya melakukan :
- Recovery ( pemulihan ).
- Repair ( perbaikan kesalahan ).
e. Reaksi yang belum dapat dilakukan, yaitu kompilator
mengoreksi kesalahan, lalu menghasilkan program objek
sesuai dengan yang diinginkan pemrogram. Disini
komputernya telah memiliki kecerdasan untuk
mengetahui maksud pemrogram. Tingkatan respon ini
belum dapat diimplementasikan pada kompilator yang
ada dewasa ini.
7.4. Error Recovery
Pemulihan kesalahan bertujuan mengembalikan parser
ke kondisi stabil (agar dapat melanjutkan proses parsing
ke posisi selanjutnya). Strateginya sebagai berikut :
a. Mekanisme Ad Hoc
Recovery yang dilakukan tergantung dari pembuat
kompilator sendiri/ spesifik, dan tidak terikat pada suatu
aturan tertentu. Cara ini dapat disebut sebagai Special
purpose error recovery.
b. Syntax directed recovery.
Melakukan recovery berdasarkan sintaks, misal
potongan program
Begin
A := A + 1
B := B + 1
C := C + 1
End;
Kompilator akan mengenali sebagai :
Begin <statement>?<statement> ; <statement> end;?
Akan diperlakukan sebagai ‘ ; ‘
c. Secondary error recovery
Berguna untuk melokalisir error, caranya ;
d. Panic mode
Maju terus dan mengabaikan teks sampai bertemu
delimeter. Misal ‘ ; ’ . Contoh pada potongan program :
If a = 1 kondisi := true ;
e. Unit deletion.
Menghapus keseluruhan suatu unit sintaktik ( misal :
<blok>, <statement> dan sebagainya ). Efeknya mirip
dengan panic mode tetapi unit deletion memelihara
kebenaran sintaksis dari source program dan
mempermudah untuk melakukan error repairing lebih
lanjut.
f. Context sensitive recovery
Berkaitan dengan semantik, misal terdapat variabel yang
belum dideklarasikan, maka diasumsikan tipenya ber
dasar kemunculannya. Misal pada potongan program
terdapat instruksi : B := ‘nama’, sementara B belum
dideklarasikan berdasarkan kemunculannya
diasumsikan variabel B bertipe string.
7.5. Error Repair
Bertujuan meodifikasi source program dari kesalahan
dan membuatnya valid, sehingga memungkinkan
kompilator untuk melakukan translasi program yang
mana akan dialirkan ke tahapan selanjutnya pada
proses kompilasi. Mekanisme error repair meliputi :
a. Mekanisme Ad Hoc
Tergantung dari pembuat kompilator sendiri/ spesifik.
b. Syntax directed repair.
Menyisipkan simbol terminal yang dianggap hilang atau
membuang terminal penyebab kesalahan. Contoh :
While A < 1
I := I + 1 kompilator akan menyisipkan simbol Do
Begin
X := X + 1
End;
End; kelebihan end, salah maka kompilator
akan membuangnya
c. Context sensitive repair
Perbaikan dilakukan pada kesalahan :
- Tipe identifier. Diatasi dengan membangkitkan identifier
dummy, misal pada potongan program
Var
A : string ;
Begin Kompilator akan memperbaiki kesalahan
A := 0 ; dengan membangkitkan identifier baru
End; misal B yang bertipe integer.
- Tipe konstanta
Diatasi dengan membangkitkan konstanta baru
dengan tipe yang tepat.
d. Spelling repair
Memperbaiki kesalahan pengetikan pada identifier,
misal while A = 1 do diperbaiki menjadi while ….
Contoh-contoh kesalahan yang ada dan mekanisme
penanganannya bukanlah berasal dari suatu produk
kompilator tertentu meskipun instruksi-intruksi yang
ada dalam potongan-potongan program disini
memiliki kemiripan dalam Bahasa Pascal.
Tujuannya adalah untuk mempermudah
pemahaman semata.
MODUL – 08
ANALISA SINTAKS
8.1. Context Free Grammar ( CFG ) /
Tata Bahasa Bebas Konteks.
Grammar didefinisikan dengan 4-tupel ( G = { V, T, P, S }
Dimana :
V = himpunan simbol variabel/ non terminal.
T = himpunan simbol terminal.
P = kumpulan aturan produksi.
S = Simbol awal.
Grammar mendefinisikan pula konstruksi satu bahasa
program tertentu secara rekursif.
Contoh :
a. S1, S2, adalah statement dan E adalah ekspresi, maka “
if E then S1 else S2 “ adalah satu statement.
b. S1, S2, …., Sn adalah statement-statemen, maka begin
S1, S2, …, Sn end. Adalah satu statement.
c. E1 dan E2 adalah ekspresi, maka “ E1 + E2 “ adalah
ekspresi. Apabila digunakan penulisan dengan katagori
sintaktif :
a. Untuk statement ;<stmt> menyatakan himp statement.
c. Untuk ekspresi :<Expr> menyatakan himp ekspresi,
maka aturan penulisan diatas dapat ditulis :
<stmt>  if < eksp > then < stmt > else < stmt >
b. < stmt >  begin < stmt >,<stmt>,….<stmt> end.
Penulisan ini tidak memberikan penjelasan yang cukup
Oleh sebab itu diperlukan satu katagori sintaktif yang
disebut < stmt-list>. Jadi untuk b dapat ditulis
< stmt >  begin <stmt-list> list end , atau
< stmt-list>  <stmt> │< stmt > ; < stmt-list>
Jadi satu statemen – list adalah satu statemen yang
diikuti oleh satu titik koma dan satu statemen – list
Konvensi Notasi
Simbol-Simbol Non Terminal
• Nama-nama dengan huruf kecil seperti <eksp>, <stmt>.
• Huruf kapital/ besar : A, B, C, ……, Z
• Huruf S digunakan sebagai simbol start
Simbol - Simbol Terminal
• Huruf-huruf kecil : a,b,c,….,z
• Simbol operator : +, -, * , / , ↑ dan sebagainya.
• Simbol-simbol tanda baca : , ; , : ! , # , $ dan sebagainya.
• Angka-angka dari 0 sampai dengan 9
• String yang diberi garis bawah : begin , id , dsb.
Huruf-huruf Yunani : α , β , dan sebagainya, menyatakan
set/ himpunan dari simbol grammar.
8.2. Derivasi dan Parse Tree
1. Derivasi
Perhatikan Grammar berikut ini :
E  E + E │E * E │E - E │( E ) │- E│id
Production E  E + E , dapat diartikan/ dipahami :
• E menurunkan E + E
• E diganti oleh E + E
• E menghasilkan E + E
Contoh : diketahui string : - ( id + id ) apakah merupakan
suatu kalimat dari grammar :
E  E + E │E * E │E - E │( E ) │- E│id
E  - E  - ( E )  - (E + E)  - (id + E)  - (Id + id)
Bila penurunan dimulai dari sebelah kiri disebut :
Left Most Derivation
Bila penurunan dimulai dari sebelah kanan disebut :
Right Most Derivation
2. Parse Tree
Misalkan A  XYZ , maka parse tree nya dapat
digambarkan sebagai berikut :
A
X Y Z
Parse tree untuk : - ( id + id )
- ( E )  - (E + E)  - (id + E)  - (Id + id)
Bagaimana dengan string : id + id * id ???. Apakah
merupakan satu kalimat dari grammar tersebut diatas ??
String tersebut dapat diuraikan sebagai berikut :
Versi A : Versi B :
E  E + E E  E * E
E  id + E E  E + E * E
E  id + E * E E  id + E * E
E  id + id * E E  id + id * E
E  id + id * id E  id + id * id
Gambar Parse tree dari kedua versi tersebut !!!.
Grammar : E  E + E │E * E │E - E │( E ) │- E│id
Dapat ditulis dalam bentuk yang tidak rangkap ( un
ambigous ). Untuk itu diperlukan simbol-simbol non
terminal baru yang disebut : Element, Primary, Factor,
Expression dan Terminal, yang terdiri dari :
1. < Element >  (< Expression > │id
2. < Primary >  - (< Primary > │< Element >
3. < Factor >  (< Primary > ↑ < Factor >│< Primary >
4. <Terminal>  <Term> * <Fact>│<Term>/<Fact │<Fact>
5. <Expression>  <Expr> + <Term>│< Expr > - <Term>│
<Term>
Penulisan diatas terlampau panjang, maka
disederhanakan menjadi : ( selanjutnya disebut sebagai
“Grammar 5-Langkah”).
E  E + T │E – T │T
T  T * F │T / F│F
F  P ↑ F │P
P  - P │L
L  ( E ) │id
String : id + id * id , jika diuraikan dengan menggunakan
grammar 5-langkah akan mempunyai Tree yang tunggal.
E  E + T E
E  T+ T
E  P + T E + T
E  L + T
E  id + T T T * F
E  id + T * F
E  id + F * F F F P
E  id + P * F
E  id + L * F P P L
E  id + id * F
E  id + id * P L L id
E  id + id * L
E  id + id * id id id
Latihan Soal-Soal Modul - 08
Lakukan Derivasi Dan Gambar Parse Tree nya dari
string-string berikut ini !!!.
1. id ↑ - id + id – id
2. - id * - id / id + id
3. ( id / - id ) * id / – id
4. id / ( - id ↑ id ) + id * id
5. - ( id * - id ) ↑ id ) + id / id
6. - id + (( id / - id ) * - id ) ↑ id
7. id - ( id / - id ) * ( - id ↑ id )
Dari tujuh nomor tersebut, uraikan langkah-
langkahnya dalam Kegiatan Shift Reduce Parsing
MODUL – 09
TEKNIK PARSING
Parsing merupakan tahapan analisis sintaksis yang berguna
untuk memeriksa urutan kemunculan token. Didalam
mengimplementasikan sebuah metode parsing ke dalam
program perlu diperhatikan tiga hal :
1. Rentang waktu eksekusi.
2. Penanganan kesalahan.
3. Penanganan kode
Parser
Parser untuk grammar G adalah program yang menerima
string/ untai w sebagai inputnya dan menghasilkan output
berupa satu parse tree untuk w, bila w merupakan kalimat
dari G atau satu error message apabila w bukan merupakan
satu kalimat dari G.
Metode Parsing dapat digolongkan sebagai berikut :
1. Top Down
Kalau dilihat dari terminologi pohon penurunan, metode
ini melakukan penelusuran dari root/ puncak menuju
leaf/ daun ( simbol awal sampai dengan simbol
terminal). Metode Top down sendiri meliputi :
- Backtrack/ Backup : Brute Force.
- No Backtrack : Recursive Descent Parser.
2. Bottom Up
Metode ini melakukan penelusuran dari leaf/ daun
menuju root/ puncak, disebut sebagai Metode Shift
Reduce Parsing ( SRP ).
9.1. Parsing Dengan Brute Force
Metode ini akan memilih aturan produksi mulai dari
paling kiri dan melakukan semua expand non terminal
pada aturan produksi sampai yang tertinggal adalah
simbol terminal. Kemungkinan pertama string masukan
sukses di parsing, bisa juga bila terjadi ekspansi yang
salah untuk suatu simbol variabel maka akan dilakukan
backtrack. Algoritma ini membangun pohon parsing yang
top down, yaitu mencoba segala kemungkinan untuk
setiap simbol non terminal.
Contoh Suatu bahasa dengan aturan produksi :
S  a Ad│aB
A  b │c
B  ccd │ddc
Misal ingin dilakukan parsing untuk string “ accd “, tahapan
yang terjadi dapat dilihat pada gambar berikut ini :
1. S 2. S 3. S
a A d a A d
b
4. S 5. S 6. S
a A d a B a B
c c c d
Gambar 9.1. : Pohon penurunan dari untai “ accd “
Kelemahan dari metode Brute Force adalah :
• Mencoba untuk semua aturan produksi yang ada
sehingga nenjadi lambat ( rentang waktu eksekusi tidak
jelas ).
• Menyulitkan untuk melakukan pemulihan kesalahan.
• Memerlukan banyak memori karena perlu mencatat
(backup) lokasi backtrack.
Contoh lainnya : Perhatikan Grammar berikut ini :
S  iCtS
S  iCtSeS
S  a
C  b
Satu parse tree untuk untai w = ibtibtaea , dapat dilihat
pada gambar berikut :
Parse tree untuk untai w = ibtibtaea tersebut diatas adalah
penurunan terkiri.
S  iCtS  ibtS  ibtiCtSeS  ibtibtSeS  ibtibtaeS
 ibtibtaea
Satu parse tree untuk penurunan terkanan dapat pula
dibangun dengan cara yang sama, dimana setiap non
terminal terkanan yang diketemukan diganti dengan
productionnya.
S  iCtS  iCtiCtSeS  iCtiCtSea  iCtiCtaea
 iCtibtaea  ibtibtaea
Penurunan terkiri ekivalen dengan penurunan terkanan.
Satu penurunan terkiri/ terkanan dengan mudah dapat
diubah menjadi satu parse tree atau sebaliknya. Satu
parse tree menjadi penurunan terkiri/ terkanan.
9.2. Shift Reduce Parsing ( SRP )
Shift Reduce Parsing adalah salah satu metode Bottom
up dimana bila satu string ( string bagian ) cocok dengan
bagian kanan satu production maka string (string bagian)
itu diganti dengan bagian productionnya.
Perhatikan Grammar berikut ini :
S  aAcBe
A  Ab │b
B d dan string : w = abbcde
Penyederhanaan tidak lain adalah penurunan terkanan.
S  aAcBe  aAcde  aAbcde  abbcde
String bagian yang digantikan dengan bagian kiri
production disebut handle. Jadi Bottom up parsing dapat
diartikan mencari dan menyederhanakan handle.
Handle
Satu handle dari string γ adalah production A  γ dan satu
posisi dari γ dimana string β dapat ditemukan dan
digantikan oleh A untuk menghasilkan bentuk terdahulu
dalam satu penurunan terkanan dari γ , yaitu bila
S  α A w  α β w
Maka A β pada posisi sesudah α adalah satu handle
dari α β w
Contoh : diketahui Grammar :
E  E + E │E * E │E - E │( E ) │- E │E ↑ E │E / E │id
Penurunan terkanan :
E  E + E
E  E + E * E
E  E + E * id3
E  E + id2 * id3
E  id1 + id2 * id3
Menghilangkan handle
String : id1 + id2 * id3 ingin disederhanakan menjadi E
Implementasi Stack
Ada 2 macam dalam menghilangkan handle :
1. Bagaimana mencari/ menentukan handle.
Handle Production
id1 + id2 * id3 id1 E  id1
id1 + id2 * id3 id2 E  id2
id1 + id2 * id3 id3 E  id3
E + E * E E * E E  E * E
E + E E + E E  E + E
E
2. Production mana yang dipilih bila terdapat
lebih dari satu production dengan bagian
kanan yang sama. Satu stack dan satu
input buffer digunakan dalam Shift Reduce
Parsing ( SRP ). Kegiatan-kegiatan Shift
Reduce Parsing ( SRP ) untuk
menguraikan input string id1 + id2 * id3 ,
dapat dilihat pada uraian berikut ini :
Tabel 9.2 : Kegiatan-Kegiatan Dalam SRP
No. Stack Input Action
1. $ id1 + id2 * id3 $ Shift
2. $ id1 + id2 * id3 $ Reduce by E  id1
3. $ E + id2 * id3 $ Shift
4. $ E + id2 * id3 $ Shift
5. $ E + id2 * id3 $ Reduce by E  id2
6. $ E + E * id3 $ Shift
7. $ E + E * id3 $ Shift
8. $ E + E * id3 $ Reduce by E  id3
9. $ E + E * E $ Reduce by E  E * E
10. $ E + E $ Reduce by E  E + E
11. $ E $ Accept
9.3. Relasi presenden dan pemakaiannya
Misal, diketahui untai ….. rs ….., apakah rs selalu
merupakan akar dari handle/ dapatkah kedua rs berada
bersama-sama dalam handle atau bagimana ?.
Pandanglah 2 simbol r dan s di dalam vocabulary V dari
grammar G. pada beberapa titik dari proses parsing.
Salah satu r atau s atau kedua-keduanya haruslah
berada dalam satu handle. Ada 3 kemungkinan :
u u u
…. …….. rs .. .. rs .. rs …… ...
Hadle a : r  s Handle b : r ↔ s Handle c : r ← s
u ..rs u ..rs u  s
Contoh : Diketahui Grammar G-9, dengan simbol Z dan
produksi
Z  bMb
M ( L │a
L  Ma )
Bahasa L (G-9) mengandung untai b(aa)b, b((aa)a)b, dsb.
Ditunjukan bentuk sentensial, pohon sintaks, handle dari
pohon/ relasi yang dapat diturunkan dari pohon yang
bersangkutan dengan masing-masing bentuk sentensial:
1. Bentuk sentensial : bab Z
Handle : a
Relasi yang diberikan pohon b M b
b ← a
a b a
2. Bentuk sentensial : b(Lb Z
Handle : ( L
Relasi yang diberikan pohon : b M b
b ← (
( ↔ L` ( L
L  b
3. Bentuk sentensial : b(Ma)b Z
Handle : Ma)
Relasi yang diberikan pohon : b M b
(← M
M ↔ a ( L
a ↔ )
)  b M a )
Matrik presenden Grammar G-9, elemen B (I,J) dari matrik
berisi relasi antara sepasang simbol dari suatu Grammar.
Z b M L a ( )
Z
b ↔ ← ←
M → ↔ → ←
L ← → →
a → → ↔
( → → ↔
) → →
Latihan-Latihan Modul - 09
Diketahui Grammar sebagai berikut :
1. S  bPb │x │y )
P  ( M │a
M  Pa )
2. S  bNb
N  ( K │a
K  Na )
3. S  bDb │c
D ( L │e
E  Da )
Uraikan seluruh untai yabng mungkin (minimum 5
untai), tentukan handle dan relasinya. Susun pula
matriks presendennya.
MODUL – 10
ANALISA SEMANTIK
Analisa semantik masih termasuk dalam bagian front
end (bagian yang menangani analisa source program).
Proses ini merupakan kelanjutan dari proses kompilasi
sebelumnya. Pada tahap ini dilakukan pengecekan pada
struktur akhir yang telah diperoleh dan diperiksa
kesesuaiannya dengan komponen program yang ada.
Pada hakekatnya, analisa semantik memanfaatkan
pohon sintaks yang dihasilkan pada proses parsing.
Secara teori, sebenarnya diinginkan agar proses analisa
sintaks dan analisa semantik adalah dua hal yang
terpisah, akan tetapi pada tingkat praktis hal tersebut
sulit untuk dilakukan. Proses analisa sintaks dan analisa
semantik merupakan dua proses yang erat kaitannya
dan sulit sekali untuk benar-benar dipisahkan.
Pengecekan yang dilakukan oleh analisis semantik adalah:
1. Memeriksa keberlakuan nama-nama meliputi
pemeriksaan :
a. Duplikasi
Pada tahap ini dilakukan pengecekan apakah sebuah
nama terjadi pendefinisian lebih dari dua kali.
Pengecekan dilakukan pada bagian pengelola blok.
b. Terdefinisi
Melakukan pengecekan apakah sebuah nama yang
yang dipakai pada tubuh program sudah terdefinisi
atau belum.
Pengecekan dilakukan pada semua tempat kecuali
Blok
2. Memeriksa Tipe
Melakukan pemeriksaan terhadap kesesuaian tipe
dalam statement-statement yang ada. Misalkan bila
terdapat suatu operasi diperiksa tipe operan. Contohnya
bila ekspresi yang mengikuti instruksi If berarti tipenya
Boolean, akan diperiksa tipe identifier dan tipe ekspresi.
Bila ada operasi antara dua operan maka tipe operand
pertama harus bisa dioperasikan dengan operan kedua.
10.1. Notasi N-Tuple
Pada Postfix setiap baris instruksi hanya terdiri dari satu
tupel. Pada notasi N-Tuple setiap baris dapat terdiri dari
beberapa tupel.
Format umum dari notasi N-Tuple adalah :
Operator ……. N – 1 ……… Operand
10.1.1. Triples Notation
Notasi triple memiliki format :
< operator > < operand > < operand >
Contoh instruksi : A := D * C + B / E
Bila dibuat kode antara triple :
1. * , D , C
2. / , B , E
3. + , ( 1 ) , ( 2 )
4. := , A , ( 3 )
Contoh lain :
If X > Y then
X := a – b
Else
X := a + b
Kode antara triple nya :
1. > , X , Y
2. BZ ( Branch if Zero ),( 1 ) , ( 6 ) { bila kondisi ( 1 ) salah
loncat ke no ( 6 ) }
3. - , a , b
4. := , x , ( 3 )
5. BR, , ( 8 )
6. + , a , b
7. := , x , ( 6 )
Kekurangan notasi triples adalah sulit pada saat
melakukan optimasi, maka dikembangkan indirect
triples yang memiliki dua list, yaitu list instruksi dan list
eksekusi. List instruksi berisi notasi triples, sedang list
eksekusi mengatur urutan eksekusinya.
Misal terdapat urutan Instruksi : A := B + C * D / E dan
F := C * D
List instruksi
1. * , C D
2. / , ( 1 ), E
3. + , B , ( 2 )
4. := , A , ( 3 )
5. := , F , ( 1 )
List eksekusi
1. 1
2. 2
3. 3
4. 4
5. 1
6. 5
10.1.2. Quadruples Notation
Format data Quadruple :
< Operator > < operand > < Operand > < hasil >
Hasil adalah temporary variabel yang dapat ditempatkan
pada memori atau register. Masalah yang ada, adalah
bagaimana mengelola temporary variabel ( hasil )
seminimal mungkin.
Contoh instruksi : A := D * C + B / E
Bila dibuat dalam kode antara :
1. * , D , C , T1
2. / , B , E, T2
3. + , T1 , T2 , A
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.
Misalkan ekspresi : ( A + B ) * ( C + D )
Yang mana kode antaranya dalam bentuk quadruple :
1. + , A , B , T1
2. + , C, D , T2
3. * , T1 , T2 , T3
Dapat ditranslasikan ke dalam bahasa assembly
dengan akumulator tunggal :
1. LDA A 4. LDA C 7. LDA T1
2. ADD B 5. ADD C 8. MUL T2
3. STO T1 6. STO T2 9. STO T3
Keluaran dari code generator akan diterima oleh code
optimizer. Misalkan untuk code assembly diatas dapat
dioptimasi menjadi :
1. LDA A 4. LDA C 7. STO T2
2. ADD B 5. ADD C
3. STO T1 6. MUL T1
Contoh perjalanan sebuah instruksi sampai ke
pembangkit kode dapat dilihat pada gambar
berikut ini :
Gambar 10.1 : Perjalanan Sebuah Instruksi
<assign>
id1 := <ekspr>
id2 + id3 LDA X
ADD Y
Source Token-Token STO Y
Program id1 := id2 + id3
X := X + Y Analisis
Leksikal
Analisis
Sintaksis
Code Generator
Dan Analisa
Semantik
Tabel
Simbol
10.2. Definisi Berdasarkan Sintaks
Ada dua notasi yang menghubungkan aturan-aturan
semantik dengan produksi-produksi ( production ) :
Definisi berdasarkan sintaks merupakan definisi tingkat
tinggi untuk translasi. Detail implementasinya tidak
disertakan dan user tidak perlu menentukan urutan
translasinya.
Skema translasi : menyatakan urutan evaluasi untuk
aturan semantik, sehingga sangat mungkin untuk
menunjukan detail implementasinya.
Gambar 10.2 : Konsep translasi berdasarkan sintaks
Input
String
Parse
Tree
Ketergantungan
Graph
Penerimaan Evaluasi
Untuk Aturan-Aturan
Semantik
Evaluasi berdasarkan semantik dapat membentuk kode,
menyimpan informasi tabel simbol, menampilkan pesan
kesalahan atau menampilkan aktifitas lainnya.
Pada pembahasan analisa sintaks dikenal adanya
Contex Free Grammar ( CFG ). CFG mempunyai
himpunan atribut yang dipecah menjadi 2 sub himpunan,
yaitu :
1. Himpunan atribut tersintesis.
2. Himpunan atribut terinheritasi.
Atribut dapat mereferesentasikan apa saja sesuai
dengan pilihan kita seperti : rangkaian, angka, type,
lokasi memori dan sebagainya. Evaluasi aturan
semantik mendefinisikan nilai atribut pada node-node
dipohon urai untuk rangkaian masukannya, mencetak
nilai atau mengubah variabel global.
Pohon urai yang menunjukan nilai atribut pada masing-
masing node disebut pohon urai teranotasi.
10.3. Bentuk Semantik
A  α aturan semantiknya : b := f ( c1, c2, ….., ck )
F adalah suatu fungsi dan salah satu dari dua hal berikut
yang dipenuhi :
1. b adalah atribut tersintesis dari A dan c1, c2, ….., ck
merupakan atribut kepunyaan simbol tata bahasa
sebelah kanan produksi,
2. b adalah atribut terinheritasi dari satu simbol tata
bahasa sebelah kanan produksi dan c1, c2, ….., ck
merupakan atribut kepunyai A atau simbol tata bahasa
sebelah kanan produksi. Dikatakan b tergantung pada
atribut c1, c2, ….., ck . Fungsi-fungsi dalam aturan
semantik akan sering ditulis sebagai ekspresi,
pemanggilan prosedur atau bagian-bagian dari program
Contoh
Dalam sebuah program kalkulator, definisi mengaitkan
atribut tersintesis bernilai integer ( disebut val ). Non
terminal : E, T, F. Nilai atribut val untuk non terminal
disebelah kiri, nilai val untuk non terminal disebelah
kanan.
Tabel 10.1 : Definisi Terdireksi Suntaks Dari Kalkulator
Produksi Aturan Semantik
L  En Print ( E. val )
E  E1 + T E1. val := E1. val + T. val
E  T E. Val := T. val
T  T1 * F T. Val := T1. val * F. val
T  F T. Val := F. val
F  ( E ) F. Val := E. val
F  Digit F. Val := Digit. Lexval
L  En adalah suatu prosedur yang mencetak nilai
ekspresi aritmatik yang dibentuk oleh E ( aturan ini dapat
dianggap sebagai pendefinisian suatu atribut dummy
untuk non terminal L ). Dalam definisi berdasarkan
sintaks, terminal-terminal diasumsikan hanya
mempunyai atribut tersintesis. Token digit mempunyai
atribut tersintesis Lexval yang nilainya diasumsikan
disuplay dari penganalisaan sintaks.
10.3.1. Atribut Tersintesis
Suatu definisi berdasarkan sintaks yang memakai atribut
tersintesis disebut definisi “ Teratribusi – S “. Suatu
pohon urai untuk definisi teratribusi - S selalu dapat
dianotasi.
Contoh : Ekspresi : 3 * 5 + 4
Terdiri dari angka, operator + dan * dan diakhiri dengan
Karakter baris baru n dan mencetak nilai
ekspresi itu. Program tersebut akan
mencetak angka 19. Keluaran yang
dicetak pada akar pohon merupakan nilai
dari E.val pada anak pertama akar itu.
Gambar 10.3 : Pohon Urai Teranotasi Untuk Ekspresi
3 * 5 + 4
L
E.val = 19 n
E.val = 15 + T. val = 4
T. val = 15 F. val = 4
T.val = 3 * F. val = 5 Digit.Lexval = 4
F. val = 3 Digit.Lexval = 5
Digit. Lexval = 3
Latihan-Latihan Modul - 10
Dari ekspresi matematik berikut ini dan dengan
menggunakan Grammar 5 – Langkah, gambar
pohon urai teranotasi. Ubah ke dalam bentuk
identifier, lakukan derivasi, gambar parse tree,
susun bentuk intermediate code dan notasi N-
tuple nya.
1. (( 5 + 4 ) / 3 ) ↑ 5
2. 20 – 5 * ( 14 / 2 )
3. 2 ↑ 5 * - 2 / - 4
4. - 4 * 6 / - 2 ↑ 3 + 7
5. 2 ↑ - 3 * ( - 24 / 3 ) - 6
MODUL – 11
TEKNIK OPTIMASI
11.1. Dependensi Optimasi
Tujuannya adalah untuk menghasilkan kode program
yang berukuran lebih kecil dan lebih cepat eksekusinya.
Berdasarkan ketergantungan pada mesin, optimasi
dibagi menjadi :
a. Machine Dependent Optimizer.
Kode dioptimasi sehingga lebih efisien pada mesin
tertentu. Optimasi ini memerlukan informasi mengenai
feature yang ada pada mesin tujuan dan mengambil
keuntungan darinya untuk menghasilkan kode yang
lebih pendek atau eksekusi yang lebih cepat.
b. Machine Independent Optimizer
Strategi optimasi yang bisa diaplikasikan tanpa
tergantung pada mesin tujuan tempat kode yang
dihasilkan akan dieksekusi nantinya. Bab ini selanjutnya
akan membahas optimasi machine independent yang
meliputi optimasi lokal dan optimasi global.
11.2. Optimasi Lokal
Optimasi lokal adalah optimasi yang dilakukan hanya
pada suatu blok dari source code, cara-caranya :
1. Folding
Mengganti konstanta atau ekspresi yang bisa dievaluasi
pada saat compiler time dengan nilai komputasinya.
Misalkan instruksi : A := 2 + 3 + B dapat diganti menjadi
A := 5 + B
2. Redundant – Subexpression Elimination
Sebuah ekspresi yang pernah dikomputasi, digunakan
lagi hasilnya, dari pada melakukan komputasi ulang.
Misalkan terdapat urutan instruksi :
A : = B + C
X := Y + B + C
Kemunculan kedua dari B + C yang redundan bisa
diatasi dengan memanfaatkan hasil komputasinya yang
sudah ada pada instruksi sebelumnya. Perhatikan, hal
ini dapat dilakukan dengan catatan belum ada
perubahan pada variabel yang berkaitan.
3. Optimasi Dalam sebuah Iterasi
- 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.
Inisialisasi/ pemberian nilai awal pada variabel loop.
Dilakukan sekali pada saat permulaan eksekusi loop.
Pengetesan apakah variabel loop telah mencapai
kondisi terminasi. Adjusment yaitu penambahan atau
pengurangan nilai pada variabel loop dengan jumlah
tertentu. Operasi yang terjadi pada tubuh perulangan
(Loop Body).
Contoh pada instruksi :
For I := 1 to 2 Do
A [ I ] := 0 ;
Dapat dioptimasikan menjadi : A [ 1 ] := 0 ;
A [ 2 ] := 0 ;
Yang hanya memerlukan dua instruksi assignment saja.
- Frequency Reduction
Pemindahan statement ke tempat yang lebih jarang
dieksekusi.
Cohtoh :
For I := 1 to 10 Do
Begin
X := 5 ;
A := A + 1 ;
End;
Dapat dioptimasi menjadi : X := 5 ;
For I := 1 to 10 Do
Begin
A := A + 1
End;
- Strength Reduction
Penggantian suatu operasi dengan jenis operasi lain
yang lebih cepat dieksekusi. Misalkan pada beberapa
komputer operasi perkalian memerlukan waktu lebih
banyak untuk diekseskusi dari pada operasi perjumlahan
maka penghematan waktu dapat dilakukan dengan
mengganti operasi perkalian tertentu dengan
perjumlahan. Contoh lain instruksi :
A := A * 1 ;
Dapat diganti dengan : Inc ( A ) ;
11.3. Optimasi Global
Biasanya dilakukan dengan analisis flow, yaitu sebuah
graph berarah yang menunjukan jalur yang mungkin
selama eksekusi program
Kegunaannya : ……………….
11.3.1. Bagi Pemrogram Menginformasikan
- Unreachable / dead code : kode yang tidak akan pernah
dieksekusi.
- Misalnya terdapat urutan instruksi :
X := 5 ;
If X = 0 then A := A + 1
Instruksi A := A + 1 tidak akan pernah dieksekusi.
- Unused Parameter pada Prosedur.
Parameter yang tidak pernah digunakan di dalam
prosedur. Contohnya :
Procedure Jumlah ( a,b,c : integer ) ;
var X : integer
Begin
X := a + b ;
End;
Parameter c tidak pernah digunakan dalam prosedur.
- Unused Variabel
Variabel yang tidak pernah dipakai dalam program.
Contohnya : Program pendek ;
var a,b : integer ;
begin
A := 5 ;
End;
Variabel b tidak pernah digunakan dalam program
sehingga dapat dihilangkan.
Variabel yang dipakai tanpa nilai awal. Contohnya :
Program awal ;
Var a,b : integer ;
begin
A := 5 ;
A := A + B ;
End;
Variabel B digunakan tanpa memiliki nilai awal.
Latihan-Latihan Modul - 11
1. Lakukan optimasi lokal yang diperlukan pada potongan
program berikut dan jelaskan optimasi apa saja yang
dilakukan !!.
A := B + 10 * 4 ;
C := B + D ;
F := B + D – G ;
For I := 1 to 100 Do
Begin
X := X + 1 ;
A := A + X ;
B := 7 ;
End;
2. Apakah kita dapat melakukan optimasi redundant sub-
expression elimination pada statement berikut ? Why ?
a b
A := B + C ; A := B + C ;
A := X + Y ; B := X + Y ;
F := B + C + G + H ; F := B + C + G + H ;
3. Apakah cukup efisien kita melakukan optimasi loop
unrolling untuk statement berikut :
For I := 1 to 100 Do A ( I ) := “ “
4. Penghematan apa yang dilakukan dengan
menggantikan instruksi semacam X eksponensial
(pangkat ) n , bila n = 2 ( X 2 ) dengan X * X
MODUL – 12
TABEL INFORMASI
12.1. Kegunaan Tabel Informasi
Tabel informasi atau tabel simbol dibuat guna
mempermudah pembuatan dan implementasi dari
semantik analyzer. Ada 2 fungsi penting dalam proses
translasi, yaitu :
- Untuk membantu pemeriksaan kebenaran semantik dari
program sumber.
- Untuk membantu dan mempermudah dalam pembuatan
intermediate code dan proses pembangkitan code.
Identifier pertama kali ditemukan dengan mencarinya
sebagai unit leksikal, jika diperoleh maka nilai indeksnya
pada tabel diberikan oleh scanner. Rutin penanganan
tabel simbol pemanggilannya tergantung terutama pada
Jumlah dan sifat compiler.
Pada multipass/ separate compiler, seperti terlihat pada
gambar 9.1. Tabel simbol dibuat selama tahapan analisis
leksikal. Entry indeks untuk variabel pada tabel simbol
dibentuk oleh token string yang dihasilkan scanner.
Sebagai contoh pada gambar 9.1. X dan Y menjadi
posisi indeks ke 1 dan ke 2 tabel simbol. Tahapan
leksikal analysis menerima token-token tersebut,
memeriksa kebenaran sintaksis dan membangkitkan
semacam pohon parsing. Bentuk tersebut kemudian
dianalisa oleh kebenaran semantik, misal kebenaran
context dependent dan digunakan pada tahapan
pembangkitan kode untuk menghasilkan sekumpulan
instruksi objek code. Perhatikan tidak ada rutin yang
menangani tabel yang digunakan selama tahapan
analisis sintaksis
Pada pemeriksaan semantik dan pembangkitan
kode banyak atribut yang berhubungan dengan
suatu variabel bisa diberi nilai dalam tabel
simbol. Contoh bahasa dengan deklarasi
eksplisit, tipe dari satu variabel hanya bisa
diassign saat dikenali statement deklarasinya
telah dikompilasi. Disarankan nama variabel
harus dimasukan ke dalam tabel simbol selama
analisis leksikal dan atribut lainnya di assigned
selama pembangkitan kode
Gambar 12.1 : Interaksi Tabel Simbol Pada Multipass Compiler
<assign>
id1 := <ekspr>
id2 + id3 LDA X
ADD Y
Source Token-Token STO Y
Program id1 := id2 + id3
X := X + Y Analisis
Leksikal
Analisis
Sintaksis
Code Generator
Dan Analisa
Semantik
Tabel
Simbol
Secara umum, sebuah tabel simbol bisa memiliki elemen-
elemen tabel sebagai berikut, meskipun tidak semuanya
diperlukan pada semua kompilator :
1. No. urut identifier : menentukan nomor urut identifier
dalam tabel simbol.
2. Nama identifier : berisi nama-nama identifier ( nama,
variabel, nama tipe ).
3. Nama konstanta, nama prosedur, nama fungsi dan
sebagainya yang terdapat pada program sumber.
Nama-nama ini akan dijadikan referensi pada waktu
analisa semantik, pembuatan intermediate code serta
pembangkitan kode.
4. Tipe identifier : tipe ini dapat berupa string, integer, real
array, record maupun prosedur, function dan
sebagainya.
5. Object Time Address : address yang mengacu ke alamat
tertentu.
6. Dimensi dari identifier yang bersangkutan.
7. Nomor baris variabel dideklarasikan.
Nomor baris variabel direferensikan.
8. Field Link.
Nama suatu variabel harus selalu ada dalam tabel
simbol, karena dipergunakan untuk mengidentifikasikan
variabel tertentu untuk analisa semantik dan
pembangkitan kode.
Untuk memungkinkan akses yang cepat, biasanya
ditentukan panjang maksimum variabel.
12.2. Implementasi Tabel Simbol
Beberpa jenis Tabel Simbol :
1. Tabel identifier : berfungsi menampung semua identifier
yang terdapat di dalam program.
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 yang bernilai real.
5. Tabel string : menyimpan informasi string.
6. Tabel Display : mencatat blok yang aktif.
12.2.1. Tabel identifier
Tabel identifier memiliki field :
1. No. urut identifier dalam tabel.
2. Nama identifier.
3. Jenis/ objektif dari identifier : prosedur, fungsi, tipe,
variabel, konstanta.
4. Tipe dari identifier yang bersangkutan : integer,
karakter, boolean, array, record, file , no type.
5. Level : kedalaman identifier tertentu ( depth of block )
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.
Untuk identifier yang butuh tempat penyimpanan
dicatat pula :
• Alamat relatif/ address dari identifier untuk implementasi.
• Informasi referensi identifier tertentu ke dalam tabel
identifier lain yang digunakan untuk mencatat.
• Informasi-informasi yang diperlukan yang
menerangkannya.
• Link : menghubungkan identifier ke identifier lainnya atau
yang dideklarasikan pada level yang sama.
• Normal : diperlukan pada pemanggilan parameter, untuk
membedakan parameter by value dan reference (berupa
suatu variabel Boolean ).
Contoh kasus : terdapat sebuah listing program berikut ini :
Program A ;
Var B ; integer ;
Procedure X ( z : char ) ;
Var C : integer ;
Begin
………….
Tabel identifier akan mencatat semua identifier :
1. A
2. B
3. X
4. Z
5. C
Contoh implementasi tabel identifier :
Tabel 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 = ( konstan, variabel, procedure, fungsi )
Types = ( notipe, int, reals, booleans, chars,
arrays, record )
12.2.2. Tabel Array
tabel array digunakan untuk menyimpan informasi suatu
identifier yang bertipe array. Tabel array memiliki field :
• No. urut suatu array dalam tabel.
• Tipe dari indeks array yang bersangkutan.
• Tipe elemen array.
• Referensi dari elemen array.
• Indeks batas bawah array.
• Indeks batas atas array.
• Jumlah elemen array.
• Ukuran total array ( total size = atas – bawah + 1 ) X
elemen size ).
• Elemen size ( ukuran tiap elemen ).
Tabel array diacu dengan field referensi pada tabel
identifier.
Contoh implementasi tabel array :
tabarray : array [ 1…tabmax ] of record
Indekstype, elementype : types ;
elementref, low, high, elemensize, tabsize, : integer
end;
12.2.3. tabel Blok
Tabel blok digunakan untuk menyimpan informasi-
informasi blok-blok yang ada pada tabel utama. Dengan
berdasarkan pada tabel ini, dapat diketahui batas-batas
suatu blok pada tabel utama ( tabel identifier ).
Tabel Blok memiliki field :
• No. urut blok.
• Batas awal blok.
• Batas akhir blok.
• Ukuran parameter/ parameter size.
• Last variabel.
• Last parameter.
Contoh implementasi tabel blok.
Tabblok : array [ 1…..tabmax ] of record
Lastvar, lastpar, parsize, varsize : integer ;
end;
Dari contoh listing program berikut :
Program A ;
Var B : integer ;
Procedure X ( Z : char ) ;
Var C : integer
Begin
………
Akan diperoleh untuk blok program A ;
Last variabel = 2
Variabel size = 2 ( dianggap integer butuh 2 byte )
Last parameter = 0 ( tanpa parameter )
Parameter size = 0
Untuk blok procedure X :
Last variabel = 4
Variabel size = 2
Last parameter = 3
Parameter size = 1 ( dianggap char butuh satu byte ).
12.2.4. Tabel Real
Tabel real ini digunakan untuk menyimpan nilai dari
suatu identifier yang bertipe real. Elemen-elemen dari
tabel ini adalah sebagai berikut :
• No. urut elemen.
• Nilai real suatu variabel yang mengacu ke indeks tabel.
Contoh implementasi tabel real :
Tabreal : array [ 1….tabmax ] of real
Pemikirannya disini setiap tipe yang dimiliki oleh
suatu bahasa akan memiliki tabelnya sendiri.
12.2.5. Tabel String
Tabel ini digunakan untuk menyimpan informasi
string yang terdapat pada program sumber.
Elemen-elemen yang terdapat dalam tabel ini
adalah :
• No. urut elemen.
• Karakter-karakter yang merupakan konstanta.
Contoh implementasi tabel string :
Tabstring : array [ 1…..tabmax ] of string
12.2.6. Tabel Display
Tabel ini menyimpan informasi mengenai blok-blok
yang lagi aktif. Elemen-elemen yang terdapat di
dalam tabel ini adalah :
• No. urut tabel.
• Blok yang aktif
Pengisian tabel display dilakukan dengan
konsep stack.
Urutan pengaksesan : tabel display – tabel blok-
tabel simbol,
Contoh implementasi tabel display :
tabdisplay : array [ 1….tabmax ] of integer
12.3. Interaksi Antar Tabel
Pertama kali tabel display akan menunjuk blok
mana yang sedang aktif. Dari blok yang aktif ini,
akan diketahui identifier-identifier yang masuk
ke dalam blok tersebut. Untuk yang pertama
kalinya yang akan diacu adalah identifier yang
paling akhir, kemudian identifier sebelumnya
dan seterusnya. Informasi suatu identifier ini
mungkin akan dicari kelengkapan informasi
suatu identifier ke tabel yang sesuai ( tabel real,
tabel string, atau tabel array ).
12.4. Contoh Implementasi Tabel Simbol
Tabel-tabel dapat diimplementasikan dalam suatu
struktur data yang sesuai dengan karakteristik masing-
masing tabel. Struktur data yang digunakan :
Konstanta-konstanta
( Deklarasi konstan untuk analisa semantik )
nkw = 27 ; { no, of key word }
alng = 10 ; { no, of significant chars identifiers }
llng = 200 ; { input line length }
emax = 38 ; { maxx exponent of real number }
emin = - 38 ; { min exponent }
kmax = 5 ; { max no of significant digits }
tmax = 100 ; { size of table }
bmax = 20 ; { size of block table }
amax = 30 ; { size of array table }
c2max = 20 ; { size of real constant table }
csmax = 30 ; { max no. of cases }
Imax = 7 ; { maximum level }
smax = 600 ; { size of string table }
ermax = 58 ; { max error no. }
xmax = maxint ; { 2 ** 15 – 1 }
nmax = 16383 ; { 2 ** 14 – 1 }
lineleng = 136 ; { output line length }
linelimit = 200 ;
Stacksize = 1500 ;
DAFTAR PUSTAKA
• Alfred V. Aho & Jeffrey D. Ullman, Principle of Compiler
Design, Addison-Wesley, 1984
• Alfred V. Aho & Jeffrey D. Ullman, Compiler Principles
Technique and Tools, Addison-Wesley, 1988.
• David Gries, Compiler Construction For Digital
Computer, Cornell University, John Wiley & Sons, Inc,
1971
• Jean Paul Tremblay & Paul G. Sorenson, Compiler
Writing, Mc Graw Hill, 1985
• John E. Hopfcroft & Jeffrey D. Ullman, Introduction To
Automata Theory, Language and Computation, Addition-
Wesley, 1979
• Firrar Utdirartatmo, Teknik Kompilasi, J & J Learning,
Yogyakarta, 2001
• Sumantri Slamet & Heru Suhartanto, Teknik Kompilasi,
PAU, Universitas Indonesia, 1992
• Stephen K. O’Brien & Steven Nameroff, Turbo Pascal 7
The Complete Reference, Mc Graw-Hill, 1993

Teknik kompilasi

  • 1.
    MODUL - 01 PENGENALANCOMPILER 1.1. Terminologi Bahasa Pemrograman a. Bahasa Mesin. b. Bentuk Simbolik. c. Bahasa Tingkat Tinggi ( High Level Language ). d. Bahasa Yang Problem Oriented. 1.2. Translator Adalah penerjemah yang melakukan perubahan Source Code/ Source Program ke dalam target Code/ objek code/ objek program. Source code ditulis dalam bahasa sumber, sedangkan objek code dapat berupa bahasa pemrograman lain atau bahasa mesin atau bahasa komputer
  • 2.
    a. Assembler :Source code adalah bahasa Assembly, objek code adalah bahasa mesin Contohnya Turbo Assembler dan Macro Assembler Gambar 1 : Sistem Assembler Objek Code file.EXE / .Com Assembler Source Code berupa file ASM
  • 3.
    b. Compiler (Kompilator ) Source code adalah bahasa tingkat tinggi, objek code adalah bahasa mesin atau bahasa assembly. Source code dan data diproses pada saat yang berbeda. Contoh : Bahasa Pascal Gambar 2 : Sistem Proses Kompilasi Compile Time adalah saat perubahan source code ke objek code. Run Time adalah saat eksekusi objek code Data Objek CodeSource Code HasilCompiler Eksekusi Komputer
  • 4.
    c. Interpreter :Interpreter tidak membangkitkan objek code. Hasil tranlasi hanya dalam bentuk internal. Contoh : Basic A / GW Basic, LISP, SMALLTALK Source code dan data diproses pada saat yang sama. Run Time Gambar 3 : Sistem Proses Interpretasi Data Source Code HasilInterpreter
  • 5.
    1.3. Tahapan-Tahapan DanFase-fase Dalam Teknik Kompilasi Tahapan dalam teknik kompilasi digambarkan dalam bentuk Structure Chart berikut ini, yang menggambarkan proses-proses yang terjadi dari mulai source program sampai dengan objek code, dapat dilihat pada gambar 4. sedangkan fase-fase dalam teknik kompilasi adalah operasi logis/ kongkrit yang mengambil input satu persatu dari source program dan memproduksi output representasi lainnya. Ada 2 fase kompilasi, yaitu : 1. Fase Analisis : Leksikal, Sintaks dan Semantik Analisis 2. Fase Sintesis : Intermediate Code, Code Optimization dan Code Generation.
  • 6.
    Gambar 4 :Tahapan-Tahapan Dalam Kompilasi Source Program Lexical Analysis Tabel Simbol Syntax Analysis Semantic Analysis Target Program Intermediate Code Generation Code Optimization Code Generation Error Handling
  • 7.
    X : =a + b * 60 Operasi pemberian nilai dari suatu variabel dapat diuraikan sebagai berikut : X : = a + b * 60 Position : = Initial + Rate * 60 id1 : = id2 + id3 * 60 id1 : = id2 + id3 * 60 id1 : = id2 + id3 * 60.00 Lexical Analysis Syntax Analysis Semantic Analysis
  • 8.
    Temp 1 := Int to Real ( 60 ) Temp 2 : = Id3 * Temp 1 Temp 3 : = Id2 + Temp 2 Id1 : = Temp 3 MoveF Id3, R2 MulF 60.00, R2 MoveF Id2, R1 AddF R2, R1 MoveF R1, Id1 Gambar 6 : Sistem Pemrosesan Suatu Bahasa Intermediate Code Generation Code Optimizer Code Generator Target Program
  • 9.
    1.5. Model Kompilator Gambar7 : Model Kompilator Lexical Analyzer (Scanner) Tabel Simbol Syntax Analyzer (Parser) Semantic Analyzer Intermediate Code Generator Code Generator Code Optimizer Source Code Inter mediate Code Objek Code
  • 10.
    1.6. Mutu Kompilator a.Kecepatan dan waktu kompilasi. b. Mutu Program Objek. c. Integrated Environment. Gambar 8 : Pembuatan Kompilator Dengan Menggunakan Kompilator Pengkompilasi Source Program Kompilator A Dalam Bahasa K Kompilator Bahasa A Kompilator Pengkompilasi (K)
  • 11.
    1.7. Pembuatan Kompilator a.Bahasa Mesin. b. Bahasa Assembly. c. Bahasa Tingkat Tinggi Lain Pada Mesin Yang Sama. d. Bahasa Tingkat Tinggi Yang Sama Pada Mesin Berbeda e. Bootstrap ( Diperkenalkan Oleh Niklaus Wirth ). Gambar 9 : Metode Bootstrap P2 P1 P0
  • 12.
    Latihan-Latihan Modul -01 1. Mengapa kita memerlukan bahasa pemrograman ?. 2. Berikan penjelasan dari istilah-istilah berikut ini : a. translator b. kompilator c. assembler d. interpreter 3. Dari ekspresi matematik berikut ini, uraikan sistem pemrosesan suatu bahasa dan bentuk intermediate code nya : a. X := ( a – b ) + c * d / e b. Y := a / b * ( c + d ) ↑ e – 100 c. Z := a – ( b / c ) ↑ d * ( e + f )
  • 13.
    Modul – 02 SOURCEPROGRAM/ BAHASA PEMROGRAMAN 2.1. Perancangan Bahasa Program. Gagasan perancangan bahasa program dapat berasal dari bahasa alami/ natural language, matematika dan bahasa pemrograman yang sudah ada. Perancangan bahasa program mempunyai tujuan untuk : a. Komunikasi dengan manusia. b. Pencegahan dan deteksi kesalahan. c. Usability. d. Efektifitas pemrograman. e. Compilability. f. Kesederhanaan ( Simplicity ) dan efisien. g. Machine independent. h. Uniformity, Orthogonality, Generalisasi dan Spesialisasi.
  • 14.
    2.2. Struktur Data Empataspek dari struktur data adalah : a. Deklarasi data. b. Tipe-tipe data yang disediakan dalam bahasa program. c. Strategi alokasi storage. d. Lingkup dan variabel. Data yang banyak digunakan dalam teknik kompilasi adalah data array : a. Array berdimensi – 1 Untuk menentukan lokasi dari A ( I ) dapat digunakan rumus : Base + K ( I – low ) Dimana ; Base = Lokasi pertama dari elemen pertama K = Lokasi memori per elemen. Low = Batas bawah pada subscript I = indeks
  • 15.
    b. Array Berdimensi- 2 Array dimensi-2 dapat disusun secara row major atau couloum major. Untuk menentukan lokasi dari M ( I,J ) untuk row major dapat digunakan rumus : Untuk menentukan lokasi dari M ( I,J ) secara couloum major dapat digunakan rumus : Base + K { ( i - 1 ) r + ( j – 1 ) } Base + K { ( j – 1 ) c + ( i – 1 ) } Dimana : Base = Lokasi pertama dari elemen pertama. K = Lokasi memori per elemen. r = Banyaknya elemen dalam baris. c = Banyaknya elemen dalam kolom
  • 16.
    2.3. Operator-Operator a. OperatorAritmatik : + , - , * , / , ↑ , ** . b. Binary : Operator yang terdiri dari dua bagian, Misal : A + B c. Unary : operator yang terdiri dari satu bagian, misal : - B d. Prefix : Operand yang didahului operatornya. e. Postfix : Operand yang mendahului operatornya. a + b Unary “ – “ a + b * c ( a + b ) * c Infix a + b - a a + ( b * c ) ( a + b ) * c Prefix + ab - a + a * bc * + abc Postpix ab + a - abc * + ab + c *
  • 17.
    2.4. Struktur Kompilasi Mencakupaspek dari bahasa yang berkaitan dengan proses kompilasi, berhubungan dengan operasi pada bahasa yang dikerjakan saat kompilasi dan bagaimana kompilasi modul yang berbeda dan terpisah dari program.
  • 18.
    2.5. Skenario Perancangan Skenariodasar untuk perancangan bahasa dapat dideskripsikan dalam algoritma berikut ini : a. Temukan apa yang diinginkan dan bagaimana mempergunakannya. b. Tentukan feature yang mungkin. c. Tentukan desain keseluruhan dan integrasi feature ke dalamnya. Amati interaksi antar feature. d. Tentukan rinciannya, parsing dan pemeriksaan kesalahan. e. Tulislah definisi formal, user manual dan apapun yang dianggap berguna. f. Evaluasi rancangan seperti apa yang didiskusikan sebelumnya.
  • 19.
    g. Buatlah perubahandan mulai dari step c lagi. Jangan lanjutkan step g sampai g dilengkapi. Kurangi ukuran, ulangi step sebelumnya bila perlu. h. Implementasikan. i. Tunggu reaksi pengguna. j. Umumkan kemungkinan adanya kesalahan. k. Mulai suatu versi baru dan skenarionya.
  • 20.
    Latihan-Latihan Modul -02 1. Apa dasar penggunaan instruksi case dibandingkan dengan If then else ? Berikan suatu contoh pengubahan instruksi case ke bentuk if then else. 2. Konstruksikan sebuah perulangan for pada Pascal atau Bahasa C ++ dengan instruksi : a. Repeat – until b. While do 3. Diketahui array dimensi – 2 , M ( 5,4 ) . a. Pada elemen keberapa lokasi M ( 4,3 ) untuk row dan couloum mayor. b. Jika diketahui Base = 450 dan K = 4, Tentukan lokasi M ( 3,4 ) dan M ( 5,3 ) untuk row dan couloum mayor. 4. Uraikan bentuk Postfix dan prefix dari ekspresi berikut ini : a. A * ( B + C ) / D c. (( A / B ) ↑ C ) – D * E b. ( A – B ) * C ↑ D + E d. A / ( B – C ) + D * - E ↑ F
  • 21.
    MODUL – 03 3.1KONSEP DAN NOTASI BAHASA Bahasa Mesin Otomata Batasan Aturan Produksi Reguler/ Tipe-3 Finite State Automata meliputi Deterministic Finite Automata ( DFA ) Dan Non Deterministic Finite Automata ( NFA ) α adalah sebuah simbol variabel. β maksimal memiliki sebuah simbol variabel yang bila ada terletak pd posisi paling kanan Bebas Konteks / Context Free / Tipe-2 Push Down Automata (PDA) α berupa sebuah simbol variabel Context Sensitive / Tipe-1 Linier Bounded Automata │ α │ ≤ │ β │ Unrestricted / Phase Structure / Natural language / Tipe-0 Mesin Turing Tidak ada batasan
  • 22.
    3.2. Diagram Keadaan( State Transition Diagram ) Diagram keadaan digunakan untuk mendapatkan token (Token adalah simbol terminal pada teori bahasa), yaitu melakukan analisis leksikal terhadap program sumber. Misalkan suatu bahasa memiliki simbol terminal / token berikut : ( T_PLUS, T_Min, T_ID, T_INT ). Token T_ID (Identifier) dapat berupa nama atau keyword yang sudah didefinisikan oleh suatu bahasa, misal terdapat statement : Var JUMLAH : INTEGER maka Var dan INTEGER adalah Keyword. Jumlah adalah sebuah nama yang dideklarasikan sendiri oleh programmer.
  • 23.
    Gambar 10 :Diagram Keadaan Untuk Bahasa Diatas Blank Huruf / Start Huruf Digit Digit + _ Digit S t_Id t_Int t_Min t_Plus
  • 24.
    3.3. Notasi BNF Aturanproduksi dapat dinyatakan dalam notasi BNF (Back us Naur Form / Back us Norm Form ). Notasi BNF telah banyak dipakai untuk melakukan definisi formal bahasa program. Beberapa simbol yang dipakai dalam notasi BNF : ꞉ ꞉ = identik dengan simbol pada aturan produksi I Idem dengan simbol │ pada aturan produksi < > Mengapit simbol variabel/ non terminal { } Pengulangan nol sampai n kali 3.4. Diagram Sintaks Diagram sintaks merupakan alat bantu dalam pembentukan parser/ analisis sintaksis. Notasi yang terdapat dalam diagram sintaks :
  • 25.
    1. Empat persegipanjang melambangkan simbol variabel / non terminal. 2. Bulatan melambangkan simbol terminal Misal terdapat aturan produksi : T F * T │ F / T │T Diagram sintaksnya dapat dilihat pada gambar 11 berikut ini : T F * /
  • 26.
    Misalkan Notasi BNFuntuk Block : < Block > :: = T_Begin < Statement> { T_Semicol < Statement > } T_end Gambar 12 : Diagram Sintaks Untuk Notasi BNF Begin ; EndStatement
  • 27.
    Latihan-Latihan Modul -03 1. Buatlah diagram keadaan/ state untuk sebuah bahasa yang memiliki kumpulan token-token berikut : Buatlah diagram sintaks untuk setiap notasi BNF berikut : <Simple_Exp> ::= <Factor> { <Arit_Op> <Factor> } ! <Sign> <factor> { <Arit_Op> <Factor> } <Sign> ::= + ! – <Arit_Op> ::= + ! - ! * ! / <Factor> ::= Integer ! Identifier + - / * ** < <= > >= = <> Integer Id
  • 28.
    2. Jelaskan kegunaanhal-hal berikut ini dalam pengembangan suatu kompilator : a. Tata bahasa bebas konteks b. Finite State Automata c. Diagram Sintaks d. Notasi BNF
  • 29.
    MODUL – 04 ANALISISLEKSIKAL 4.1. Peranan Analisis Leksikal a. Analisis leksikal dapat merupakan suatu pass yang terpisah dari analisis sintaks, yaitu dengan menempat kan outputnya pada suatu fail intermediate dari mana parser ( pengurai ) dapat mengambil sebagai inputnya. b. Analisis leksikal bertugas sebagai scanner yaitu mengidentifikasikan semua besaran yang membangun suatu bahasa pada suatu program sumber. Tugas scanner antara lain adalah sebagai berikut : 1. Melakukan pembacaan kode sumber secara karakter demi karakter. 2. Mengenali besaran leksik. 3. Mentransformasikan menjadi sebuah token dan menentukan jenis tokennya.
  • 30.
    4. Mengirimkan token. 5.Membuang/ mengabaikan blank dan komentar dalam program. 6. Menangani kesalahan. 7. Menangani tabel simbol. 4.2. Pendekatan Sederhana Desain Leksikal Analyzer Salah satu cara untuk memulai desain satu program adalah dengan menjelaskan sifat-sifat program tersebut dengan satu flowchart. Pendekatan ini berguna bila program tersebut adalah suatu lexical analyzer, karena tindakan selanjutnya yang akan diambil sangat tergantung pada karakter yang baru saja diperoleh. Satu jenis flowchart khusus bagi lexical analyzer disebut State Diagram ( Diagram Transisi ). Digambarkan sebagai lingkaran yang disebut State ( keadaan ). Keadaan ini dihubungkan dengan anak panah/ aliran.
  • 31.
    Implementasi Diagram Transisi Contoh: Perhatikan daftar token berikut ini : Token Kode Harga Begin 1 - End 2 - If 3 - Then 4 - Else 5 - Identifier 6 Pointer ke Tabel Simbol Konstanta 7 Pointer ke Tabel Simbol < 8 1 < = 8 2 = 8 3 <> 8 4 > 8 5 > = 8 6
  • 32.
    Gambar 13 :Diagram Transisi dari Tabel Diatas Keyword Blanck/ Return Start B E G I N Brs baru (1,..) E N D Blanck/ brs baru Return ( 2,..) L S E Blanck/ brs baru Return ( 3,..) I F Blanck/ brs baru Return ( 4,..) Blanck/ T H E N brs baru Return ( 5,..) q1 q2 q7 q8 q13 q0 q9 q18 q16 q21 q17 q3 q15 q6 q12q11 q4 q5 q10 q14 q20q19 q22
  • 33.
    Gambar 13 :Lanjutan Gambar Diagram Transisi Identifier Huruf/ Angka Return Start Huruf (6, install ( )) Bukan huruf/ angka Konstanta Angka Angka Return Bukan angka (7,install ( )) Relational Operator Start < Bukan = atau > Return ( 8,1 ) = Return ( 8,2 ) = > Return ( 8,4 ) Return ( 8,3 ) > Bukan = Return ( 8,5 ) = Return ( 8,6 ) q26 q30 q23 q27 q35 q32 q33 q24 q34 q29 q25 q28 q31 q36 q37
  • 34.
    4.3. Reguler Expression/Ekspresi Beraturan ( E.B ) Sebuah bahasa dinyatakan reguler jika terdapat finite state automata yang dapat menerimanya. Bahasa- bahasa yang dapat diterima oleh suatu FSA dapat dinyatakan secara sederhana dengan ekspresi reguler / ekspresi beraturan (EB). EB memungkinkan menspesifikasikan atau mendefinisikan bahasa-bahasa, memberikan suatu pola ( pattern ) atau template untuk untai / string dari suatu bahasa. Untai yang menyusun suatu bahasa reguler akan cocok ( match ) dengan pola bahasa itu. Penerapan EB yang nampak, misalnya pencarian (searching ) untai karakter pada suatu file, biasanya fasilitas ini ada pada text editor. Dalam kasus-kasus ini dapat dilakukan penerapan FSA pada untai-untai yang terdapat dalam file tersebut.
  • 35.
    Contoh Ekspresi Beraturan( E.B ) Gambar 14 : FSA menerima bilangan Integer tak bertanda 0,1,2,…..,9 Start 0,1,2,3,…….,9 Selain 0,1,2,…,9 selain 0,1,2,..,9 Dalam E.B. dinyatakan dengan : ( digit ) ( digit ) * q0 q2 q1q1
  • 36.
    Gambar 15 :FSA menerima Identifier Dalam E.B. dinyatakan dengan : ( Huruf ) ( Huruf │Angka) * Start Huruf Huruf/ angka q0 q1
  • 37.
    Notasi-Notasi Ekspresi Beraturan( E.B ) 1. ( * ) Yaitu karakter asterisk, bisa tidak muncul, dapat pula muncul berhingga kali ( 0 – n ) kali. 2. ( + ) pada posisi supercript ( diatas ) berarti minimal muncul 1 kali ( 1 – n ) kali. 3. + atau U , union , gabungan, garis tegak ( │ ) “ atau “. 4. . ( titik ) berarti konkatenasi, biasanya dapat dihilangkan. Misal : a.b = ab Contoh-contoh E.B dan string yang dibangkitkan : 1. E.B : ab*cc . String yang dibangkitkan ? 2. E.B : 010* . String yang dibangkitkan ? 3. E.B : a*d ; a+d . String yang dibangkitkan ? 4. E.B : a* U b* ; ( a U b ) ; ( a U b ) * ; ( 0 │1 ) + ; 5. ( a │b ) *String yang dibangkitkan ?
  • 38.
    Recognizer Bagian dari penganalisaanleksik yang berfungsi mengidentifikasikan suatu token dari suatu input. Apakah suatu input string X merupakan sentence dari suatu language L. Diagram transisi yang melakukan konversi (perubahan) dari suatu ekspresi beraturan menjadi suatu recognizer disebut dengan otomata ( automata ) berhingga. Ada 2 jenis otomata, yaitu : 1. Deterministic Finite Automata ( DFA ). 2. Non Deterministic Finite Automata ( NFA ).
  • 39.
    Latihan-Latihan Modul -04 1. Jelaskan istilah-istilah berikut ini : a. Identifier b. Keyword c. Delimiter 2. Buatlah prosedur scan sederhana yang mampu membaca bilangan bulat dan identifier. 3. Gambarkanlah diagram transisi untuk token- token yang ada dalam prosedur tersebut.
  • 40.
    MODUL – 05 FINITESTATE AUTOMATA ( FSA ) 5.1. Deterministic Finite Automata ( DFA ). DFA dari suatu state adalah tepat satu state berikutnya untuk setiap simbol masukan yang diterima. DFA didefinisikan sebagai 5-tuple M = (Q, ∑, δ, q0, F ). Fungsi δ tak hanya bekerja pada satu huruf saja, dapat pula pada suatu kata δ* : Q X ∑*  Q Contoh : δ* ( q , ε ) = q δ* ( q , wa ) = δ ( δ* ( q , w ), a )) δ* ( q , a ) = δ* ( q , εa ) = δ ( δ* ( q , ε ), a )) = δ ( q , a )
  • 41.
    Definisi 1 : DalamDiagraph suatu automaton M = (Q, ∑, δ, q0, F ) untuk suatu kata w di ∑*, lintasan vertex qi ke vertex qj, sehingga rangkaian-rangkaian dari label-label dari edge yang dilaluinya membentuk kata w disebut lintasan w dari qi ke qj . Suatu kata w termasuk di ∑* dikatakan diterima ( accepted ) oleh automaton M jika lintasan w dari suatu state awal q0 dapat mencapai state akhir di F. Himpunan kata yang diterima oleh automaton M disebut bahasa yang diterima oleh M dan dinyatakan dengan L(M). Catatan : kata-kata kosong ε diterima oleh M jika q0 juga merupakan F. Contoh : Misal ∑ = { a,b } ; M = (Q, ∑, δ, q0, F ) dimana Q = { q0 } ; F = Ø
  • 42.
    Fungsi transisi δdinyatakan dengan tabel sebagai berikut : δ ( q0 , a ) = q0 ; δ ( q0 , b ) = q0 Diagram Graph atau diagram transisinya : Start a  L ( M ) = Ø , mengapa ??? b Misal M = (Q, ∑, δ, q0, F ) ; ∑ = { a,b } ; Q = { q0 } ; F = {q0} Start a  L ( M ) = ∑* b q0 q0 δ a b q0 q0 q0
  • 43.
    Diketahui Automaton BerhinggaM = (Q, ∑, δ, q0, F ) Q = { q0, q1, q2 } ; S = q0 ; ∑ = { a,b } ; F = { q2 } 1. Persamaan transisinya adalah sebagai berikut : δ ( q0 , a ) = δ ( q1 , a ) = δ ( q2 , a ) = δ ( q0 , b ) = δ ( q1 , b ) = δ ( q2 , b ) = 2. Tabel Transisinya : Suatu string x dinyatakan diterima bila δ = ( S , x ) berada pada state akhir. Secara formal dikatakan, bila M adalah sebuah FSA menerima bahasa yang disebut L (M). “ L (M) = { x │δ = ( S , x ) di dalam F } “ Misal, kita inputkan string “ abb “ pada contoh diatas, maka δ = ( q0 , abb ) = δ ( q0 , bb ) = δ ( q1 , b ) ; δ = q2 , karena q2 termasuk state akhir , maka “ abb “ berada dalam L(M) = U { Si ; qi ϵ F }.
  • 44.
    Contoh Lain :Coba inputkan string “ baba “ Pada DFA dari setiap state selalu tepat ada satu state berikutnya untuk setiap simbol input yang ada. Dari tabel (F ={q3} dan diagram transisi berikut ini, lengkapi FSA. 0 Start 1 0 1 1 0 q1q0 q2 δ a b q0 q1 q2 q1 q3 q2 q2 q1 q3 q3 q3 q3
  • 45.
    Latihan Soal-Soal DFA: 1. Diketahui Fungsi transisi dari DFA sebagai berikut : dengan ; F = { q0, q1, q2 }, Lengkapi FSA nya !! 2. Diketahui Bahasa L ( M ) : ( a │b ) + ( aa │bb ) dengan final statenya berada di F = { q1, q3 }, Lengkapi FSA Nya. δ a a q0 q0 q1 q1 q0 q2 q2 q0 q3 q3 q3 q3
  • 46.
    5.2. Non DeterministicFinite Automata ( NFA ) Suatu Automaton berhingga tak tentu ( Non Deterministic Finite Automata / NFA ) adalah suatu 5-tuple yang terdiri dari M = (Q, ∑, δ, q0, F ) , dimana δ : Q X ∑  2 Q 2 Q menyatakan power set dari Q atau himpunan semua sub set dari Q. Biasanya fungsi transisi δ tidak hanya bekerja pada sebuah huruf, tetapi juga bekerja pada sebuah kata. δ* : Q X ∑ *  2 Q δ* ( q,w ) adalah suatu state di Q yang dicapai oleh suatu state q setelah mendapat input kata w, fungsi δ* didefiniskan sebagai : a. δ* ( q,w ) = { q } b. δ*(q,wa) = { p : p di δ(r,a ) untuk suatu state r di δ* (q,w) c. δ* (p,w) = U {δ*( q,w ) : q di p } untuk setiap p subset Q
  • 47.
    Definisi 2 : M= (Q, ∑, δ, q0, F ) adalah NFA , maka bahasa yang diterima oleh M yaitu L (M) menyatakan himpunan { w : δ ( q0,w ) mengandung suatu state akhir di F }. Contoh : Misalkan M = (Q, ∑, δ, q0, F ) ; ∑ = { a,b } dimana F = { q2 , q4 } dan Q = { q0, q1, q2, q3, q4 } dan tabel/ fungsi transisinya sebagai berikut : δ a b q0 { q0 , q1 } { q0 , q3 } q1 Ø q2 q2 q2 q2 q3 q4 Ø q4 q4 q4
  • 48.
    Bila w =abaab , maka δ ( q0 ,w ) = δ ( q0 ,a ) = { q0, q3 } δ ( q0 ,ab ) = δ ( δ ( q0 ,a ), b ) = δ ({ q0 ,q3 }, b ) = δ ({ q0 }, b ) U δ ({ q3 }, b ) = { q0, q1 } U Ø = { q0, q1 } δ ( q0 ,aba ) = δ ( δ ( q0 ,ab ), a ) = δ ({ q0 ,q1 }, a ) = δ ({ q0 }, a ) U δ ({ q1 }, a ) = { q0, q3 } U Ø = { q0, q3 } δ ( q0 ,abaa ) = δ ( δ ( q0 ,aba ), a ) = δ ({ q0 ,q3 }, a ) = δ ({ q0 }, a ) U δ ({ q3 }, a ) = { q0, q3 } U { q4 } = { q0, q3 , q4 } δ ( q0 ,abaab ) = δ ( δ ( q0 ,abaa ), b ) = δ ({ q0 ,q3 , q4 }, b ) = δ ({ q0 }, b ) U δ ({ q3 }, b ) U δ ({ q4 }, b ) = { q0 ,q3 , q4 }
  • 49.
    5.3. NFA denganε move Start ε ε a b ε b ε = empty ( transisi ε ), diperbolehkan merubah state tanpa membaca input/ tidak tergantung atas suatu input Contoh : Dari q0 tanpa membaca input pindah ke q1 Dari q1 tanpa membaca input pindah ke q2 Dari q4 tanpa membaca input pindah ke q1 Memudahkan untuk mengkombinasikan FSA q0 q3 q4 q1 q2
  • 50.
    5.4. ε –Closure untuk NFA dengan ε - move ε – closure adalah himpunan state-state yang dapat dicapai dari suatu state tanpa membaca input. Misal : ε – closure ( q0 ) = himpunan state yang dapat dicapai dari state q0 tanpa baca input Dari gambar diatas ; ε – closure ( q0 ) = { q0, q1, q2 } ε – closure ( q0 ) = { q1, q2 } ε – closure ( q0 ) = { q2 } ε – closure ( q0 ) = { q3 } ε – closure ( q0 ) = { q1, q2, q4 } ε – closure ( q0 ) = { q0, q1, q3 } Contoh lainnya ;
  • 51.
    “ Pada stateyang memiliki transisi – ε, maka ε – closure adalah state itu sendiri “. Start ε a ε b ε ε – closure ( q1 ) = { q1, q3 } ε – closure ( q2 ) = { q2, q4 } ε – closure ( q3 ) = { q3 } ε – closure ( q4 ) = { q4 } q0 q3 q1 q2 q4
  • 52.
    5.5. Ekivalensi NFAdengan ε–move ke NFA tanpa ε–move. a Start ε b Gambar a : NFA ε – move a a Start b b Gambar b : NFA tanpa ε – move
  • 53.
    Untuk gambar yangkompleks diperlukan tahapan-tahapan sebagai berikut : a. Buat tabel transisi NFA ε – move. b. Tentukan ε – closure untuk setiap state. c. Carilah setiap fungsi transisi hasil perubahan dari NFA ε–move ke NFA tanpa ε – move δ ‘ ( sebut δ ‘ ), dimana δ ‘ didapat dengan rumus : δ ‘( state,input ) = ε–closure ( δ (ε–closure(state,input)) . d. Dari hasil c, baut tabel transisi dan diagram transisi dari NFA tanpa ε – move yang ekivalen dengan NFA ε-move tersebut. e. Jangan lupa menentukan state-state akhir semula ditambah dengan state-state yang ε – closure nya menuju ke salah satu state akhir semula atau F’ = F U { q │ (ε – closure ( q ) ∩ F ≠ Ø }
  • 54.
    Misal ; bilasemula F = { q0,q3 }, ε – closure )q1) = { q0,q2 } maka F’ = { q0, q1, q3 } Tabel transisi dari NFA ε – move ε – closure untuk setiap state ε – closure ( q0 ) = { q0,q1 } ε – closure ( q1 ) = { q1 } ε – closure ( q2 ) = { q2 } ε – closure ( q3 ) = { q3 } δ a b q0 Ø Ø q1 q1 q3 q2 Ø Ø q3 Ø Ø
  • 55.
    Kemudian dicari δ’dengan memanfaatkan tabel transisi dan ε – closure yang diperoleh sebagai berikut : δ’ ( q0,a ) = ε – closure ( δ (ε – closure ( q0,a )) = ε – closure ( δ ( { q0, q1 },a )) = ε – closure (q2) = { q2 } δ’ ( q0,b ) = ε – closure ( δ (ε – closure ( q0,b )) = ε – closure ( δ ( { q0, q1 },b )) = ε –closure (q3) = { q3 } δ’ ( q1, a ) = ε – closure ( δ (ε – closure ( q1,a )) = ε – closure ( δ ( { q1 },a )) = ε –closure ( q2 ) = { q2 } δ’ ( q1,b ) = ε – closure ( δ (ε – closure ( q1,b )) = ε – closure ( δ ( { q1 },b )) = ε –closure ( q3 ) = { q3 } δ’ ( q2,a ) = ε – closure ( δ (ε – closure ( q2,a )) = ε – closure ( δ ( { q2 },a )) = ε –closure ( Ø ) = { Ø }
  • 56.
    δ’ ( q2,b) = ε – closure ( δ (ε – closure ( q2,b )) = ε – closure ( δ ( { q2 },b )) = ε–closure ( Ø ) = { Ø } δ’ ( q3,a ) = ε – closure ( δ (ε – closure ( q3,a )) = ε – closure ( δ ( { q3 },a )) = ε –closure ( Ø ) = { Ø } δ’ ( q3,b ) = ε – closure ( δ (ε – closure ( q3,b )) = ε – closure ( δ ( { q3 },b )) = ε –closure ( Ø ) = { Ø }
  • 57.
    Tabel Transisi NFAtanpa ε–move dengan F = { q3 } δ a b q0 q2 q3 q1 q2 q3 q2 Ø Ø q3 Ø Ø
  • 58.
    Latihan-Latihan Modul –04 dan 05 Dari Berbagai bahasa tersebut di bawah ini, lengkapi Finite State Automata ( FSA ), 6 atau 7 bagian !!. 1. L ( M ) : ( 0 │1 )+ 1 ( 10 │01 ) 0 ( 0 │1 )* 2. L ( M ) : ( aa│bb ) a ( a │b )* 3. L ( M ) : ( a │b )* ( aa│bb ) a ( a │b )+
  • 59.
    MODUL – 06 SYNTAXGRAPH Aturan-aturan dalam membangun grafik berdasarkan grammar yang diberikan sebagai berikut : a. Tiap simbol non terminal A dengan production : A  α1 │ α2 │ α3 │…… │ αn digambarkan dalam suatu grafik A yang strukturnya ditentukan oleh bagian kanan dari productionnya sesuai dengan aturan-aturan berikutnya. b. Setiap adanya satu simbol terminal a dalam salah satu α1 , berkaitan dengan a ditemukannya simbol tersebut dan maju ke simbol berikutnya dari input. Keadaan ini digambarkan dalam satu cabang dimana a terletak dalam satu lingkaran.
  • 60.
    c. Setiap adanyasatu simbol non terminal B dalam satu α1 , dinyatakan dalam satu cabang dimana B terletak dalam satu segi empat ( kotak ). d. Satu production berbentuk : A  α1 │ α2 │ α3 │…… │ αn e. Satu non terminal α1 , berbentuk : α = β1, β2, ……, βn f. Satu non terminal α = { β } Contoh : Diketahui suatu grammar sebagai berikut : A  x │ ( B ) B  AC C  { + A } Gambarkan masing-masing Graph nya dan lakukan penggabungan dari masing-masing gambar !!!.
  • 61.
    Latihan-Latihan Modul –06 Gambarkan masing-masing Graph nya dan lakukan penggabungan dari gambar- gambar tersebut. 1. Diketahui suatu grammar sebagai berikut : S  a │ ( aB ) │( C ) B  AC │{ - d } C  bd A  { + a } 2. Diketahui suatu grammar sebagai berikut : K  b│ aL│{ - M } L  Noh │{ - de } M  bd N  { + a }│x
  • 62.
    MODUL – 07 ERRORHANDLING 7.1. Kesalahan Program a. Kesalahan Leksilal : contoh then ditulis ten. b. Kesalahan sintaks, misal operasi aritmatika dengan jumlah parenthesis ( kurung ) yang tidak pas. Contoh : A: = X + ( B * ( C - ). c. Kesalahan Semantik - Tipe data yang salah, contoh dalam program dideklarasikan ; var siswa : integer { var siswa bertipe integer }, tetapi selanjutnya ada instruksi yang melakukan operasi dengan tipe yang salah pada var siswa. Siswa := ‘Dadang’ { dilakukan operasi assignment dengan tipe data string }.
  • 63.
    - Var belumdidefinisikan. Contoh di dalam program ada instruksi B := B + 1 ; sementara B belum didefinisikan. 7.2. Penanganan Kesalahan a. Langkah-langkah penanganan kesalahan. b. Mendeteksi kesalahan. c. Melaporkan kesalahan. d. Tindak lanjut pemulihan/ perbaikan. e. Kompilator yang menemukan kesalahan akan melaporkan kesalahan. f. Kode kesalahan. g. Pesan kesalahan dalam bahasa natural. h. Nama atribut identifier. i. Tipe-tipe yang terkait
  • 64.
    Misal terdapat pesankesalahan : Error 54 jumlah : unknown identifier Dapat diartikan : kode kesalahan = 54 Pesan kesalahan = unknown identifier Nama identifier = jumlah 7.3. Reaksi Kompilator Pada Kesalahan a. Reaksi yang tidak dapat diterima ( tidak melaporkan error ). - Kompilator crash : berhenti atau hang - Looping : loop[ing tidak berhingga ( indefinite / onbounded loop ). - Menghasilkan program objek yang salah : Kompilator melanjutkan proses sampai dengan selesai
  • 65.
    tapi program objekyang dihasilkan salah. b. Reaksi yang benar tapi kurang dapat diterima dan kurang bermanfaat. Komputer menemukan kesalahan pertama, melaporkannya lalu berhenti ( halt ). Ini dapat muncul bila pembuat kompilator menganggap jarang terjadi error, sehingga kemampuan kompilator untuk mendeteksi dan melaporkan kesalahan hanya satu untuk setiap kompilasi. Programmer akan buang waktu untuk melakukan pengulangan kompilasi setiap kali terdapat sebuah error. c. Reaksi-reaksi yang dapat diterima. d. Reaksi yang sudah dapat dilakukan, kompilator melaporkan error dan selanjutnya melakukan : - Recovery ( pemulihan ). - Repair ( perbaikan kesalahan ).
  • 66.
    e. Reaksi yangbelum dapat dilakukan, yaitu kompilator mengoreksi kesalahan, lalu menghasilkan program objek sesuai dengan yang diinginkan pemrogram. Disini komputernya telah memiliki kecerdasan untuk mengetahui maksud pemrogram. Tingkatan respon ini belum dapat diimplementasikan pada kompilator yang ada dewasa ini. 7.4. Error Recovery Pemulihan kesalahan bertujuan mengembalikan parser ke kondisi stabil (agar dapat melanjutkan proses parsing ke posisi selanjutnya). Strateginya sebagai berikut : a. Mekanisme Ad Hoc Recovery yang dilakukan tergantung dari pembuat kompilator sendiri/ spesifik, dan tidak terikat pada suatu aturan tertentu. Cara ini dapat disebut sebagai Special purpose error recovery.
  • 67.
    b. Syntax directedrecovery. Melakukan recovery berdasarkan sintaks, misal potongan program Begin A := A + 1 B := B + 1 C := C + 1 End; Kompilator akan mengenali sebagai : Begin <statement>?<statement> ; <statement> end;? Akan diperlakukan sebagai ‘ ; ‘ c. Secondary error recovery Berguna untuk melokalisir error, caranya ;
  • 68.
    d. Panic mode Majuterus dan mengabaikan teks sampai bertemu delimeter. Misal ‘ ; ’ . Contoh pada potongan program : If a = 1 kondisi := true ; e. Unit deletion. Menghapus keseluruhan suatu unit sintaktik ( misal : <blok>, <statement> dan sebagainya ). Efeknya mirip dengan panic mode tetapi unit deletion memelihara kebenaran sintaksis dari source program dan mempermudah untuk melakukan error repairing lebih lanjut. f. Context sensitive recovery Berkaitan dengan semantik, misal terdapat variabel yang belum dideklarasikan, maka diasumsikan tipenya ber dasar kemunculannya. Misal pada potongan program terdapat instruksi : B := ‘nama’, sementara B belum dideklarasikan berdasarkan kemunculannya diasumsikan variabel B bertipe string.
  • 69.
    7.5. Error Repair Bertujuanmeodifikasi source program dari kesalahan dan membuatnya valid, sehingga memungkinkan kompilator untuk melakukan translasi program yang mana akan dialirkan ke tahapan selanjutnya pada proses kompilasi. Mekanisme error repair meliputi : a. Mekanisme Ad Hoc Tergantung dari pembuat kompilator sendiri/ spesifik. b. Syntax directed repair. Menyisipkan simbol terminal yang dianggap hilang atau membuang terminal penyebab kesalahan. Contoh : While A < 1 I := I + 1 kompilator akan menyisipkan simbol Do Begin
  • 70.
    X := X+ 1 End; End; kelebihan end, salah maka kompilator akan membuangnya c. Context sensitive repair Perbaikan dilakukan pada kesalahan : - Tipe identifier. Diatasi dengan membangkitkan identifier dummy, misal pada potongan program Var A : string ; Begin Kompilator akan memperbaiki kesalahan A := 0 ; dengan membangkitkan identifier baru End; misal B yang bertipe integer.
  • 71.
    - Tipe konstanta Diatasidengan membangkitkan konstanta baru dengan tipe yang tepat. d. Spelling repair Memperbaiki kesalahan pengetikan pada identifier, misal while A = 1 do diperbaiki menjadi while …. Contoh-contoh kesalahan yang ada dan mekanisme penanganannya bukanlah berasal dari suatu produk kompilator tertentu meskipun instruksi-intruksi yang ada dalam potongan-potongan program disini memiliki kemiripan dalam Bahasa Pascal. Tujuannya adalah untuk mempermudah pemahaman semata.
  • 72.
    MODUL – 08 ANALISASINTAKS 8.1. Context Free Grammar ( CFG ) / Tata Bahasa Bebas Konteks. Grammar didefinisikan dengan 4-tupel ( G = { V, T, P, S } Dimana : V = himpunan simbol variabel/ non terminal. T = himpunan simbol terminal. P = kumpulan aturan produksi. S = Simbol awal. Grammar mendefinisikan pula konstruksi satu bahasa program tertentu secara rekursif.
  • 73.
    Contoh : a. S1,S2, adalah statement dan E adalah ekspresi, maka “ if E then S1 else S2 “ adalah satu statement. b. S1, S2, …., Sn adalah statement-statemen, maka begin S1, S2, …, Sn end. Adalah satu statement. c. E1 dan E2 adalah ekspresi, maka “ E1 + E2 “ adalah ekspresi. Apabila digunakan penulisan dengan katagori sintaktif : a. Untuk statement ;<stmt> menyatakan himp statement. c. Untuk ekspresi :<Expr> menyatakan himp ekspresi, maka aturan penulisan diatas dapat ditulis : <stmt>  if < eksp > then < stmt > else < stmt > b. < stmt >  begin < stmt >,<stmt>,….<stmt> end. Penulisan ini tidak memberikan penjelasan yang cukup
  • 74.
    Oleh sebab itudiperlukan satu katagori sintaktif yang disebut < stmt-list>. Jadi untuk b dapat ditulis < stmt >  begin <stmt-list> list end , atau < stmt-list>  <stmt> │< stmt > ; < stmt-list> Jadi satu statemen – list adalah satu statemen yang diikuti oleh satu titik koma dan satu statemen – list Konvensi Notasi Simbol-Simbol Non Terminal • Nama-nama dengan huruf kecil seperti <eksp>, <stmt>. • Huruf kapital/ besar : A, B, C, ……, Z • Huruf S digunakan sebagai simbol start
  • 75.
    Simbol - SimbolTerminal • Huruf-huruf kecil : a,b,c,….,z • Simbol operator : +, -, * , / , ↑ dan sebagainya. • Simbol-simbol tanda baca : , ; , : ! , # , $ dan sebagainya. • Angka-angka dari 0 sampai dengan 9 • String yang diberi garis bawah : begin , id , dsb. Huruf-huruf Yunani : α , β , dan sebagainya, menyatakan set/ himpunan dari simbol grammar. 8.2. Derivasi dan Parse Tree 1. Derivasi Perhatikan Grammar berikut ini : E  E + E │E * E │E - E │( E ) │- E│id
  • 76.
    Production E E + E , dapat diartikan/ dipahami : • E menurunkan E + E • E diganti oleh E + E • E menghasilkan E + E Contoh : diketahui string : - ( id + id ) apakah merupakan suatu kalimat dari grammar : E  E + E │E * E │E - E │( E ) │- E│id E  - E  - ( E )  - (E + E)  - (id + E)  - (Id + id) Bila penurunan dimulai dari sebelah kiri disebut : Left Most Derivation Bila penurunan dimulai dari sebelah kanan disebut : Right Most Derivation
  • 77.
    2. Parse Tree MisalkanA  XYZ , maka parse tree nya dapat digambarkan sebagai berikut : A X Y Z Parse tree untuk : - ( id + id ) - ( E )  - (E + E)  - (id + E)  - (Id + id) Bagaimana dengan string : id + id * id ???. Apakah merupakan satu kalimat dari grammar tersebut diatas ?? String tersebut dapat diuraikan sebagai berikut :
  • 78.
    Versi A :Versi B : E  E + E E  E * E E  id + E E  E + E * E E  id + E * E E  id + E * E E  id + id * E E  id + id * E E  id + id * id E  id + id * id Gambar Parse tree dari kedua versi tersebut !!!. Grammar : E  E + E │E * E │E - E │( E ) │- E│id Dapat ditulis dalam bentuk yang tidak rangkap ( un ambigous ). Untuk itu diperlukan simbol-simbol non terminal baru yang disebut : Element, Primary, Factor, Expression dan Terminal, yang terdiri dari :
  • 79.
    1. < Element>  (< Expression > │id 2. < Primary >  - (< Primary > │< Element > 3. < Factor >  (< Primary > ↑ < Factor >│< Primary > 4. <Terminal>  <Term> * <Fact>│<Term>/<Fact │<Fact> 5. <Expression>  <Expr> + <Term>│< Expr > - <Term>│ <Term> Penulisan diatas terlampau panjang, maka disederhanakan menjadi : ( selanjutnya disebut sebagai “Grammar 5-Langkah”). E  E + T │E – T │T T  T * F │T / F│F F  P ↑ F │P P  - P │L L  ( E ) │id
  • 80.
    String : id+ id * id , jika diuraikan dengan menggunakan grammar 5-langkah akan mempunyai Tree yang tunggal. E  E + T E E  T+ T E  P + T E + T E  L + T E  id + T T T * F E  id + T * F E  id + F * F F F P E  id + P * F E  id + L * F P P L E  id + id * F E  id + id * P L L id E  id + id * L E  id + id * id id id
  • 81.
    Latihan Soal-Soal Modul- 08 Lakukan Derivasi Dan Gambar Parse Tree nya dari string-string berikut ini !!!. 1. id ↑ - id + id – id 2. - id * - id / id + id 3. ( id / - id ) * id / – id 4. id / ( - id ↑ id ) + id * id 5. - ( id * - id ) ↑ id ) + id / id 6. - id + (( id / - id ) * - id ) ↑ id 7. id - ( id / - id ) * ( - id ↑ id ) Dari tujuh nomor tersebut, uraikan langkah- langkahnya dalam Kegiatan Shift Reduce Parsing
  • 82.
    MODUL – 09 TEKNIKPARSING Parsing merupakan tahapan analisis sintaksis yang berguna untuk memeriksa urutan kemunculan token. Didalam mengimplementasikan sebuah metode parsing ke dalam program perlu diperhatikan tiga hal : 1. Rentang waktu eksekusi. 2. Penanganan kesalahan. 3. Penanganan kode Parser Parser untuk grammar G adalah program yang menerima string/ untai w sebagai inputnya dan menghasilkan output berupa satu parse tree untuk w, bila w merupakan kalimat dari G atau satu error message apabila w bukan merupakan satu kalimat dari G.
  • 83.
    Metode Parsing dapatdigolongkan sebagai berikut : 1. Top Down Kalau dilihat dari terminologi pohon penurunan, metode ini melakukan penelusuran dari root/ puncak menuju leaf/ daun ( simbol awal sampai dengan simbol terminal). Metode Top down sendiri meliputi : - Backtrack/ Backup : Brute Force. - No Backtrack : Recursive Descent Parser. 2. Bottom Up Metode ini melakukan penelusuran dari leaf/ daun menuju root/ puncak, disebut sebagai Metode Shift Reduce Parsing ( SRP ).
  • 84.
    9.1. Parsing DenganBrute Force Metode ini akan memilih aturan produksi mulai dari paling kiri dan melakukan semua expand non terminal pada aturan produksi sampai yang tertinggal adalah simbol terminal. Kemungkinan pertama string masukan sukses di parsing, bisa juga bila terjadi ekspansi yang salah untuk suatu simbol variabel maka akan dilakukan backtrack. Algoritma ini membangun pohon parsing yang top down, yaitu mencoba segala kemungkinan untuk setiap simbol non terminal. Contoh Suatu bahasa dengan aturan produksi : S  a Ad│aB A  b │c B  ccd │ddc
  • 85.
    Misal ingin dilakukanparsing untuk string “ accd “, tahapan yang terjadi dapat dilihat pada gambar berikut ini : 1. S 2. S 3. S a A d a A d b 4. S 5. S 6. S a A d a B a B c c c d Gambar 9.1. : Pohon penurunan dari untai “ accd “
  • 86.
    Kelemahan dari metodeBrute Force adalah : • Mencoba untuk semua aturan produksi yang ada sehingga nenjadi lambat ( rentang waktu eksekusi tidak jelas ). • Menyulitkan untuk melakukan pemulihan kesalahan. • Memerlukan banyak memori karena perlu mencatat (backup) lokasi backtrack. Contoh lainnya : Perhatikan Grammar berikut ini : S  iCtS S  iCtSeS S  a C  b Satu parse tree untuk untai w = ibtibtaea , dapat dilihat pada gambar berikut :
  • 87.
    Parse tree untukuntai w = ibtibtaea tersebut diatas adalah penurunan terkiri. S  iCtS  ibtS  ibtiCtSeS  ibtibtSeS  ibtibtaeS  ibtibtaea Satu parse tree untuk penurunan terkanan dapat pula dibangun dengan cara yang sama, dimana setiap non terminal terkanan yang diketemukan diganti dengan productionnya. S  iCtS  iCtiCtSeS  iCtiCtSea  iCtiCtaea  iCtibtaea  ibtibtaea Penurunan terkiri ekivalen dengan penurunan terkanan. Satu penurunan terkiri/ terkanan dengan mudah dapat diubah menjadi satu parse tree atau sebaliknya. Satu parse tree menjadi penurunan terkiri/ terkanan.
  • 88.
    9.2. Shift ReduceParsing ( SRP ) Shift Reduce Parsing adalah salah satu metode Bottom up dimana bila satu string ( string bagian ) cocok dengan bagian kanan satu production maka string (string bagian) itu diganti dengan bagian productionnya. Perhatikan Grammar berikut ini : S  aAcBe A  Ab │b B d dan string : w = abbcde Penyederhanaan tidak lain adalah penurunan terkanan. S  aAcBe  aAcde  aAbcde  abbcde String bagian yang digantikan dengan bagian kiri production disebut handle. Jadi Bottom up parsing dapat diartikan mencari dan menyederhanakan handle.
  • 89.
    Handle Satu handle daristring γ adalah production A  γ dan satu posisi dari γ dimana string β dapat ditemukan dan digantikan oleh A untuk menghasilkan bentuk terdahulu dalam satu penurunan terkanan dari γ , yaitu bila S  α A w  α β w Maka A β pada posisi sesudah α adalah satu handle dari α β w Contoh : diketahui Grammar : E  E + E │E * E │E - E │( E ) │- E │E ↑ E │E / E │id Penurunan terkanan : E  E + E E  E + E * E E  E + E * id3
  • 90.
    E  E+ id2 * id3 E  id1 + id2 * id3 Menghilangkan handle String : id1 + id2 * id3 ingin disederhanakan menjadi E Implementasi Stack Ada 2 macam dalam menghilangkan handle : 1. Bagaimana mencari/ menentukan handle. Handle Production id1 + id2 * id3 id1 E  id1 id1 + id2 * id3 id2 E  id2 id1 + id2 * id3 id3 E  id3 E + E * E E * E E  E * E E + E E + E E  E + E E
  • 91.
    2. Production manayang dipilih bila terdapat lebih dari satu production dengan bagian kanan yang sama. Satu stack dan satu input buffer digunakan dalam Shift Reduce Parsing ( SRP ). Kegiatan-kegiatan Shift Reduce Parsing ( SRP ) untuk menguraikan input string id1 + id2 * id3 , dapat dilihat pada uraian berikut ini :
  • 92.
    Tabel 9.2 :Kegiatan-Kegiatan Dalam SRP No. Stack Input Action 1. $ id1 + id2 * id3 $ Shift 2. $ id1 + id2 * id3 $ Reduce by E  id1 3. $ E + id2 * id3 $ Shift 4. $ E + id2 * id3 $ Shift 5. $ E + id2 * id3 $ Reduce by E  id2 6. $ E + E * id3 $ Shift 7. $ E + E * id3 $ Shift 8. $ E + E * id3 $ Reduce by E  id3 9. $ E + E * E $ Reduce by E  E * E 10. $ E + E $ Reduce by E  E + E 11. $ E $ Accept
  • 93.
    9.3. Relasi presendendan pemakaiannya Misal, diketahui untai ….. rs ….., apakah rs selalu merupakan akar dari handle/ dapatkah kedua rs berada bersama-sama dalam handle atau bagimana ?. Pandanglah 2 simbol r dan s di dalam vocabulary V dari grammar G. pada beberapa titik dari proses parsing. Salah satu r atau s atau kedua-keduanya haruslah berada dalam satu handle. Ada 3 kemungkinan : u u u …. …….. rs .. .. rs .. rs …… ... Hadle a : r  s Handle b : r ↔ s Handle c : r ← s u ..rs u ..rs u  s
  • 94.
    Contoh : DiketahuiGrammar G-9, dengan simbol Z dan produksi Z  bMb M ( L │a L  Ma ) Bahasa L (G-9) mengandung untai b(aa)b, b((aa)a)b, dsb. Ditunjukan bentuk sentensial, pohon sintaks, handle dari pohon/ relasi yang dapat diturunkan dari pohon yang bersangkutan dengan masing-masing bentuk sentensial: 1. Bentuk sentensial : bab Z Handle : a Relasi yang diberikan pohon b M b b ← a a b a
  • 95.
    2. Bentuk sentensial: b(Lb Z Handle : ( L Relasi yang diberikan pohon : b M b b ← ( ( ↔ L` ( L L  b 3. Bentuk sentensial : b(Ma)b Z Handle : Ma) Relasi yang diberikan pohon : b M b (← M M ↔ a ( L a ↔ ) )  b M a )
  • 96.
    Matrik presenden GrammarG-9, elemen B (I,J) dari matrik berisi relasi antara sepasang simbol dari suatu Grammar. Z b M L a ( ) Z b ↔ ← ← M → ↔ → ← L ← → → a → → ↔ ( → → ↔ ) → →
  • 97.
    Latihan-Latihan Modul -09 Diketahui Grammar sebagai berikut : 1. S  bPb │x │y ) P  ( M │a M  Pa ) 2. S  bNb N  ( K │a K  Na ) 3. S  bDb │c D ( L │e E  Da ) Uraikan seluruh untai yabng mungkin (minimum 5 untai), tentukan handle dan relasinya. Susun pula matriks presendennya.
  • 98.
    MODUL – 10 ANALISASEMANTIK Analisa semantik masih termasuk dalam bagian front end (bagian yang menangani analisa source program). Proses ini merupakan kelanjutan dari proses kompilasi sebelumnya. Pada tahap ini dilakukan pengecekan pada struktur akhir yang telah diperoleh dan diperiksa kesesuaiannya dengan komponen program yang ada. Pada hakekatnya, analisa semantik memanfaatkan pohon sintaks yang dihasilkan pada proses parsing. Secara teori, sebenarnya diinginkan agar proses analisa sintaks dan analisa semantik adalah dua hal yang terpisah, akan tetapi pada tingkat praktis hal tersebut sulit untuk dilakukan. Proses analisa sintaks dan analisa semantik merupakan dua proses yang erat kaitannya dan sulit sekali untuk benar-benar dipisahkan.
  • 99.
    Pengecekan yang dilakukanoleh analisis semantik adalah: 1. Memeriksa keberlakuan nama-nama meliputi pemeriksaan : a. Duplikasi Pada tahap ini dilakukan pengecekan apakah sebuah nama terjadi pendefinisian lebih dari dua kali. Pengecekan dilakukan pada bagian pengelola blok. b. Terdefinisi Melakukan pengecekan apakah sebuah nama yang yang dipakai pada tubuh program sudah terdefinisi atau belum. Pengecekan dilakukan pada semua tempat kecuali Blok
  • 100.
    2. Memeriksa Tipe Melakukanpemeriksaan terhadap kesesuaian tipe dalam statement-statement yang ada. Misalkan bila terdapat suatu operasi diperiksa tipe operan. Contohnya bila ekspresi yang mengikuti instruksi If berarti tipenya Boolean, akan diperiksa tipe identifier dan tipe ekspresi. Bila ada operasi antara dua operan maka tipe operand pertama harus bisa dioperasikan dengan operan kedua. 10.1. Notasi N-Tuple Pada Postfix setiap baris instruksi hanya terdiri dari satu tupel. Pada notasi N-Tuple setiap baris dapat terdiri dari beberapa tupel. Format umum dari notasi N-Tuple adalah : Operator ……. N – 1 ……… Operand
  • 101.
    10.1.1. Triples Notation Notasitriple memiliki format : < operator > < operand > < operand > Contoh instruksi : A := D * C + B / E Bila dibuat kode antara triple : 1. * , D , C 2. / , B , E 3. + , ( 1 ) , ( 2 ) 4. := , A , ( 3 ) Contoh lain : If X > Y then X := a – b Else X := a + b
  • 102.
    Kode antara triplenya : 1. > , X , Y 2. BZ ( Branch if Zero ),( 1 ) , ( 6 ) { bila kondisi ( 1 ) salah loncat ke no ( 6 ) } 3. - , a , b 4. := , x , ( 3 ) 5. BR, , ( 8 ) 6. + , a , b 7. := , x , ( 6 ) Kekurangan notasi triples adalah sulit pada saat melakukan optimasi, maka dikembangkan indirect triples yang memiliki dua list, yaitu list instruksi dan list eksekusi. List instruksi berisi notasi triples, sedang list eksekusi mengatur urutan eksekusinya.
  • 103.
    Misal terdapat urutanInstruksi : A := B + C * D / E dan F := C * D List instruksi 1. * , C D 2. / , ( 1 ), E 3. + , B , ( 2 ) 4. := , A , ( 3 ) 5. := , F , ( 1 ) List eksekusi 1. 1 2. 2 3. 3 4. 4 5. 1 6. 5
  • 104.
    10.1.2. Quadruples Notation Formatdata Quadruple : < Operator > < operand > < Operand > < hasil > Hasil adalah temporary variabel yang dapat ditempatkan pada memori atau register. Masalah yang ada, adalah bagaimana mengelola temporary variabel ( hasil ) seminimal mungkin. Contoh instruksi : A := D * C + B / E Bila dibuat dalam kode antara : 1. * , D , C , T1 2. / , B , E, T2 3. + , T1 , T2 , A Hasil dari tahapan analisis akan diterima oleh bagian pembangkitan kode ( Code Generator ).
  • 105.
    Disini kode antaradari program biasanya ditranslasikan ke bahasa Assembly atau bahasa mesin. Misalkan ekspresi : ( A + B ) * ( C + D ) Yang mana kode antaranya dalam bentuk quadruple : 1. + , A , B , T1 2. + , C, D , T2 3. * , T1 , T2 , T3 Dapat ditranslasikan ke dalam bahasa assembly dengan akumulator tunggal : 1. LDA A 4. LDA C 7. LDA T1 2. ADD B 5. ADD C 8. MUL T2 3. STO T1 6. STO T2 9. STO T3
  • 106.
    Keluaran dari codegenerator akan diterima oleh code optimizer. Misalkan untuk code assembly diatas dapat dioptimasi menjadi : 1. LDA A 4. LDA C 7. STO T2 2. ADD B 5. ADD C 3. STO T1 6. MUL T1 Contoh perjalanan sebuah instruksi sampai ke pembangkit kode dapat dilihat pada gambar berikut ini :
  • 107.
    Gambar 10.1 :Perjalanan Sebuah Instruksi <assign> id1 := <ekspr> id2 + id3 LDA X ADD Y Source Token-Token STO Y Program id1 := id2 + id3 X := X + Y Analisis Leksikal Analisis Sintaksis Code Generator Dan Analisa Semantik Tabel Simbol
  • 108.
    10.2. Definisi BerdasarkanSintaks Ada dua notasi yang menghubungkan aturan-aturan semantik dengan produksi-produksi ( production ) : Definisi berdasarkan sintaks merupakan definisi tingkat tinggi untuk translasi. Detail implementasinya tidak disertakan dan user tidak perlu menentukan urutan translasinya. Skema translasi : menyatakan urutan evaluasi untuk aturan semantik, sehingga sangat mungkin untuk menunjukan detail implementasinya. Gambar 10.2 : Konsep translasi berdasarkan sintaks Input String Parse Tree Ketergantungan Graph Penerimaan Evaluasi Untuk Aturan-Aturan Semantik
  • 109.
    Evaluasi berdasarkan semantikdapat membentuk kode, menyimpan informasi tabel simbol, menampilkan pesan kesalahan atau menampilkan aktifitas lainnya. Pada pembahasan analisa sintaks dikenal adanya Contex Free Grammar ( CFG ). CFG mempunyai himpunan atribut yang dipecah menjadi 2 sub himpunan, yaitu : 1. Himpunan atribut tersintesis. 2. Himpunan atribut terinheritasi. Atribut dapat mereferesentasikan apa saja sesuai dengan pilihan kita seperti : rangkaian, angka, type, lokasi memori dan sebagainya. Evaluasi aturan semantik mendefinisikan nilai atribut pada node-node dipohon urai untuk rangkaian masukannya, mencetak nilai atau mengubah variabel global.
  • 110.
    Pohon urai yangmenunjukan nilai atribut pada masing- masing node disebut pohon urai teranotasi. 10.3. Bentuk Semantik A  α aturan semantiknya : b := f ( c1, c2, ….., ck ) F adalah suatu fungsi dan salah satu dari dua hal berikut yang dipenuhi : 1. b adalah atribut tersintesis dari A dan c1, c2, ….., ck merupakan atribut kepunyaan simbol tata bahasa sebelah kanan produksi, 2. b adalah atribut terinheritasi dari satu simbol tata bahasa sebelah kanan produksi dan c1, c2, ….., ck merupakan atribut kepunyai A atau simbol tata bahasa sebelah kanan produksi. Dikatakan b tergantung pada atribut c1, c2, ….., ck . Fungsi-fungsi dalam aturan semantik akan sering ditulis sebagai ekspresi, pemanggilan prosedur atau bagian-bagian dari program
  • 111.
    Contoh Dalam sebuah programkalkulator, definisi mengaitkan atribut tersintesis bernilai integer ( disebut val ). Non terminal : E, T, F. Nilai atribut val untuk non terminal disebelah kiri, nilai val untuk non terminal disebelah kanan. Tabel 10.1 : Definisi Terdireksi Suntaks Dari Kalkulator Produksi Aturan Semantik L  En Print ( E. val ) E  E1 + T E1. val := E1. val + T. val E  T E. Val := T. val T  T1 * F T. Val := T1. val * F. val T  F T. Val := F. val F  ( E ) F. Val := E. val F  Digit F. Val := Digit. Lexval
  • 112.
    L  Enadalah suatu prosedur yang mencetak nilai ekspresi aritmatik yang dibentuk oleh E ( aturan ini dapat dianggap sebagai pendefinisian suatu atribut dummy untuk non terminal L ). Dalam definisi berdasarkan sintaks, terminal-terminal diasumsikan hanya mempunyai atribut tersintesis. Token digit mempunyai atribut tersintesis Lexval yang nilainya diasumsikan disuplay dari penganalisaan sintaks. 10.3.1. Atribut Tersintesis Suatu definisi berdasarkan sintaks yang memakai atribut tersintesis disebut definisi “ Teratribusi – S “. Suatu pohon urai untuk definisi teratribusi - S selalu dapat dianotasi. Contoh : Ekspresi : 3 * 5 + 4 Terdiri dari angka, operator + dan * dan diakhiri dengan
  • 113.
    Karakter baris barun dan mencetak nilai ekspresi itu. Program tersebut akan mencetak angka 19. Keluaran yang dicetak pada akar pohon merupakan nilai dari E.val pada anak pertama akar itu.
  • 114.
    Gambar 10.3 :Pohon Urai Teranotasi Untuk Ekspresi 3 * 5 + 4 L E.val = 19 n E.val = 15 + T. val = 4 T. val = 15 F. val = 4 T.val = 3 * F. val = 5 Digit.Lexval = 4 F. val = 3 Digit.Lexval = 5 Digit. Lexval = 3
  • 115.
    Latihan-Latihan Modul -10 Dari ekspresi matematik berikut ini dan dengan menggunakan Grammar 5 – Langkah, gambar pohon urai teranotasi. Ubah ke dalam bentuk identifier, lakukan derivasi, gambar parse tree, susun bentuk intermediate code dan notasi N- tuple nya. 1. (( 5 + 4 ) / 3 ) ↑ 5 2. 20 – 5 * ( 14 / 2 ) 3. 2 ↑ 5 * - 2 / - 4 4. - 4 * 6 / - 2 ↑ 3 + 7 5. 2 ↑ - 3 * ( - 24 / 3 ) - 6
  • 116.
    MODUL – 11 TEKNIKOPTIMASI 11.1. Dependensi Optimasi Tujuannya adalah untuk menghasilkan kode program yang berukuran lebih kecil dan lebih cepat eksekusinya. Berdasarkan ketergantungan pada mesin, optimasi dibagi menjadi : a. Machine Dependent Optimizer. Kode dioptimasi sehingga lebih efisien pada mesin tertentu. Optimasi ini memerlukan informasi mengenai feature yang ada pada mesin tujuan dan mengambil keuntungan darinya untuk menghasilkan kode yang lebih pendek atau eksekusi yang lebih cepat.
  • 117.
    b. Machine IndependentOptimizer Strategi optimasi yang bisa diaplikasikan tanpa tergantung pada mesin tujuan tempat kode yang dihasilkan akan dieksekusi nantinya. Bab ini selanjutnya akan membahas optimasi machine independent yang meliputi optimasi lokal dan optimasi global. 11.2. Optimasi Lokal Optimasi lokal adalah optimasi yang dilakukan hanya pada suatu blok dari source code, cara-caranya : 1. Folding Mengganti konstanta atau ekspresi yang bisa dievaluasi pada saat compiler time dengan nilai komputasinya. Misalkan instruksi : A := 2 + 3 + B dapat diganti menjadi A := 5 + B
  • 118.
    2. Redundant –Subexpression Elimination Sebuah ekspresi yang pernah dikomputasi, digunakan lagi hasilnya, dari pada melakukan komputasi ulang. Misalkan terdapat urutan instruksi : A : = B + C X := Y + B + C Kemunculan kedua dari B + C yang redundan bisa diatasi dengan memanfaatkan hasil komputasinya yang sudah ada pada instruksi sebelumnya. Perhatikan, hal ini dapat dilakukan dengan catatan belum ada perubahan pada variabel yang berkaitan. 3. Optimasi Dalam sebuah Iterasi - Loop unrolling : menggantikan suatu loop dengan menulis statement dalam loop beberapa kali.
  • 119.
    Hal ini didasaripemikiran, sebuah iterasi pada implementasi level rendah akan memerlukan operasi. Inisialisasi/ pemberian nilai awal pada variabel loop. Dilakukan sekali pada saat permulaan eksekusi loop. Pengetesan apakah variabel loop telah mencapai kondisi terminasi. Adjusment yaitu penambahan atau pengurangan nilai pada variabel loop dengan jumlah tertentu. Operasi yang terjadi pada tubuh perulangan (Loop Body). Contoh pada instruksi : For I := 1 to 2 Do A [ I ] := 0 ; Dapat dioptimasikan menjadi : A [ 1 ] := 0 ; A [ 2 ] := 0 ; Yang hanya memerlukan dua instruksi assignment saja.
  • 120.
    - Frequency Reduction Pemindahanstatement ke tempat yang lebih jarang dieksekusi. Cohtoh : For I := 1 to 10 Do Begin X := 5 ; A := A + 1 ; End; Dapat dioptimasi menjadi : X := 5 ; For I := 1 to 10 Do Begin A := A + 1 End;
  • 121.
    - Strength Reduction Penggantiansuatu operasi dengan jenis operasi lain yang lebih cepat dieksekusi. Misalkan pada beberapa komputer operasi perkalian memerlukan waktu lebih banyak untuk diekseskusi dari pada operasi perjumlahan maka penghematan waktu dapat dilakukan dengan mengganti operasi perkalian tertentu dengan perjumlahan. Contoh lain instruksi : A := A * 1 ; Dapat diganti dengan : Inc ( A ) ; 11.3. Optimasi Global Biasanya dilakukan dengan analisis flow, yaitu sebuah graph berarah yang menunjukan jalur yang mungkin selama eksekusi program
  • 122.
    Kegunaannya : ………………. 11.3.1.Bagi Pemrogram Menginformasikan - Unreachable / dead code : kode yang tidak akan pernah dieksekusi. - Misalnya terdapat urutan instruksi : X := 5 ; If X = 0 then A := A + 1 Instruksi A := A + 1 tidak akan pernah dieksekusi. - Unused Parameter pada Prosedur. Parameter yang tidak pernah digunakan di dalam prosedur. Contohnya : Procedure Jumlah ( a,b,c : integer ) ; var X : integer
  • 123.
    Begin X := a+ b ; End; Parameter c tidak pernah digunakan dalam prosedur. - Unused Variabel Variabel yang tidak pernah dipakai dalam program. Contohnya : Program pendek ; var a,b : integer ; begin A := 5 ; End; Variabel b tidak pernah digunakan dalam program sehingga dapat dihilangkan.
  • 124.
    Variabel yang dipakaitanpa nilai awal. Contohnya : Program awal ; Var a,b : integer ; begin A := 5 ; A := A + B ; End; Variabel B digunakan tanpa memiliki nilai awal.
  • 125.
    Latihan-Latihan Modul -11 1. Lakukan optimasi lokal yang diperlukan pada potongan program berikut dan jelaskan optimasi apa saja yang dilakukan !!. A := B + 10 * 4 ; C := B + D ; F := B + D – G ; For I := 1 to 100 Do Begin X := X + 1 ; A := A + X ; B := 7 ; End;
  • 126.
    2. Apakah kitadapat melakukan optimasi redundant sub- expression elimination pada statement berikut ? Why ? a b A := B + C ; A := B + C ; A := X + Y ; B := X + Y ; F := B + C + G + H ; F := B + C + G + H ; 3. Apakah cukup efisien kita melakukan optimasi loop unrolling untuk statement berikut : For I := 1 to 100 Do A ( I ) := “ “ 4. Penghematan apa yang dilakukan dengan menggantikan instruksi semacam X eksponensial (pangkat ) n , bila n = 2 ( X 2 ) dengan X * X
  • 127.
    MODUL – 12 TABELINFORMASI 12.1. Kegunaan Tabel Informasi Tabel informasi atau tabel simbol dibuat guna mempermudah pembuatan dan implementasi dari semantik analyzer. Ada 2 fungsi penting dalam proses translasi, yaitu : - Untuk membantu pemeriksaan kebenaran semantik dari program sumber. - Untuk membantu dan mempermudah dalam pembuatan intermediate code dan proses pembangkitan code. Identifier pertama kali ditemukan dengan mencarinya sebagai unit leksikal, jika diperoleh maka nilai indeksnya pada tabel diberikan oleh scanner. Rutin penanganan tabel simbol pemanggilannya tergantung terutama pada
  • 128.
    Jumlah dan sifatcompiler. Pada multipass/ separate compiler, seperti terlihat pada gambar 9.1. Tabel simbol dibuat selama tahapan analisis leksikal. Entry indeks untuk variabel pada tabel simbol dibentuk oleh token string yang dihasilkan scanner. Sebagai contoh pada gambar 9.1. X dan Y menjadi posisi indeks ke 1 dan ke 2 tabel simbol. Tahapan leksikal analysis menerima token-token tersebut, memeriksa kebenaran sintaksis dan membangkitkan semacam pohon parsing. Bentuk tersebut kemudian dianalisa oleh kebenaran semantik, misal kebenaran context dependent dan digunakan pada tahapan pembangkitan kode untuk menghasilkan sekumpulan instruksi objek code. Perhatikan tidak ada rutin yang menangani tabel yang digunakan selama tahapan analisis sintaksis
  • 129.
    Pada pemeriksaan semantikdan pembangkitan kode banyak atribut yang berhubungan dengan suatu variabel bisa diberi nilai dalam tabel simbol. Contoh bahasa dengan deklarasi eksplisit, tipe dari satu variabel hanya bisa diassign saat dikenali statement deklarasinya telah dikompilasi. Disarankan nama variabel harus dimasukan ke dalam tabel simbol selama analisis leksikal dan atribut lainnya di assigned selama pembangkitan kode
  • 130.
    Gambar 12.1 :Interaksi Tabel Simbol Pada Multipass Compiler <assign> id1 := <ekspr> id2 + id3 LDA X ADD Y Source Token-Token STO Y Program id1 := id2 + id3 X := X + Y Analisis Leksikal Analisis Sintaksis Code Generator Dan Analisa Semantik Tabel Simbol
  • 131.
    Secara umum, sebuahtabel simbol bisa memiliki elemen- elemen tabel sebagai berikut, meskipun tidak semuanya diperlukan pada semua kompilator : 1. No. urut identifier : menentukan nomor urut identifier dalam tabel simbol. 2. Nama identifier : berisi nama-nama identifier ( nama, variabel, nama tipe ). 3. Nama konstanta, nama prosedur, nama fungsi dan sebagainya yang terdapat pada program sumber. Nama-nama ini akan dijadikan referensi pada waktu analisa semantik, pembuatan intermediate code serta pembangkitan kode. 4. Tipe identifier : tipe ini dapat berupa string, integer, real array, record maupun prosedur, function dan sebagainya.
  • 132.
    5. Object TimeAddress : address yang mengacu ke alamat tertentu. 6. Dimensi dari identifier yang bersangkutan. 7. Nomor baris variabel dideklarasikan. Nomor baris variabel direferensikan. 8. Field Link. Nama suatu variabel harus selalu ada dalam tabel simbol, karena dipergunakan untuk mengidentifikasikan variabel tertentu untuk analisa semantik dan pembangkitan kode. Untuk memungkinkan akses yang cepat, biasanya ditentukan panjang maksimum variabel.
  • 133.
    12.2. Implementasi TabelSimbol Beberpa jenis Tabel Simbol : 1. Tabel identifier : berfungsi menampung semua identifier yang terdapat di dalam program. 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 yang bernilai real. 5. Tabel string : menyimpan informasi string. 6. Tabel Display : mencatat blok yang aktif.
  • 134.
    12.2.1. Tabel identifier Tabelidentifier memiliki field : 1. No. urut identifier dalam tabel. 2. Nama identifier. 3. Jenis/ objektif dari identifier : prosedur, fungsi, tipe, variabel, konstanta. 4. Tipe dari identifier yang bersangkutan : integer, karakter, boolean, array, record, file , no type. 5. Level : kedalaman identifier tertentu ( depth of block ) 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.
  • 135.
    Untuk identifier yangbutuh tempat penyimpanan dicatat pula : • Alamat relatif/ address dari identifier untuk implementasi. • Informasi referensi identifier tertentu ke dalam tabel identifier lain yang digunakan untuk mencatat. • Informasi-informasi yang diperlukan yang menerangkannya. • Link : menghubungkan identifier ke identifier lainnya atau yang dideklarasikan pada level yang sama. • Normal : diperlukan pada pemanggilan parameter, untuk membedakan parameter by value dan reference (berupa suatu variabel Boolean ).
  • 136.
    Contoh kasus :terdapat sebuah listing program berikut ini : Program A ; Var B ; integer ; Procedure X ( z : char ) ; Var C : integer ; Begin …………. Tabel identifier akan mencatat semua identifier : 1. A 2. B 3. X 4. Z 5. C Contoh implementasi tabel identifier :
  • 137.
    Tabel 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 = ( konstan, variabel, procedure, fungsi ) Types = ( notipe, int, reals, booleans, chars, arrays, record )
  • 138.
    12.2.2. Tabel Array tabelarray digunakan untuk menyimpan informasi suatu identifier yang bertipe array. Tabel array memiliki field : • No. urut suatu array dalam tabel. • Tipe dari indeks array yang bersangkutan. • Tipe elemen array. • Referensi dari elemen array. • Indeks batas bawah array. • Indeks batas atas array. • Jumlah elemen array. • Ukuran total array ( total size = atas – bawah + 1 ) X elemen size ). • Elemen size ( ukuran tiap elemen ).
  • 139.
    Tabel array diacudengan field referensi pada tabel identifier. Contoh implementasi tabel array : tabarray : array [ 1…tabmax ] of record Indekstype, elementype : types ; elementref, low, high, elemensize, tabsize, : integer end; 12.2.3. tabel Blok Tabel blok digunakan untuk menyimpan informasi- informasi blok-blok yang ada pada tabel utama. Dengan berdasarkan pada tabel ini, dapat diketahui batas-batas suatu blok pada tabel utama ( tabel identifier ).
  • 140.
    Tabel Blok memilikifield : • No. urut blok. • Batas awal blok. • Batas akhir blok. • Ukuran parameter/ parameter size. • Last variabel. • Last parameter. Contoh implementasi tabel blok. Tabblok : array [ 1…..tabmax ] of record Lastvar, lastpar, parsize, varsize : integer ; end;
  • 141.
    Dari contoh listingprogram berikut : Program A ; Var B : integer ; Procedure X ( Z : char ) ; Var C : integer Begin ……… Akan diperoleh untuk blok program A ; Last variabel = 2 Variabel size = 2 ( dianggap integer butuh 2 byte ) Last parameter = 0 ( tanpa parameter ) Parameter size = 0
  • 142.
    Untuk blok procedureX : Last variabel = 4 Variabel size = 2 Last parameter = 3 Parameter size = 1 ( dianggap char butuh satu byte ). 12.2.4. Tabel Real Tabel real ini digunakan untuk menyimpan nilai dari suatu identifier yang bertipe real. Elemen-elemen dari tabel ini adalah sebagai berikut : • No. urut elemen. • Nilai real suatu variabel yang mengacu ke indeks tabel. Contoh implementasi tabel real : Tabreal : array [ 1….tabmax ] of real
  • 143.
    Pemikirannya disini setiaptipe yang dimiliki oleh suatu bahasa akan memiliki tabelnya sendiri. 12.2.5. Tabel String Tabel ini digunakan untuk menyimpan informasi string yang terdapat pada program sumber. Elemen-elemen yang terdapat dalam tabel ini adalah : • No. urut elemen. • Karakter-karakter yang merupakan konstanta. Contoh implementasi tabel string : Tabstring : array [ 1…..tabmax ] of string
  • 144.
    12.2.6. Tabel Display Tabelini menyimpan informasi mengenai blok-blok yang lagi aktif. Elemen-elemen yang terdapat di dalam tabel ini adalah : • No. urut tabel. • Blok yang aktif Pengisian tabel display dilakukan dengan konsep stack. Urutan pengaksesan : tabel display – tabel blok- tabel simbol, Contoh implementasi tabel display : tabdisplay : array [ 1….tabmax ] of integer
  • 145.
    12.3. Interaksi AntarTabel Pertama kali tabel display akan menunjuk blok mana yang sedang aktif. Dari blok yang aktif ini, akan diketahui identifier-identifier yang masuk ke dalam blok tersebut. Untuk yang pertama kalinya yang akan diacu adalah identifier yang paling akhir, kemudian identifier sebelumnya dan seterusnya. Informasi suatu identifier ini mungkin akan dicari kelengkapan informasi suatu identifier ke tabel yang sesuai ( tabel real, tabel string, atau tabel array ).
  • 146.
    12.4. Contoh ImplementasiTabel Simbol Tabel-tabel dapat diimplementasikan dalam suatu struktur data yang sesuai dengan karakteristik masing- masing tabel. Struktur data yang digunakan : Konstanta-konstanta ( Deklarasi konstan untuk analisa semantik ) nkw = 27 ; { no, of key word } alng = 10 ; { no, of significant chars identifiers } llng = 200 ; { input line length } emax = 38 ; { maxx exponent of real number } emin = - 38 ; { min exponent } kmax = 5 ; { max no of significant digits } tmax = 100 ; { size of table }
  • 147.
    bmax = 20; { size of block table } amax = 30 ; { size of array table } c2max = 20 ; { size of real constant table } csmax = 30 ; { max no. of cases } Imax = 7 ; { maximum level } smax = 600 ; { size of string table } ermax = 58 ; { max error no. } xmax = maxint ; { 2 ** 15 – 1 } nmax = 16383 ; { 2 ** 14 – 1 } lineleng = 136 ; { output line length } linelimit = 200 ; Stacksize = 1500 ;
  • 148.
    DAFTAR PUSTAKA • AlfredV. Aho & Jeffrey D. Ullman, Principle of Compiler Design, Addison-Wesley, 1984 • Alfred V. Aho & Jeffrey D. Ullman, Compiler Principles Technique and Tools, Addison-Wesley, 1988. • David Gries, Compiler Construction For Digital Computer, Cornell University, John Wiley & Sons, Inc, 1971 • Jean Paul Tremblay & Paul G. Sorenson, Compiler Writing, Mc Graw Hill, 1985 • John E. Hopfcroft & Jeffrey D. Ullman, Introduction To Automata Theory, Language and Computation, Addition- Wesley, 1979
  • 149.
    • Firrar Utdirartatmo,Teknik Kompilasi, J & J Learning, Yogyakarta, 2001 • Sumantri Slamet & Heru Suhartanto, Teknik Kompilasi, PAU, Universitas Indonesia, 1992 • Stephen K. O’Brien & Steven Nameroff, Turbo Pascal 7 The Complete Reference, Mc Graw-Hill, 1993