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 Konstanta Operator Delimite

IF, Then, Begin, 10, ‘ nilai A =10’, = Spasi, ; , enter

Writeln, Else, A ‘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 1 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 operator Ekspresi → ( ekspersi ) |

number ekspresi operator ekpresi |

(12*4) Ekspresi → (number operator number

number) Operator → +|-|*

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

number) number operator Digit → 0|1|…|9

number

11 | P a g e
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 nama

struktur, symbol,

serangakain 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 mempermudah dalam proses parsing, maka CFG dan BNF dapat

dibentuk menjadi sederhana menjadi symbol-simbol yang lebih sederrhana.

CFG BNF Sederhana

CFG BNF

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

op exp | number <exp> <op> <exp >| O → +|-|* <E> <O> <E> |

Op → +|-|* <number> N→D|D* <N>

Number → digit | <Op> ::= +|-|* D → 0|1|…|9 <O> ::=+|-|*

digit * <Number> ::= <N> ::= <D> |

Digit → 0|1|…|9 <digit> | <digit> * <D> *

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

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

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, dibutuhkan 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 Bottom Up Parser (BUP)


(TOP)

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

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

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 :

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 B→αAγ maka first(γ) = {ɛ} dimana terdapat dalam

follow(A)

3. Jika terdapat produksi B→αAγ 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

E $ dengan + tanda > maka “push” +



Id +
↑ ↑

$ Id

E + dengan id tanda < maka “push” id



Id + id
↑ ↑ ↑

$ Id +

E id dengan * tanda > maka “pop” id



Id + id
↑ ↑ ↑

$ Id + id

32 | P a g e
E E
↑ ↑
+ dengan * tanda < maka “push” *
Id + id *
↑ ↑ ↑ ↑

$ Id + Id

E E * dengan id tanda < maka “push” id


↑ ↑

Id + id * id
↑ ↑ ↑ ↑ ↑

$ Id + Id *

E E id dengan $ tanda > maka “pop” id


↑ ↑

Id + id * id $
↑ ↑ ↑ ↑ ↑ ↑

$ Id + Id * Id

E E E * dengan $ tanda > maka “pop” *


↑ ↑ ↑

Id + id * id $
↑ ↑ ↑ ↑ ↑ ↑

$ Id + Id * Id

33 | P a g e
+ 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 :

gid→f*→g*→f*→g+→f$

fid→g*→f+→g+→f$

sehingga didapat prioritas operator dari tertinggi hingga ke rendah adalah :

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,

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 A→αX.β

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 S’→S, 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

B→αA.β

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 [A→αX.β,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
S’→S, 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