1. Pendahuluan
Bahasa pemrograman adalah notasi untuk menjelaskan komputasi kepada orang dan
mesin. Karena semua software yang berjalan pada semua computer menggunakan
kedalam bentuk yang dapat dimengerti computer. Sistem software yang dapat
Compiler adalah sebuah program yang dapat membaca program sumber dan
Gambar1. Compiler
Interpreter adalah salah satu jenis dari Bahasa prosesor, dimana menghasilkan target
1|Page
Gambar2. Interpreter
Program mesin-bahasa target yang dihasilkan oleh compiler biasanya jauh lebih cepat
biasanya dapat memberikan diagnosa kesalahan yang lebih baik daripada kompilator,
2|Page
Tahap 1 : Analisis Leksikal atau Scanning
Tahap pertama dari compiler ini disebut analisis leksikal atau scanning yaitu membaca
aliran karakter dan kelompok karakter yang membentuk program sumber dalam urutan
yang bermakna disebut leksem. Dimana untuk setiap leksem, analisa leksikal
(token-name, attribute-value)
Tahap kedua compiler adalah analisis sintaks atau parsing. Parser menggunakan
komponen pertama dari token yang dihasilkan oleh penganalisis leksikal untuk
gramatikal token. Sebuah representasi khas adalah pohon sintaks di mana setiap node
merupakan operasi dan anak-anak dari simpul tersebut merupakan argumen operasi.
Sebuah pohon sintaks untuk aliran token ditampilkan sebagai output dari analisa
Analisa semantik menggunakan pohon sintaks dan informasi dalam tabel simbol
didefinisikam. Hal ini juga mengumpulkan jenis informasi dan menyimpannya baik
pohon sintaks atau tabel simbol, untuk penggunaan selanjutnya pada tahap
intermediate-code generation.
Bagian penting dari analisis semantik adalah jenis pemeriksaan, di mana memeriksa
3|Page
definisi bahasa pemrograman membutuhkan indeks array bertipe integer; compiler
harus melaporkan kesalahan jika angka floating-point digunakan untuk indeks array
tersebut.
membangun satu atau lebih pernyataan intermediate, yang dapat memiliki berbagai
Setelah sintaks dan analisis semantik dari program sumber, banyak compiler
seperti mesin, yang bisa anggap sebagai program untuk mesin abstrak. Representasi
intermediate ini harus memiliki dua sifat penting: harus mudah untuk memproduksi dan
sehingga target kode yang akan dihasilkan lebih baik. Berarti biasanya lebih baik lebih
cepat, namun tujuan lain seperti kode pendek, atau target kode yang mengkonsumsi
lebih sedikit daya. Sebagai contoh, sebuah algoritma sederhana menghasilkan kode
Sebuah kode intermediate yang sederhana diukuti oleh optimasi akan menghasilkan
4|Page
Tahap 6. Code Generation
Code generator mengambil input dari representasi intermediate pada program sumber
dan memetakannya ke Bahasa target. Jika Bahasa target adalah kode mesin, register
atau lokasi memori yang dipilih untuk variable yang digunakan oleh program. Maka
yang melakukan tugas yang sama. Tugas yang utama code generation adalah
Fungsi penting dari compiler adalah untuk mencatat nama-nama variabel yang
Atribut ini dapat memberikan informasi tentang penyimpanan yang dialokasikan untuk
nama, jenis, ruang lingkup (di mana dalam program nilainya dapat digunakan), dan
dalam kasus nama prosedur, hal-hal seperti jumlah dan jenis argumen, metode
melewati setiap argumen (misalnya, dengan nilai atau referensi), dan pengembalian
tipe.
Tabel simbol adalah struktur data yang berisi catatan untuk setiap variable nama,
dengan kolom untuk atribut nama. Struktur data harus dirancang untuk memungkinkan
compiler untuk menemukan record untuk setiap nama dengan cepat dan untuk
5|Page
Gambar 4. Contoh proses kompilator
6|Page
SCANNING
Scanning atau analisis leksikal merupakan tahap dari kompilator yang bertugas
membaca sumber program dari suatu file berdasarkan karakter dan membaginya
Token utama dalam program disebut besaran leksikal dimana, dibagi menjadi 4 yaitu :
1. Identifier, merupakan keyword yang telah disediakan oleh program dan juga
variabel
Contoh :
IF A=10 then
Begin
Else
7|Page
Ekspresi Reguler (ER)
Digunakan untuk merepresentasikan ‘pattern’/ bentuk string untuk setiap karakter, dan
Contoh :
Terdapat karakter dengan anggota ∑ = {a, b, c}. dimana nilai string yang
1. Pada program pascal, angka / digit terdiri dari decimal Contoh : 4578, 0933
Dapat dibuat ER :
Nama ER : nat
Anggota ER : 0..9
Digit = [0..9]
8|Page
Finite State Automata
Digunakan untuk menjelaskan proses terbentuknya ‘pattern’/ bentuk dari inputan string
Contoh :
- 147. 0E+31
+ 411. 8E-2
9|Page
Latihan :
a. Variable
b. Konstanta
c. Komentar
d. Pengulangan while
10 | P a g e
Parsing
Parsing bertugas untuk menentukan sintaks atau struktur dari sebuah program,
karena alasan ini juga disebut analisis sintaks. Sintaks dari Bahasa pemrogrman
Apabila bentuk CFG adalah α →β, dimana kemungkinan muncul string adalah :
muncul
number
11 | P a g e
Produksi CFG yang terbentuk adalah :
Operator → +|-|*
Digit → 0|1|…|9
ekspresi, operator, number, digit disebut nama struktur atau didalam automata
+, -, *, 0..9 disebut dengan simbol atau didalam automata dikenal dengan terrminal
Bentuk CFG dalam sebuah kompilator akan diubah menjadi bentuk BNF (Barcus Naur
Form )
CFG BNF
α→β α ::= β
struktur, symbol,
nama struktur
→ ::=
| |
12 | P a g e
Contoh :
Diberikan CFG
Op → +|-|*
Digit → 0|1|…|9
Maka BNF : <Exp> ::= ( <exp> ) | <exp> <op> <exp >| <number>
Selanjutnya untuk mempermudah dalam proses parsing, maka CFG dan BNF dapat
CFG BNF
op exp | number <exp> <op> <exp >| O → +|-|* <E> <O> <E> |
13 | P a g e
Derivation
Pada CFG sebuah string dapat diterima, apabila dapat terbentuk proses derivasi.
Derivasi adalah urutan pergantian nama struktur dengan pilihan sisi kanan dari
produksi. Sebuah derivasi dimulai dengan sebuah nama struktur tunggal dan berakhir
Contoh.
Op → +|-|*
Digit → 0|1|…|9
Tentukanlah, string (34-3)*42 akan diterima atau ditolak pada grammar diatas!
14 | P a g e
═> (exp op 3)* 42 [digit→ 3 ]
Pohon parsing digunakan untuk menampilkan proses penurunan atu derivasi sebuah
Pohon parsing yang sesuai dengan derivasi adalah pohon berlabel dimana bagian node
diberkan label nama struktur dan bagian daun untuk terminal/ symbol
Contoh : pohon
(34-3)*42 adalah
sebagai berikut :
15 | P a g e
Pengulangan / rekursif pada Grammar
Dimana rekursif :
Dan
Kondisi seperti ini, dibutuhkan sebuah notasi ekstensi yang disebut extended BNF atau
Dimana : A = stmt-sequence
α = stmt ;
β = stmt
bentuk EBNF :
Atau
16 | P a g e
Diagram sintaks
Contoh :
1. Diberikan grammar
Diagram sintaks :
2. Diberikan grammar :
Bentuk EBNF :
Diagram sintaks :
17 | P a g e
Algoritma Parser
Parser
TOP with Full Backtracking TOP without Backtracking Operator Procedure Parser LR Parser
Brute force method Recursive descent parser Non recursive descent LR (0)
(LL(1))
SLR (1)
LR(1)
LALR(1)
18 | P a g e
TOP DOWN PARSER
LL(1)
Merupakan algortima parsing tanpa bactrcaking. “L” pertama mengacu pada proses
input dari kiri ke kanan, “L” kedua mengacu pada penusuran sebuah derivasi dari paling
Untuk menentukan Action dari sebuah parsing dapat dibentuk dengan sebuah tabel,
dengan aturan :
2. Match / cocokan sebuah token pada stack paling atas dengan masukan token
berikutnya.
Contoh :
19 | P a g e
TOP dimulai dengan memasukkan simbol awal di atas stack, akan menerima input
string jika, setelah serangkaian tindakan / action, stack dan input menjadi kosong.
1. Jika A→α adalah produksi yang dipilih dan terdapat derivasi α=>*αβ, dimana α
2. Jika A→α adalah produksi yang dipilih dan terdapat derivasi α=>*ɛ, dan
20 | P a g e
Kolom pertama menunjukkan dari tumpukam parsing
Pengulangan pada LL(1) dapat mengakibatkan sebuah grammar tidak dapat digunakan
atau titolak. Untuk itu dilakukan penghilangn rekursif kiri, dengan cara :
2. Penghilangan faktor
21 | P a g e
Contoh :
Dimana :
2. Penghilangan factor
Contoh :
22 | P a g e
FIRST AND FOLLOW SET
Untuk membuat sempurna algoritma LL(1) maka buatlah tabel parsing LL(1), yang
First Set
Diberikan X sebuah symbol grammar atau ɛ maka first(x) didefinisikan sebagai berikut :
2. Jika X adalah sebuah nonterminal, maka untuk setiap produksi yang dipilih
X→X1X2..Xn, first (x) mengandung first(x1) = {ɛ}, untuk setiap i<n, semua first(x1),
first(x2),…first(Xn+1) ={ɛ}
Jika semua first (x1) .. first (Xn) adalah ɛ, maka first(x) = {ɛ}
Contoh :
23 | P a g e
2. Dengan algoritma diatas maka dibentuk first dari grammar diatas sebagai beikut
FOLLOW SET
kemungkinan $, yaitu :
2. Jika terdapat produksi B→αAγ maka first(γ) = {ɛ} dimana terdapat dalam
follow(A)
3. Jika terdapat produksi B→αAγ mengandung ɛ dalam first(γ) maka follow (A)
Contoh :
24 | P a g e
RECURSIVE DESCENT PARSER
procedure lainnya,
Jika bertemu terminal maka lakukan pemilihan sesuai dengan kode (if dan
case).
Jika bertemu nonterminal maka panggil procedure dengan nama yang sama
Contoh :
25 | P a g e
Dimana pseudocode untuk procedure match :
Error recovery pada Recursive Descent parser biasanya disebut dengan panic mode,
dimana symbol melewatkan input sampai tanda yang silih akan sama dengan tanda
yang muncul.
1. Sebagai titik awal, menempatkan semua simbol dalam FOLLOW (A) ketika
sinkronisasi untuk nonterminal A. Jika kita lewati token sampai unsur FOLLOW
26 | P a g e
(A) terlihat dan pop A dari tumpukan, ada kemungkinan bahwa parsing dapat
dilanjutkan.
2. Hal ini tidak cukup untuk menggunakan FOLLOW (A) sebagai sinkronisasi
ditetapkan untuk A.
Sebagai contoh, jika titik koma mengakhiri pernyataan, seperti di Pascal, maka
kata kunci yang dimulai dengan pernyataan mungkin tidak muncul di set
A kehilangan titik koma setelah sebuah tugas akan menyebabkan hasil dalam
kata kunci awal pada pernyataan berikutnya dilewati. Seringkali, ada struktur
Kita bisa menambahkan set sinkronisasi dari tingkat rendah untuk membangun
simbol-simbol yang dimulai dari tingkat yang lebih tinggi konstruksi. Sebagai
contoh, kita bisa menambahkan kata kunci yang dimulai pernyataan begin untuk
27 | P a g e
5. Jika terminal di atas tumpukan tidak cocok, maka pop terminal, kemudian
Contoh :
Tabel parsing :
Error recovery untuk string “id+id*id” menggunakan panic mode dimana menambahkan
28 | P a g e
Dimana input yang salah adalah “) id * + id”
29 | P a g e
BOTTOM UP PARSING
Merupakan proses menafsirkan sebuah operator akan dikerjakan terlebih dahulu atau
dikerjakan setelahnya.
Operator Grammar
Digunakan untuk membandingkan level dari satu operator dengan operator lainnya.
Contoh pada matematika, jika diketahui persamaan a+b/c, maka operator “/” akan
Tata Bahasa yang memiliki sifat yang produksinya pada sisi kanan tidak memiliki ɛ atau
grammar E → E A E | ( E ) | - E | id
E → E + E | E * E | ( E ) | id A→+|-|*|/|^
2. Bandingkan I dan j :
30 | P a g e
a. apabila keduanya memiliki input yang sama yaitu berupa string atau $, maka
Dimana string merupakan operator paling tinggi dan $ operator paling rendah
dalam stack
stack
3. kerjakan langkah 2 hingga input berakhir, dan apabila mencapai struktur teratas /
Contoh :
E → E + E | E * E | ( E ) | id
31 | P a g e
Bottom up dengan operator precedence :
$ Id
$ Id +
$ Id + id
32 | P a g e
E E
↑ ↑
+ dengan * tanda < maka “push” *
Id + id *
↑ ↑ ↑ ↑
$ Id + Id
Id + id * id
↑ ↑ ↑ ↑ ↑
$ Id + Id *
Id + id * id $
↑ ↑ ↑ ↑ ↑ ↑
$ Id + Id * Id
Id + id * id $
↑ ↑ ↑ ↑ ↑ ↑
$ Id + Id * Id
33 | P a g e
+ dengan $ tanda > maka “pop” +
Digunakan untuk menentukan urutan level operator paling tinggi dan terendah.
2. Bandingkan dua fungsi, apabila fungsi pertama lebih besar dari fungus kedua,
Contoh :
34 | P a g e
grafik yang merepresentasikan fungsi precedence :
Digambarkan :
gid→f*→g*→f*→g+→f$
fid→g*→f+→g+→f$
id + * $
f 4 2 4 0
g 5 1 3 0
Maka urutan tertinggi untuk * dan + adalah f* bernilai 4 lebih besar dari g+ bernilai 1,
35 | P a g e
LR (0) PARSER
Sebuah produksi disebut LR(0) apabila A→α yang dipilih dan jika β dan γ adalah dua
symbol string (termasuk empty) dimana βγ = α maka A→β.γ. (tidak ada acaun secara
Contoh :
LR(0) parser terjadi apabila tidak ada ‘lookahead’ yang dapat diperiksa setelah muncul
parsing di stack, dan jika ini terjadi maka tidak dapat dihitung sebagi string.
stack parsing dan proses dari shift dan reduksi pada parser. Yaitu apabila A→α.β dan γ
dimulai dengan symbol X, yang mana X mungkin adalah sebuah token dan nonterminal
maka dapat ditulis A→α.Xη sehingga terdapat transisi pada symbol X yaitu :
Dan jika X adalah sebuah token, maka transisi merupakan shift dari X dmana input
paling atas stack merupakan sebuah parsing. Pada kasus lain jika X adalah sebuah non
36 | P a g e
terminal, maka push X kedalam stack dimana ini hanya terjadi apabila X→β. Karena
adanya β dan state X→.β maka proses di mulai, dimana setiap A→α.Xη harus
Contoh :
1. Jika state S berisi A→α.Xβ, dimana X adalah terminal, maka pop string dari
stack
Jika token adalah X dan state S berisi A→α.Xβ, maka state baru di push
37 | P a g e
Jika token bukan X untuk beberapa item di dalam stack S maka berikan
penjelasa error
2. Jika state memiliki item lengkap (A →γ.) maka langkah berikutnya A →γ.
Contoh :
Transisi grammar :
38 | P a g e
Tabel LL(0) parser dengan string “ ((a))”
1. Jika satate S berisi A →α.Xβ, dimana X adalah terminal dan X adalah token
berikutnya dalam string masukkan, maka shift ke stack, dan state baru di push
ke stack A →αX.β
2. Jika state S adalah A →γ. dan token berikutnya adalah follow(A), maka
berikutnya reduksi A →γ.A oleh S’→S, dimana S adalah state awal, maka aturan
Hapus γ dan semua state yang berhubungan dari stack parsing. Kemudian, buat
state yang dimulai dari γ dimana B→α.A.β , push A ke dalam stack dan push
B→αA.β
3. Jika input berikutnya bukan kedua kasus diatas, maka beri penjelasan error
39 | P a g e
1. Untuk semua A→α.Xβ dalam S dengan X adalah terminal, tidak ada B→γ. pada
2. Untuk A→α dan B→β pada S, maka follow(A) n follow(B) adalah empty
Contoh :
Terlihat bahwa :
40 | P a g e
Sehingga tabel SLR(1) parsing :
LR(1) PARSING
Kesulitan pada SLR(1) adalah meenrapkan lookahead pada transisi LR(0), dimana
1. Jika state S berisi banyak LR(1) yang berasal dari bentuk [A→α.Xβ, a], dimana X
adalah sebuah terminal dan X adalah token dalam string input berikutnya, maka
action adalah Shift input token tersebut kedalam stack, dan state baru di push
2. Jika statae S berisi LR(1) [A→α., a] dan token berikutnya dalam string input
adalah a, maka action adalah reducsi aturan A→α. A direduksi dengan aturan
41 | P a g e
S’→S, dimana S adalah state awal sama dengan diterima (ini terjadi jika input
token adalah $)
Hapus string α dan semu state yang berhubungan dengan stack parsing, bangun
state transisi dari bentu [B→α.Aβ,b], push A kedalam stack dan push stack
3. Jika input berikut bukan dua kasus diatas maka beri penjelasan error
Contoh :
42 | P a g e
Hasil Transisi LR(1)
LALR didasarkan pada pengamatan bahwa, dalam banyak kasus pembentukan transisi
LR1 adalah karena sebagian adanya banyak state yang berbeda yang memiliki set
inti dari keadaan transisi dari LR (1) item adalah himpunan LR (0) item yang terdiri dari
Untuk membentuk transisi LALR(1) dari LR(1) ada 2 prinsip yang harus diperhatikan :
2. Diberikan dua state yaitu S1 dan S2 dari transisi LR(1) yang memiliki inti yang
sama. Misalkan ada transisi pada symbol X dari state S1 menuju t1. Dan juga
43 | P a g e
ada transisi X dari state S2 ke state t2, sementara t1 dan t2 memiliki init yang
sama.
Contoh :
Transisi LALR(1)
44 | P a g e
ANALISIS SEMANTIK
Disebut analisis semantik karena melibatkan informasi yang berada di luar kapabilitas
CFG dan algoritma parsing ;standar dan komputasi, oleh karena itu tidak dianggap
sebagai sintaks.Informasi yang diproses juga terkait erat dengan makna akhir dari
Pertama adalah analisis program yang dibutuhkan oleh aturan bahasa pemrograman
aturan.
Kedua, kategori analisis adalah analisis yang dilakukan oleh compiler untuk
Contoh atribut :
Proses komputasi atribut dan asosiasinya dihitung dengan nilai kontruksi Bahasa
45 | P a g e
Atribut grammar
Jika X adalah sebuah grammar dan a adalah sebuah atribut yang dikaitkan dengan
atribut tata bahasa yang ditulis dalam bentuk tabel, dengan setiap aturan tata
bahasa yang terdaftar dengan persamaan atribut, atau aturan semantik yang
Contoh :
46 | P a g e
Sehingga tabel analisis semantic :
order.
Diberikan sebuah grammar, dimana memiliki aturan dependency graph, setiap graph
memiliki node yang dilabelkan sebagai atribut dengan aturan sebagai berikut :
Atau (karena dependency graph menghilangkan subkrip untuk symbol yang berulang
karena reperensi graph jelas membedakan kejadian yang berbeda sebagai node yang
berbeda )
Diketahui bahwa grafik harus acyclic, maka graph juga bersifat directed acyclic graph
48 | P a g e
SYMBOL TABLE / Tabel simbol
Symbol table dalam kompilator adalah sebauh struktur data tipe kamus data,degna 3
Contoh :
49 | P a g e
Maka tabel simbol untuk procedure f :
50 | P a g e
Tabel symbol setelah keluar dari deklarasi (dan menghapusnya)
DATA TYPES DAN TYPE CHECKING (TIPE DATA DAN PEMERIKSAAN TIPE
DATA)
Data Types
Salah satu tugas pokok kompilator adalah komputasi dan maintenance informasi
tentang jenis data dan penggunaan inforasi tersebut untuk memastikan bahwa setiap
bagian dari sebuah program sesuai dengan aturan Bahasa ( type checking).
Tipe data adalah seperangkat nilai atau lebih, dimana satu set nilai memiliki operasi
tertentu pada nilai tersebut. Contoh, bilangan integer pada Bahasa programming
51 | P a g e
Type Checking
symbol.
Terlihat bahwa types dari grammar diatas, memiliki struktur pohon yang disebut
2. Statement, tidak memiliki tipe data. Tapi bagian struktur harus diperiksa untuk
52 | P a g e
3. Ekspresi, seperti angka dan nilai Boolean (true dan false) akan dijelaskan
operator yang sama digunakan untuk 2 atau lebiih operasi yang berbeda
53 | P a g e
INTERMEDIATE-CODE GENERATION
Pada Three- Address Code, operator pada sisi sebelah kanan akan terbentuk
Contoh :
54 | P a g e
Deskripsi instruksi three-address menentukan komponen dari setiap jenis instruksi,
tetapi tidak menentukan representasi dari instruksi dalam struktur data. Dalam
kompilator, petunjuk ini dapat diimplementasikan sebagai objek atau sebagai catatan
untuk operator dan operan. Tiga representasi itu disebut "quadruples," "triples," and
"indirect triples."
Quadruples
Sebuah quadruple (atau hanya "quaff ') memiliki empat bidang, yang kita sebut op, argl'
Contoh :
menjadi :
Triples
Sebuah triple hanya memiliki tiga bidang, yang disebut op, arg1, dan arg2
Contoh :
55 | P a g e
indirect triples
tertentu.
56 | P a g e
Code Generation
Tahap akhir dalam model compiler kami adalah code generator. Yang memerlukan
input dari representasi intermediate (IR) yang dihasilkan oleh front-end compiler,
beserta informasi tabel simbol yang relevan, dan menghasilkan output program.
P-CODE
p-code dimulai sebagai standar kode sasaran assembly yang dihasilkan oleh sejumlah
compiler pascal tahun 1970-an dan awal 1980-an. Dirancang untuk menjadi kode yang
Contoh :
p-code :
57 | P a g e
Maka akan dibentuk sintesis string (x=x+3)+4 atribut, dari p-code :
58 | P a g e