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 E÷E+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.

Context-Free Grammars • Struktur inheren rekursif dari bahasa pemrograman yang didefinisikan oleh tata bahasa bebas konteks. kita memiliki: Satu set terbatas terminal (dalam kasus kami.  n (n berasal dari 1 or 1 berasal n ) . E  E+E  id+E  id+id • • • Urutan pengganti non-terminal simbol disebut turunan dari id + id dari E. Dalam tata bahasa bebas konteks.. kita harus memiliki aturan produksi EE+E dalam tata bahasa kita. ini akan menjadi himpunan token) Sebuah himpunan berhingga non-terminal (sintaksis-variabel) Sebuah himpunan berhingga aturan produksi dalam bentuk berikut • • • A   dimana A adalah non-terminal dan  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. Secara umum langkah derivasi adalah A   jika ada aturan produksi A dalam tata bahasa kita Dimana  dan  adalah string sewenang-wenang dan non terminal-terminal simbol 1  2  ..

jika  berisi non-terminal. 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.jika  idak berisi non-terminal. S . L (G) adalah bahasa bebas konteks. • • • • . kita dapat memilih salah satu non-terminal dalam bentuk sentensial dari G untuk penggantian. Sebuah kalimat dari L (G) adalah string dari simbol terminal G. hal itu disebut sebagai bentuk sentensial G. Jika kita selalu memilih yang benar-sebagian besar non-terminal di setiap langkah derivasi. hal itu disebut sebagai hukuman dari G. Dua tata bahasa yang setara jika mereka menghasilkan bahasa yang sama. 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. Jika kita selalu memilih paling kiri non-terminal di setiap langkah derivasi. .Terminology • L (G) adalah bahasa dari G (bahasa yang dihasilkan oleh G) yang merupakan seperangkat kalimat. Jika S adalah simbol awal dari G maka  adalah kalimatL(G) iff S   dimana  adalah string terminal G. penurunan ini disebut sebagai paling kiri derivasi. penurunan ini disebut sebagai paling kanan derivasi.CFG . Jika G adalah tata bahasa bebas konteks.

Sebuah pohon parsing dapat dilihat sebagai representasi grafis dari sebuah derivasi. Left Recursion • • Sebuah tata bahasa yang tersisa rekursif jika memiliki non-terminal A seperti yang ada turunan. Sebuah tata bahasa jelas harus ditulis untuk menghilangkan ambiguitas. Ambiguity – Operator Precedence • Ambiguous grammars (because of ambiguous operators) can be disambiguated according to the precedence and associativity rules.  -(E)  -(E+E)  -(id+id) disambiguate the grammar precedence: ^ (right to left) * (left to right) + (left to right) 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. E  E+E | E*E | E^E | id | (E)  T  T*F | F T  T*F | F F  G^F | G G  id | (E) Parse Tree • • • Node dalam dari pohon parse non-terminal simbol. . 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.• Kita akan melihat bahwa bottom-up parsing mencoba untuk menemukan derivasi paling kanan dari program sumber yang diberikan dalam urutan terbalik. Daun dari pohon parse adalah simbol terminal. Kita harus memilih salah satu pohon parse kalimat (yang dihasilkan oleh tata bahasa ambigu) disambiguate tata bahasa yang membatasi untuk pilihan ini. A  A untuk beberapa string  Top-down teknik parsing tidak dapat menangani kiri rekursif tata bahasa.

Rekursi kiri mungkin muncul dalam satu langkah dari derivasi (langsung kiri rekursi). tata bahasa yang dihasilkan setara yang tidak rekursif kiri adalah: A  bdA’ | fA’ A’  cA’ | adA’ |  S  Aa | b Left-Factoring Sebuah parser prediktif (parser top-down tanpa backtracking) menegaskan bahwa tata bahasa harus kiri diperhitungkan.Hilangkan segera kiri rekursi di A A  bdA’ | fA’ A’  cA’ | adA’ |  Jadi. Dengan hanya menghilangkan rekursi kiri-cepat.Urutan non-terminal : S. kita tidak mungkin mendapatkan tata bahasa yang tidak rekursif kiri.Problem • • Tata bahasa A tidak dapat segera kiri rekursif.• • Jadi. . kita akan memiliki A  Ac | Aad | bd | f . atau mungkin muncul dalam lebih dari satu langkah derivasi. kita harus menghilangkan semua kiri recursions dari tata bahasa kita Eliminate Left-Recursion – Example S  Aa | b A  Ac | Sd | f .Kita tidak masuk inner loop. atau penyebab ke left-recursion Jadi. kita harus mengkonversi kiri rekursif tata bahasa kita menjadi setara tata bahasa yang tidak rekursif kiri. Left-Recursion -. Untuk A: gantikan A  Sd dengan A  Aad | bd Jadi. A untuk S: .Tidak ada rekursi kiri langsung di S. tetapi masih dapat kiri rekursif. tetapi masih kiri-rekursif. S  Aa | b A  Sc | d S  Aa  Sca A  Sc  Aac • Tata bahasa ini tidak segera kiri rekursif. .

.. jika kita menulis ulang tata bahasa sebagai berikut Non-Context Free Language Constructs • Ada beberapa konstruksi bahasa dalam bahasa-bahasa pemrograman yang tidak bebas konteks. | n jadi. Kami tidak bisa melakukan ini dengan bahasa bebas konteks. L1 = { c |  is in (a|b)*} tidak bebas konteks •  menyatakan sebuah identifier dan memeriksa apakah itu dinyatakan atau tidak nanti. • In general. | m A’  1 | . | m ubah menjadi A  A’ | 1 | . • L2 = {anbmcndm | n1 and m1 } tidak bebas konteks  mendeklarasikan dua fungsi (satu dengan parameter n.. Kita perlu analisa semantik (yang tidak bebas konteks). dan kemudian menyebut mereka dengan parameter aktual. kita tidak bisa menulis tata bahasa bebas konteks untuk konstruksi-konstruksi.. kita langsung dapat memperluas A to A’ or A to 2 : Tapi.. • saat memproses  kita tidak dapat mengetahui apakah memperluas A to 1 • A  A’ A’  1 | 2 Left-Factoring – Algorithm • Untuk setiap A non-terminal dengan dua atau lebih alternatif (aturan produksi) dengan awalan tidak kosong umum A  1 | .. | n | 1 | ... Ini berarti bahwa. .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. A  1 | 2 dimana  tidak kosong dan simbol pertama dari 1 dan 2 (jika mempunyai 1) berbeda. yang lain dengan parameter m).

Sign up to vote on this title
UsefulNot useful