Anda di halaman 1dari 58

Teknik Kompilator

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

Gambar3. Struktur 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
menghasilkan output dalam bentuk :
(token-name, attribute-value)

Tahap 2 : Analisis sintaks / parsing


Tahap kedua compiler adalah analisis sintaks atau parsing. Parser menggunakan
komponen pertama dari token yang dihasilkan oleh penganalisis leksikal untuk
membuat representas intermediate seperti pohon yang menggambarkan struktur
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
sintaksis pada Gambar4.
Tahap 3. Analisis semantik
Analisa semantik menggunakan pohon sintaks dan informasi dalam tabel simbol
memeriksa program sumber untuk konsistensi semantik dengan Bahasa yang
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
masing-masing operator compiler yang memiliki operan. Sebagai contoh, banyak
3|Page

definisi bahasa pemrograman membutuhkan indeks array bertipe integer; compiler


harus melaporkan kesalahan jika angka floating-point digunakan untuk indeks array
tersebut.
Tahap 4 : Intermediate Code Generation
Dalam proses menerjemahkan program sumber ke target kode, compiler dapat
membangun satu atau lebih pernyataan intermediate, yang dapat memiliki berbagai
bentuk. Pohon sintaks adalah bentuk representasi intermediate; mereka biasanya
digunakan selama sintaks dan analisis semantik.
Setelah sintaks dan analisis semantik dari program sumber, banyak compiler
menghasilkan Bahasa tingkat rendah sacara eksplisit atau representasi intermediate
seperti mesin, yang bisa anggap sebagai program untuk mesin abstrak. Representasi
intermediate ini harus memiliki dua sifat penting: harus mudah untuk memproduksi dan
harus mudah untuk menerjemahkan ke dalam mesin target.
Tahap 5. Optimasi kode
Tahap optimasi kode mesin-independen untuk meningkatkan kode intermediate
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
intermediate gambar4 dengan menggunakan instruksi untuk setiap operator dalam
representasi pohon yang berasal dari analisa semantik.
Sebuah kode intermediate yang sederhana diukuti oleh optimasi akan menghasilkan
target kode yang baik.

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
istruksi intermediate adalah menterjemahkan kedalam deretan intruksi Bahasa mesin
yang melakukan tugas yang sama. Tugas yang utama code generation adalah
menugaskan register untuk menengani variable
Tahap Manajemen simbol-Table
Fungsi penting dari compiler adalah untuk mencatat nama-nama variabel yang
digunakan dalam program sumber dan mengumpulkan informasi tentang berbagai
masing-masing nama atribut.
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
menyimpan atau mengambil data dari record dengan cepat.

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

Begin, 10, nilai A =10, =

Writeln, Else, A

Delimite
Spasi, ; , enter

nilai A bukan 10

Untuk merepresentasikan sebuah analisis leksikal maka dilakukan pembentukan token


menggunakan ekspresi regular dan Finite state automata (FSA).
7|Page

Ekspresi Reguler (ER)


Digunakan untuk merepresentasikan pattern/ bentuk string untuk setiap karakter, dan
juga menjelaskan suatu set string.
Contoh :
Terdapat karakter dengan anggota = {a, b, c}. dimana nilai string yang
dihasilkan harus sekali b muncul.
Sehingga ER : (a|c)*b (a|c)*
Dengan nilai string yang kemungkinan muncul :
b, aba, aabc, ccbaca,

Ekspresi regular untuk programming


1. Pada program pascal, angka / digit terdiri dari decimal Contoh : 4578, 0933
Dapat dibuat ER :
Nama ER : nat
Anggota ER : 0..9
Sehingga ER : nat = [0..9]
2. Identifier terdiri dari semua karakter dari a..z,A..Z dan 0..9
Dengan kemungkinan kemunculan abc, aabcad, a01, Z09 dan lain-lain.
Nama ER : Letter

anggota :{a..z,A..Z}

Nama ER : Digit

anggota : {0..9}

Maka : Letter = [a..z,A..Z]


Digit = [0..9]
Sehingga : Identifier = Letter (Letter|digit)*
8|Page

Finite State Automata


Digunakan untuk menjelaskan proses terbentuknya pattern/ bentuk dari inputan string
dan juga dapat digunakan untuk konstruksi scanner.
Contoh :
1. FSA untuk Identifier = Letter (Letter|digit)*

2. FSA untuk floating point number.


Kemungkinan string yang akan muncul :

+ 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

Number digit | digit *

12

number digit digit

Digit 0|1||9

098

number digit digit digit

