1. Pendahuluan
Bahasa pemrograman adalah notasi untuk menjelaskan komputasi kepada orang dan
mesin. Karena semua software yang berjalan pada semua computer menggunakan
bahsa pemrograman, dimana program sebelum dijalankan harus diterjemahkan dahulu
kedalam bentuk yang dapat dimengerti computer. Sistem software yang dapat
melakukan terjemahan ini disebut dengan Compiler/ kompilator.
Compiler adalah sebuah program yang dapat membaca program sumber dan
menterjemahkannya kedalam Bahasa yang sama dengan Bahasa program yang
merupakan Bahasa yang ditargetkan.
Gambar1. Compiler
Interpreter adalah salah satu jenis dari Bahasa prosesor, dimana menghasilkan target
program sebagao terjemahan, interpreter langsung mengeksekusi operasi yang
ditentukan dalam sumber masukan yang diberikan oleh pengguna.
1|Page
Gambar2. Interpreter
Program mesin-bahasa target yang dihasilkan oleh compiler biasanya jauh lebih cepat
daripada interpreter pada saat pemetaan input ke output. bagaimanapun, Interpreter,
biasanya dapat memberikan diagnosa kesalahan yang lebih baik daripada kompilator,
karena mengeksekusi pernyataan program sumber dengan pernyataan.
2. Struktur sebuah kompilator
4|Page
5|Page
6|Page
SCANNING
Scanning atau analisis leksikal merupakan tahap dari kompilator yang bertugas
membaca sumber program dari suatu file berdasarkan karakter dan membaginya
kedalam token / logika unit.
Token utama dalam program disebut besaran leksikal dimana, dibagi menjadi 4 yaitu :
1. Identifier, merupakan keyword yang telah disediakan oleh program dan juga
variabel
2. Konstanta, merupakan nilai tetap yang tidak dapat berubah
3. Operator, merupakan operator yang digunakan pada program
4. Delimiter, merupakan pemisah pada program
Contoh :
IF A=10 then
Begin
Writeln nilai A=10;
Else
Writeln nilai bukan 10;
Dari potongan program diatas maka besaran leksikal:
Identifier
IF,
Then,
Konstanta
Operator
Writeln, Else, A
Delimite
Spasi, ; , enter
nilai A bukan 10
anggota :{a..z,A..Z}
Nama ER : Digit
anggota : {0..9}
+ 0.123E+47
-
147. 0E+31
+ 411. 8E-2
9|Page
Latihan :
1. Buatlah FSA pada program pascal untuk :
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
biasanya diberikan berdasarkan produksi Bahasa context-free grammar (CFG) dengan
cara yang mirip dengan aturan struktur leksikal.
Contoh diketahui sebuah ekspresi aritmatika integer terdiri dari
a. operator anggotanya adalah +, -, *
b. digit anggotanya adalah 0..9
Apabila bentuk CFG adalah , dimana kemungkinan muncul string adalah :
Kemungkinan string Pembentukan CFG
CFG
muncul
Digit
number digit
12
Digit 0|1||9
098
Catatan :
Tanda * berarti pengulangan
Ekspresi 12+098
Ekspresi
number
number
(12*4)
number)
11 | P a g e
number
BNF
::=
bisa
berupa
struktur,
serangakain
nama
symbol,
simbol
atau
nama struktur
Nama struktur
::=
12 | P a g e
Contoh :
Diberikan CFG
Exp ( exp ) | exp op exp | number
Op +|-|*
Number digit | digit *
Digit 0|1||9
Maka BNF :
Selanjutnya untuk empermudah dalam proses parsing, maka CFG dan BNF dapat
dibentuk menjadi sederhana menjadi symbol-simbol yanglebig sederrhana.
CFG
BNF
Sederhana
CFG
Op +|-|*
<number>
<E> ( <E> ) |
<E> <O> <E> |
ND|D*
<N>
D 0|1||9
<O> +|-|*
<N> <D> |
digit *
<Number>
Digit 0|1||9
<digit> | <digit> *
<D> *
<D 0|1||9
13 | P a g e
::=
BNF
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
dengan sebuah string dari token symbol.
Contoh.
Diketahui sebuah grammar berikut :
Exp ( exp ) | exp op exp | number
Op +|-|*
Number digit | digit *
Digit 0|1||9
Tentukanlah, string (34-3)*42 akan diterima atau ditolak pada grammar diatas!
Derivasi untuk string (34-3)*42 :
Exp
[Exp number ]
[number digit* ]
> exp op 42
[digit 42 ]
> exp * 42
[op * ]
> (exp)* 42
[Exp (exp)]
[Exp number ]
[number digit ]
14 | P a g e
[digit 3 ]
[op - ]
[Exp number ]
[number digit* ]
[digit 34 ]
pohon
adalah
sebagai berikut :
15 | P a g e
Dan
Kondisi seperti ini, dibuthkan sebuah notasi ekstensi yang disebut extended BNF atau
EBNF. Dimana dilambangkan dengan tanda { } atau [ ]
Contoh rekursif kanan:
Dimana :
A = stmt-sequence
= stmt ;
= stmt
bentuk EBNF :
Atau
16 | P a g e
Diagram sintaks
Merupakan grafik visualisasi dari BNF dan EBNF, dimana
Nama struktur dilambangkan persegi,
Symbol dilambangkan lingkaran
Contoh :
1. Diberikan grammar
Diagram sintaks :
2. Diberikan grammar :
Bentuk EBNF :
Diagram sintaks :
17 | P a g e
Algoritma Parser
Parser
LR Parser
LR (0)
SLR (1)
LR(1)
LALR(1)
18 | P a g e
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.
Skema umum untuk TOP yang diterima adalah :
20 | P a g e
21 | P a g e
Contoh :
Dimana :
2. Penghilangan factor
Ketika dua atau lebih grammar yang memiliki bentuk :
Contoh :
22 | P a g e
23 | P a g e
2. Dengan algoritma diatas maka dibentuk first dari grammar diatas sebagai beikut
FOLLOW SET
Diberikan sebuah nonterminal A, maka follow(A) akan menghasilkan terminal dan
kemungkinan $, yaitu :
1. Jika A adalah symbol awal, maka $ adalah follow(A)
2. Jika terdapat produksi BA maka first() = {} dimana terdapat dalam
follow(A)
3. Jika terdapat produksi BA mengandung dalam first() maka follow (A)
merupakan follow (B)
Contoh :
24 | P a g e
Contoh :
Diberikan sebuah grammar berikut:
25 | P a g e
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
FOLLOW yang mewakili ekspresi nonterminal.
A kehilangan titik koma setelah sebuah tugas akan menyebabkan hasil dalam
kata kunci awal pada pernyataan berikutnya dilewati. Seringkali, ada struktur
hirarkis pada konstruksi dalam bahasa; misalnya, ekspresi muncul dalam
pernyataan, yang muncul dalam blok, dan seterusnya.
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
sinkronisasi sebagai nonterminals yang menghasilkan ekspresi.
3. Jika kita menambahkan simbol di FIRST (A) ke sinkronisasi untuk nonterminal A,
maka dimungkinkan untuk melanjutkan parsing menurut A jika simbol di FIRST
(A) muncul dalam input.
4. Jika nonterminal dapat menghasilkan string kosong, maka produksi berasal
dapat digunakan sebagai default/ standar. Hal tersebut dapat menunda
beberapa deteksi kesalahan, tetapi tidak dapat menyebabkan kesalahan akan
terlewaatkan. Pendekatan ini mengurangi jumlah nonterminals yang harus
dipertimbangkan selama pemulihan kesalahan.
27 | P a g e
5. Jika terminal di atas tumpukan tidak cocok, maka pop terminal, kemudian
mengeluarkan pesan yang mengatakan bahwa terminal itu dimasukkan, dan
meneruskan parsing. Akibatnya, pendekatan ini membutuhkan sinkronisasi
token yang terdiri dari semua token lainnya.
Contoh :
Tabel parsing :
Error recovery untuk string id+id*id menggunakan panic mode dimana menambahkan
token untuk sinkronasi pada tabel.
28 | P a g e
29 | P a g e
BOTTOM UP PARSING
Operator Procedure Parser
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
dikerjakan terlebih dajulu kemudian diikuti dengan operator +.
Disini terlihat maka level operator / lebih tinggi dari +.
Maka untuk menentukan sebuah operator grammar dengan menggunakan sebuah
Operator Precedence Parsing, yaitu :
Tata Bahasa yang memiliki sifat yang produksinya pada sisi kanan tidak memiliki atau
dua nonterminal yang bersebelahan / berturut-turut.
Grammar
yang
termasuk
grammar
E E A E | ( E ) | - E | id
E E + E | E * E | ( E ) | id
A+|-|*|/|^
30 | P a g e
a. apabila keduanya memiliki input yang sama yaitu berupa string atau $, maka
tidak dapat dibandingkan.
b. Apabila operator yang dibandingkan adalah :
+ dengan + maka berikan tanda >
+ dengan * maka berikan tanda <
+ dengan $ maka berikan tanda >
String dengan + maka berikan tanda >
Dimana string merupakan operator paling tinggi dan $ operator paling rendah
Algoritma bottom up dengan operator precedence :
1. Bentuk kedalam pita stack $
2. Bandingkan input i,j
a. apabila menghasilkan tanda < maka input tersebut di push/ tambahkan ke
dalam stack
b. apabila menghasilkan tanda> maka input tersebut di pop/ mengambil dari
stack
3. kerjakan langkah 2 hingga input berakhir, dan apabila mencapai struktur teratas /
produksi kiri maka proses berhasil/ diterima/ accept
Contoh :
E E + E | E * E | ( E ) | id
Dengan string : id+id*id $
Maka tabel M[Ni,Nj] yang terbentuk :
31 | P a g e
Id
Id +
Id
Id +
$
id
Id +
Id +
$
Id +
32 | P a g e
id
Id +
id *
Id +
Id
Id +
id *
Id +
Id +
id *
id
Id *
id $
Id +
Id *
Id +
id *
id $
Id +
33 | P a g e
Id *
Id
Id
34 | P a g e
Digambarkan :
gidf*g*f*g+f$
fidg*f+g+f$
sehingga didapat prioritas operator dari tertinggi hingga ke rendah adalah :
id + *
f
2 4 0
g 5
1 3 0
Maka urutan tertinggi untuk * dan + adalah f* bernilai 4 lebih besar dari g+ bernilai 1,
sehingga * operator tertinggi dari +.
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
eksplisit untuk menunu string yang didepan lookahead)
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.
Transisi pada LR(0) digunakan untuk menunjukkan state-state yang menginformasikan
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
ditambah sebuah transisi
Contoh :
Jika token bukan X untuk beberapa item di dalam stack S maka berikan
penjelasa error
2. Jika state memiliki item lengkap
Transisi grammar :
38 | P a g e
39 | P a g e
1. Untuk semua A.X dalam S dengan X adalah terminal, tidak ada B. pada
S dengan X adalah follow (B)
2. Untuk A dan B pada S, maka follow(A) n follow(B) adalah empty
Contoh :
Terlihat bahwa :
LR(1) PARSING
Kesulitan pada SLR(1) adalah meenrapkan lookahead pada transisi LR(0), dimana
SLR(0) mengabaikan lookahead. Dengan menggunkan LR(1) parsing, membangun
transisi baru untuk membuat lookahead dari awal.
Algortima table LR(1) :
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
kedalam stack [AX.,a]
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
SS, dimana S adalah state awal sama dengan diterima (ini terjadi jika input
token adalah $)
Dalam kasus lain, state baru dibentuk sebagai berikut :
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
tersebut dengan [B., b]
3. Jika input berikut bukan dua kasus diatas maka beri penjelasan error
Contoh :
42 | P a g e
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
program yang diterjemahkan.
analisis semantik dapat dibagi menjadi dua kategori :
Pertama adalah analisis program yang dibutuhkan oleh aturan bahasa pemrograman
untuk memberikan kebenaran dan menjamin pelaksanaan yang tepat berdasarkan
aturan.
Kedua, kategori analisis adalah analisis yang dilakukan oleh compiler untuk
meningkatkan efisiensi pelaksanaan program penerjemah.
ATRIBUT DAN ATRIBUT GRAMMAR
Atribut merupakan salah satu pembentuk konstruksi Bahasa pemrograman. Atribut
mengandung berbagai informasi, kompeksitas dan waktu proses eksekusi.
Contoh atribut :
1. Tipe data dan variable
2. Nilai dari suatu ekspresi
3. Lokasi variable pada memory
4. Kode objek dari sebuah prosedur
5. Jumlah digit yang signifikan dari sebuah angka
Proses komputasi atribut dan asosiasinya dihitung dengan nilai kontruksi Bahasa
yang disebut pengikat / binding
45 | P a g e
Atribut grammar
Jika X adalah sebuah grammar dan a adalah sebuah atribut yang dikaitkan dengan
X, maka ditulis X.a untuk nilai a binding dengan X.
atribut tata bahasa yang ditulis dalam bentuk tabel, dengan setiap aturan tata
bahasa yang terdaftar dengan persamaan atribut, atau aturan semantik yang
berhubungan dengan aturannya , sebagai berikut:
Contoh :
Tata bahasa berikut untuk unsigned number
46 | P a g e
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
(DAG). Contoh DAG untuk string 345o :
48 | P a g e
Contoh :
49 | P a g e
50 | P a g e
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
merupakan subset bilangan bulat dan operasi aritmatika seperti + dan *.
51 | P a g e
Type Checking
Type checking meliputi :
1. Deklarasi menyebabkan jenid identifier yang akan dimasukkan ke dalam tabel
symbol.
Contoh grammar berikut :
Terlihat bahwa types dari grammar diatas, memiliki struktur pohon yang disebut
dengan struktur Array :
2. Statement, tidak memiliki tipe data. Tapi bagian struktur harus diperiksa untuk
koreksi tipe data.
52 | P a g e
3. Ekspresi, seperti angka dan nilai Boolean (true dan false) akan dijelaskan
sebagai tipe integer dan Boolean
4. Overloading, periksaan operator, yang mana disebut overload apabila nama
operator yang sama digunakan untuk 2 atau lebiih operasi yang berbeda
53 | P a g e
INTERMEDIATE-CODE GENERATION
54 | P a g e
Triples
Sebuah triple hanya memiliki tiga bidang, yang disebut op, arg1, dan arg2
Contoh :
55 | P a g e
indirect triples
indirect triples terdiri dari daftar pointer ke Triple, contoh :
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
sebenarnya untuk mesin stack hipotetis, yang disebut p-mesin,dimana terjemahan
ditulis pada berbagai mesin yang sebenarnya.
Contoh :
p-code :
57 | P a g e
58 | P a g e