Anda di halaman 1dari 6

Teknik Kompilasi

Nama : Marco Simanjaya


Nim : 1301014546
Kelas : 06PNT
Syntax Analyzer
Analyzer sintaks juga dikenal sebagai parser dan mempunyai struktur pohon parsing.
Alat analisis sintaks (parser) memeriksa apakah suatu program sumber tertentu memenuhi aturan
oleh tata bahasa bebas konteks atau tidak.
- Jika memenuhi, parser menciptakan pohon parsing dari program itu.
- Jika tidak, maka parser memberikan pesan kesalahan.
Sebuah tata bahasa bebas konteks
- Memberikan spesifikasi sintaksis yang tepat dari bahasa pemrograman.
- Desain tata bahasa merupakan tahap awal dari desain kompilator.
- Tata bahasa dapat langsung diubah menjadi parser oleh beberapa alat.
Parser
Parser bekerja pada aliran token.
Item yang terkecil adalah token.




Parser dikategorikan menjadi dua kelompok:
1) Top-Down Parser - pohon parse dibuat atas ke bawah, dimulai dari root.
2) Bottom-Up Parser pohon parse dibuat bawah ke atas, mulai dari daun
Kedua parser top-down dan bottom-up menerima masukan dari kiri ke kanan (satu persatu
symbol yang diterima).
Parser top-down dan bottom-up yang efisien dapat diimplementasikan hanya untuk sub-kelas tata
bahasa bebas konteks.
- LL untuk top-down parsing
- LR untuk bottom-up parsing


Context-Free Grammars
Struktur inheren rekursif dari bahasa pemrograman yang didefinisikan oleh tata bahasa
bebas konteks.

Dalam tata bahasa bebas konteks, kita memiliki:
Satu set terbatas terminal (dalam kasus kami, ini akan menjadi himpunan token)
Sebuah himpunan berhingga non-terminal (sintaksis-variabel)
Sebuah himpunan berhingga aturan produksi dalam bentuk berikut
A o dimana A adalah non-terminal dan o adalah string terminal dan non-terminal
(termasuk string kosong)
Sebuah simbol awal (salah satu simbol non-terminal)
Contoh:
E E + E | E E | E * E | E / E | - E
E ( E )
E id
Derivations
E E+E
E+E berasal dari E
kita dapat mengganti E oleh E + E
untuk dapat melakukan hal ini, kita harus memiliki aturan produksi EE+E
dalam tata bahasa kita.
E E+E id+E id+id
Urutan pengganti non-terminal simbol disebut turunan dari id + id dari E.
Secara umum langkah derivasi adalah
oA| o| jika ada aturan produksi A dalam tata bahasa kita
Dimana o dan | adalah string sewenang-wenang dan non terminal-terminal simbol
o
1
o
2
... o
n
(o
n
berasal dari o
1
or o
1
berasal o
n
)




CFG - Terminology
L (G) adalah bahasa dari G (bahasa yang dihasilkan oleh G) yang merupakan seperangkat
kalimat.
Sebuah kalimat dari L (G) adalah string dari simbol terminal G.
Jika S adalah simbol awal dari G maka
e adalah kalimatL(G) iff S e dimana e adalah string terminal G.
Jika G adalah tata bahasa bebas konteks, L (G) adalah bahasa bebas konteks.
Dua tata bahasa yang setara jika mereka menghasilkan bahasa yang sama.
S o
- jika o berisi non-terminal, hal itu disebut sebagai bentuk sentensial G.
- jika o idak berisi non-terminal, hal itu disebut sebagai hukuman dari G.
Derivation Example
E -E -(E) -(E+E) -(id+E) -(id+id)
OR
E -E -(E) -(E+E) -(E+id) -(id+id)
Pada setiap langkah derivasi, kita dapat memilih salah satu non-terminal dalam bentuk
sentensial dari G untuk penggantian.

Jika kita selalu memilih paling kiri non-terminal di setiap langkah derivasi, penurunan ini
disebut sebagai paling kiri derivasi.

Jika kita selalu memilih yang benar-sebagian besar non-terminal di setiap langkah derivasi,
penurunan ini disebut sebagai paling kanan derivasi.
Left-Most and Right-Most Derivations
Left-Most Derivation
E -E -(E) -(E+E) -(id+E) -(id+id)
Right-Most Derivation
E -E -(E) -(E+E) -(E+id) -(id+id)
Kita akan melihat bahwa top-down parser mencoba untuk menemukan derivasi paling kiri
dari program sumber tertentu.
Kita akan melihat bahwa bottom-up parsing mencoba untuk menemukan derivasi paling
kanan dari program sumber yang diberikan dalam urutan terbalik.