Catatan :
Tanda * berarti pengulangan

Ekspresi 12+098

Ekspresi

number

number
(12*4)

operator Ekspresi ( ekspersi ) |


ekspresi operator ekpresi |

Ekspresi (number operator number


Operator +|-|*

number)

(12*4)/2+1 Ekspresi (number operator Number digit | digit *


number)
number

11 | P a g e

number

operator Digit 0|1||9

Produksi CFG yang terbentuk adalah :


Ekspresi ( ekspersi ) | ekspresi operator ekpresi | number
Operator +|-|*
Number digit | digit *
Digit 0|1||9
ekspresi, operator, number, digit disebut nama struktur atau didalam automata
dikenal dengan variable
+, -, *, 0..9 disebut dengan simbol atau didalam automata dikenal dengan terrminal
Bentuk CFG dalam sebuah kompilator akan diubah menjadi bentuk BNF (Barcus Naur
Form )
Perbedaan bentuk CFG dan BNF
CFG

BNF

::=

merupakan nama struktur

bisa

berupa

struktur,
serangakain

nama
symbol,

simbol

atau

nama struktur
Nama struktur

Diapat dengan tanda < >

::=

12 | P a g e

Contoh :
Diberikan CFG
Exp ( exp ) | exp op exp | number
Op +|-|*
Number digit | digit *
Digit 0|1||9
Maka BNF :

<Exp> ::= ( <exp> ) | <exp> <op> <exp >| <number>


<Op> ::= +|-|*
<Number> ::= <digit> | <digit> *
<Digit> ::= 0|1||9

Selanjutnya untuk empermudah dalam proses parsing, maka CFG dan BNF dapat
dibentuk menjadi sederhana menjadi symbol-simbol yanglebig sederrhana.
CFG

BNF

Sederhana
CFG

Exp ( exp ) | exp <Exp> ::= ( <exp> ) | E ( E ) | E O E | N


op exp | number

<exp> <op> <exp >| O +|-|*

Op +|-|*

<number>

Number digit | <Op> ::= +|-|*

<E> ( <E> ) |
<E> <O> <E> |

ND|D*

<N>

D 0|1||9

<O> +|-|*
<N> <D> |

digit *

<Number>

Digit 0|1||9

<digit> | <digit> *

<D> *

<Digit> ::= 0|1||9

<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 op exp

[Exp exp op exp ]

> exp op number

[Exp number ]

> exp op digit*

[number digit* ]

> exp op 42

[digit 42 ]

> exp * 42

[op * ]

> (exp)* 42

[Exp (exp)]

> (exp op exp)* 42

[Exp exp op exp ]

> (exp op number)* 42

[Exp number ]

> (exp op digit)* 42

[number digit ]

14 | P a g e

> (exp op 3)* 42

[digit 3 ]

> (exp - 3)* 42

[op - ]

> (number - 3)* 42

[Exp number ]

> (digit* - 3)* 42

[number digit* ]

> (34 - 3)* 42

[digit 34 ]

Pohon Parsing / Parse Tree


Pohon parsing digunakan untuk menampilkan proses penurunan atu derivasi sebuah
string menuju terminal menggunakan pohon.
Pohon parsing yang sesuai dengan derivasi adalah pohon berlabel dimana bagian node
diberkan label nama struktur dan bagian daun untuk terminal/ symbol
Contoh

pohon

parsing untuk string


(34-3)*42

adalah

sebagai berikut :

15 | P a g e

Pengulangan / rekursif pada Grammar


pada grammar sering terjadi pengulangan yang disebut rekursif.
Dimana rekursif :

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

Top down parser


(TOP)

TOP with Full Backtracking

Brute force method

Bottom Up Parser (BUP)

TOP without Backtracking

Recursive descent parser

Operator Procedure Parser

Non recursive descent


(LL(1))

LR Parser

LR (0)

SLR (1)

LR(1)

LALR(1)

18 | P a g e

TOP DOWN PARSER


Menguraikan string berupa token dengan menelusuri langkah-langkah dalam derivasi
paling kiri (terkiri).
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
kiri untuk setiap string.
LL((1) menggunakan tumpukan / stack untuk melakukan parser.
Untuk menentukan Action dari sebuah parsing dapat dibentuk dengan sebuah tabel,
dengan aturan :
1. Menggantikan symbol nonterminal A pada stack paling atasdengan sebuah
string menggunakan aturan grammar yang dipilih A dan
2. Match / cocokan sebuah token pada stack paling atas dengan masukan token
berikutnya.
Contoh :

Pembentukan tabel parsing action LL(1) dengan string () :

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 :

Algortitma parsing LL(1) tabel M[N,T] :


1. Jika A adalah produksi yang dipilih dan terdapat derivasi =>*, dimana
adalah sebuah token, maka tambahkan A kedalam tabel M[A,]
2. Jika A adalah produksi yang dipilih dan terdapat derivasi =>*, dan
A. Dimana S adalah symbol awal dan adalah sebuah token
(atau

) maka tambahkan A kedalam tabel M[A,].

Tabel LL(1) parsing M[N,T] :

20 | P a g e

Kolom pertama menunjukkan dari tumpukam parsing


Kolom kedua menunjukkan input
Kolom ketiga mengubah stack dan juga kemungkinan input

EBNF pada LL(1)


Pengulangan pada LL(1) dapat mengakibatkan sebuah grammar tidak dapat digunakan
atau titolak. Untuk itu dilakukan penghilangn rekursif kiri, dengan cara :
1. Penghilangan rekursif kiri
2. Penghilangan faktor

1. Penghilangan rekursif kiri

21 | P a g e

Contoh :

Penghilangan rekursif kiri, dimana :

Dimana :

Produksi yang tidak memiliki rekursif kiri :

2. Penghilangan factor
Ketika dua atau lebih grammar yang memiliki bentuk :

Contoh :

Dimana : A = stmt-sequence, =stmt, = ; stmt-sequence


Produksi yang telah dilakukan penghilangan factor :

22 | P a g e

FIRST AND FOLLOW SET


Untuk membuat sempurna algoritma LL(1) maka buatlah tabel parsing LL(1), yang
menggunakan First dan Follow
First Set
Diberikan X sebuah symbol grammar atau maka first(x) didefinisikan sebagai berikut :
1. Jika X adalah sebuah terminal atau maka first(x)={X}
2. Jika X adalah sebuah nonterminal, maka untuk setiap produksi yang dipilih
XX1X2..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 :

Maka untuk menentukan first dari grammar diatas :


1. Tuliskan aturan produksi secara terpisah

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 :

Maka untuk follow dari grammar diatas :

24 | P a g e

RECURSIVE DESCENT PARSER


Menampilkan aturan grammar untuk sebuah nonterminal A sebagai definisi dari
sebuah procedure, yang dapat dikenal sebagai procedure A.
Algoritma proceudure Recursivedescent perser :
1. Sisi kanan dari produksi A merupakan struktur kode untuk procedure.
2. Urutan terminal dan nonterminal sesuai dengan input dan memanggil
procedure lainnya,
Jika bertemu terminal maka lakukan pemilihan sesuai dengan kode (if dan
case).
Jika bertemu nonterminal maka panggil procedure dengan nama yang sama
dengan nama nonterminal

Contoh :
Diberikan sebuah grammar berikut:

Maka pseudocode untuk factor :

25 | P a g e

Dimana pseudocode untuk procedure match :

Error Recovery pada Top Down Parser


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.
Beberapa algortima heuristic untuk panic mode :
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
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

Dimana input yang salah adalah ) id * + id

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

Operator Grammar yang bukan operator grammar

grammar

E E A E | ( E ) | - E | id

E E + E | E * E | ( E ) | id

A+|-|*|/|^

Algoritma membuat tabel Operator Precedence Parsing :


1. Buatlah tabel M[Ni,Nj] dimana N adalah operator
2. Bandingkan I dan j :

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

Bottom up dengan operator precedence :


$ dengan id tanda < maka push id

Id

Id dengan + tanda > maka pop id

Id +

$ dengan + tanda > maka push +

Id

Id +

$

id

Id +

Id +

$

+ dengan id tanda < maka push id

id dengan * tanda > maka pop id


id

Id +

32 | P a g e

id

+ dengan * tanda < maka push *

Id +

id *

Id +

Id

Id +

id *

* dengan id tanda < maka push id

Id +

Id +

id *

id

Id *

id dengan $ tanda > maka pop id

id $

Id +

Id *

Id +

id *

id $

Id +

33 | P a g e

Id *

Id

* dengan $ tanda > maka pop *

Id

+ dengan $ tanda > maka pop +

$ dengan $ berhenti, diterima

Hubungan operator pada tabel perbandingan :


Digunakan untuk menentukan urutan level operator paling tinggi dan terendah.
Menggunakan persamaan fungsi.
1. Tentukan dahulu fungsi berdasarkan kolom dan baris
2. Bandingkan dua fungsi, apabila fungsi pertama lebih besar dari fungus kedua,
maka fungsi dua menuju fungsi satu.
Contoh :