Ambiguity Operator Precedence
Ambiguous grammars (because of ambiguous operators) can be disambiguated according to
the precedence and associativity rules.
E E+E | E*E | E^E | id | (E)
disambiguate the grammar precedence:
T T*F | F ^ (right to left)
T T*F | F * (left to right)
F G^F | G + (left to right)
G id | (E)
Parse Tree
Node dalam dari pohon parse non-terminal simbol.
Daun dari pohon parse adalah simbol terminal.
Sebuah pohon parsing dapat dilihat sebagai representasi grafis dari sebuah derivasi.
-(E) -(E+E) -(id+id)
Ambiguity
E E+E id+E id+E*E id+id*E id+id*id
E E*E E+E*E id+E*E id+id*E id+id*id
Untuk parser paling, tata bahasa harus tidak ambigu.
jelas tata bahasa => unik pemilihan pohon parsing untuk kalimat kita harus menghilangkan
ambiguitas dalam tata bahasa selama tahap desain compiler.
Sebuah tata bahasa jelas harus ditulis untuk menghilangkan ambiguitas.
Kita harus memilih salah satu pohon parse kalimat (yang dihasilkan oleh tata bahasa ambigu)
disambiguate tata bahasa yang membatasi untuk pilihan ini.

Left Recursion
Sebuah tata bahasa yang tersisa rekursif jika memiliki non-terminal A seperti yang ada
turunan. A Ao untuk beberapa string o
Top-down teknik parsing tidak dapat menangani kiri rekursif tata bahasa.
Jadi, kita harus mengkonversi kiri rekursif tata bahasa kita menjadi setara tata bahasa
yang tidak rekursif kiri.
Rekursi kiri mungkin muncul dalam satu langkah dari derivasi (langsung kiri rekursi),
atau mungkin muncul dalam lebih dari satu langkah derivasi.
Left-Recursion -- Problem
Tata bahasa A tidak dapat segera kiri rekursif, tetapi masih dapat kiri rekursif.
Dengan hanya menghilangkan rekursi kiri-cepat, kita tidak mungkin mendapatkan tata
bahasa yang tidak rekursif kiri.
S Aa | b
A Sc | d Tata bahasa ini tidak segera kiri rekursif,
S Aa Sca tetapi masih kiri-rekursif.
A Sc Aac atau penyebab ke left-recursion
Jadi, kita harus menghilangkan semua kiri recursions dari tata bahasa kita
Eliminate Left-Recursion Example
S Aa | b
A Ac | Sd | f
- Urutan non-terminal : S, A
untuk S:
- Kita tidak masuk inner loop.
- Tidak ada rekursi kiri langsung di S.
Untuk A: gantikan A Sd dengan A Aad | bd
Jadi, kita akan memiliki A Ac | Aad | bd | f
- Hilangkan segera kiri rekursi di A
A bdA

| fA



A

cA

| adA

| c
Jadi, tata bahasa yang dihasilkan setara yang tidak rekursif kiri adalah: S Aa | b
A bdA

| fA



A

cA

| adA

| c
Left-Factoring
Sebuah parser prediktif (parser top-down tanpa backtracking) menegaskan bahwa tata
bahasa harus kiri diperhitungkan.
tata bahasa => setara tata bahasa baru yang cocok untuk parsing prediktif
stmt if expr then stmt else stmt |if expr then stmt
ketika kita melihat apakah kita bisa tidak sekarang aturan produksi yang memilih untuk
menulis ulang stmt dalam derivasi.
In general,
A o|
1
| o|
2
dimana o tidak kosong dan simbol pertama dari
|
1
dan |
2
(jika mempunyai 1) berbeda.
saat memproses o kita tidak dapat mengetahui apakah memperluas
A to o|
1
or A to o|
2

Tapi, jika kita menulis ulang tata bahasa sebagai berikut :
A oA



A |
1
| |
2
jadi, kita langsung dapat memperluas A to oA
Left-Factoring Algorithm
Untuk setiap A non-terminal dengan dua atau lebih alternatif (aturan produksi) dengan
awalan tidak kosong umum
A o|
1
| ... | o|
n
|
1
| ... |
m

ubah menjadi
A oA

|
1
| ... |
m

A

|
1
| ... | |
n

Non-Context Free Language Constructs
Ada beberapa konstruksi bahasa dalam bahasa-bahasa pemrograman yang tidak bebas
konteks. Ini berarti bahwa, kita tidak bisa menulis tata bahasa bebas konteks untuk
konstruksi-konstruksi.
L1 = { ece | e is in (a|b)*} tidak bebas konteks
menyatakan sebuah identifier dan memeriksa apakah itu dinyatakan atau tidak nanti.
Kami tidak bisa melakukan ini dengan bahasa bebas konteks. Kita perlu analisa semantik
(yang tidak bebas konteks).
L2 = {a
n
b
m
c
n
d
m
| n>1 and m>1 } tidak bebas konteks
mendeklarasikan dua fungsi (satu dengan parameter n, yang lain dengan parameter
m), dan kemudian menyebut mereka dengan parameter aktual.