34 | P a g e

grafik yang merepresentasikan fungsi precedence :

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 :

Grammar tesebut memiliki 3 produksi yang dipilih dan 8 item :

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 :

Transisi dari grammar diatas :

Algoritma LR(0) untuk tabel parse :


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
kedalam stack yang berisi AX.
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 .

Reduksi aturan S S, dimana S adalah state awal yag diterima, memberikan


input kosong dan pesan kesalahn apabila input tidak kosong.
Contoh :

Transisi grammar :

Tabel Action parser dengan string ((a))

38 | P a g e

Tabel LL(0) parser dengan string ((a))

SLR(1) parsing / simple LR(1) parsing


Algoritma SLR(1) parsing :
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 SS, dimana S adalah state awal, maka aturan
diterima apabila input berikutnya adalah $.
Dalam beberapa kasus, state baru dihitung sebagai berikut :
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
BA.
3. Jika input berikutnya bukan kedua kasus diatas, maka beri penjelasan error
Algoritma SLR(!) di gunakan apabila :

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 :

Transisi LR(0) parsing

Membuat nomor untuk skema tabel dimana :


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

Langkah transisi Parsing tabel LR(1)

42 | P a g e

Hasil Transisi LR(1)

LALR(1) PARSING / LOOKAHEAD-LR PARSING


LALR didasarkan pada pengamatan bahwa, dalam banyak kasus pembentukan transisi
LR1 adalah karena sebagian adanya banyak state yang berbeda yang memiliki set
yang sama komponen pertamanya (pada lookaheads simbol).
inti dari keadaan transisi dari LR (1) item adalah himpunan LR (0) item yang terdiri dari
komponen-komponen pertama LR (1) di state.
Untuk membentuk transisi LALR(1) dari LR(1) ada 2 prinsip yang harus diperhatikan :
1. Transisi dari LR(1) merupakan transisi dari LR(0)
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
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

Pembentukan grammar rules :

46 | P a g e

Sehingga tabel analisis semantic :

Pohon parsing untuk string 345 pada analisis semantic :

Algoritma komputasi atribut menggunakan dependency graph dan Evaluation


order.
Diberikan sebuah grammar, dimana memiliki aturan dependency graph, setiap graph
memiliki node yang dilabelkan sebagai atribut dengan aturan sebagai berikut :

Sehingga grammar berikut yang memiliki atribut :


47 | P a g e

Dapat dibuat aturan dependency graph :

Atau (karena dependency graph menghilangkan subkrip untuk symbol yang berulang
karena reperensi graph jelas membedakan kejadian yang berbeda sebagai node yang
berbeda )

Sehingga string 345, dependency graph nya sebagai berikut :

Diketahui bahwa grafik harus acyclic, maka graph juga bersifat directed acyclic graph
(DAG). Contoh DAG untuk string 345o :

48 | P a g e

SYMBOL TABLE / Tabel simbol


Symbol table dalam kompilator adalah sebauh struktur data tipe kamus data,degna 3
operator yairu insert, lookup dan delete.
Struktur dari tabel symbol / tabel hash adalah sebagai berikut :

Contoh :

49 | P a g e

Maka tabel simbol untuk procedure f :


Tabel symbol sebelum deklarasi procedure f

tabel symbol setelah deklarasi pada 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
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 :

Apabila yang akan di check adalah :

Maka Action semantic analisis nya :

Terlihat bahwa types dari grammar diatas, memiliki struktur pohon yang disebut
dengan struktur Array :

Dapat dibuat pohon untuk 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

Gambar struktur logika dari sebauh kompilator (frond end)

Gambar sebuah kompilator yang digunakan untuk merepresentasikan intermediate

Three- Address Code


Pada Three- Address Code, operator pada sisi sebelah kanan akan terbentuk
menjadi 3 alamat intruksi, miaslkan x+y*x akan menjadi :

Dimana t1 dan t2 adalah nama sementara untuk tempat penyimpanan data.


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'
arg2, dan hasilnya/ result.
Contoh :
menjadi :

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 :

Static Single-Assignment Form / SSA


(SSA) merupakan representasi intermediated yang dapat memfasilitasi optimasi kode
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.

Gambar posisi code generator dalam kompilator

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 :

Diketahui grammar sebagi berikut :

57 | P a g e

Maka akan dibentuk sintesis string (x=x+3)+4 atribut, dari p-code :

58 | P a g e

Anda mungkin juga menyukai