03. KOMPILATOR LINTAS TUNGGAL
¾ Kebanyakan kompilator untuk bahasa yang terstruktur melakukan
beberapa kali pembacaan program sumber untuk :
o dapat melakukan deteksi kesalahan,
o menemukan kembali kesalahan yang diperoleh, o melakukan proses debugging.
¾ Berdasarkan cara pembentukan dan tugas fungsionalnya, suatu
kompilator dapat dikelompokkan ke dalam beberapa klasifikasi, yaitu:
– kompilator lintas tunggal (single pass),
– kompilator lintas jamak (multi pass),
– kompilator muat-dan-jalan (load-and-go) dan lain sebagainya.
¾ Kompilator lintas tunggal (single pass compiler) adalah suatu
kompilator yang dibuat hanya dengan melakukan satu kali pembacaan program sumber (single pass). Kompilator yang demikian tidak dapat melakukan optimasi kode dengan baik ataupun error recovery ataupun
error correction.
¾ Kompilator lintas jamak (multi pass compiler) adalah suatu kompilator
lengkap sedangkan kompilator load and go adalah kompilator yang
diselesaikan secara tuntas setiap diperoleh bagian terkecil dari bahasa sumber.
¾ Walaupun demikian, berbagai ragam kompilator untuk bahasa
pemrograman yang berbeda dan tugas fungsional yang berbeda, pada dasarnya dapat dibuat dengan cara yang hampir sama.
¾ Kompilator lintas tunggal yang paling sederhana merupakan bagian
depan (front end)dari suatu kompilator yang komplit, yaitu terdiri dari : - analisis leksikal,
- penguraian (parser), dan - pembentukan kode antara.
Gambar 3.1. Struktur bagian depan suatu kompilator
¾ Pada struktur di atas, penerjemah berdasar sintak merupakan kombinasi dari proses analisis sintak dan pembentukan kode antara.
¾ Sebagai contoh kompilator lintas tunggal sederhana adalah kompilator yang digunakan untuk menerjemahkan suatu ekspresi matematika yang ditulis dalam notasi infix menjadi ekspresi matematika dalam notasi
postfix.
¾ Notasi infix adalah notasi dimana operator dari suatu ekspresi terdapat di antara kedua argumen yang ada.
¾ Notasi postfix adalah notasi di mana operator dari suatu ekspresi terdapat di belakang kedua argumen yang ada.
Contoh:
notasi infix : 9-5+2 notasi postfix : 95-2+
¾ Sintaks suatu program dapat ditentukan dengan menggunakan
tatabahasa yang bebas konteks (context-free grammars), tatabahasa ini juga berguna untuk membantu penerjemahan suatu program.
¾ Tatabahasa yang bebas konteks adalah aturan bahasa yang tidak
bergantung pada struktur bahasa pemrograman tertentu.
¾ Teknik kompilasi yang berorientasi pada kaidah tatabahasa dikenal
dengan nama penerjemahan berdasarkan sintaks (syntax-directed translation).
Pengertian Sintaks
¾
S
intaks adalah bagian dari tatabahasa yang mengungkapkan satuperintah atau pengertian tertentu. Sedangkan tatabahasa adalah aturan yang mengikat dalam struktur susunan suatu bahasa.
¾ Di dalam teknik kompilasi kita kenal empat macam tatabahasa, yaitu:
o tatabahasa umum atau tatabahasa tanpa batasan (type 0 grammars -
unrestricted grammars),
o tatabahasa peka konteks (type 1 grammars - context-sensitive
grammars),
o tatabahasa bebas konteks (type 2 grammars - context-free
grammars),
o tatabahasa regular (type 3 grammars - regular grammars).
¾ Tatabahasa bebas konteks secara alamiah menerangkan struktur hirarki dari banyak bentuk bahasa pemrograman.
Contoh: perintah if-else
- dalam bahasa Pascal mempunyai bentuk
if ( ekspresi ) then perintah else perintah
- dalam bahasa C mempunyai bentuk
if ( ekspresi ) perintah else perintah
¾ Dalam hal ini suatu perintah adalah merupakan gabungan dari
o kata baku if, o kurung buka, o ekspresi, o kurung tutup, o perintah, o kata baku else
o dan perintah yang lain.
Bila variabel expr = ekspresi, variabel stmt = perintah,
maka struktur aturan tersebut dapat dinyatakan sbb.:
stmt⇒ if ( expr ) stmtelse stmt
di mana tanda panah tersebut dibaca sebagai "dapat berbentuk suatu".
Aturan penulisan seperti ini disebut sebagai produksi (production).
¾ Dalam hal ini unsur leksikal seperti kata baku if dan tanda kurung disebut sebagai unsur-unsur terminal, sedangkan token variabel seperti expr dan stmt disebut sebagai unsur-unsur non-terminal.
¾ Secara lengkap suatu tatabahasa bebas konteks dapat mempunyai empat komponen berikut ini:
1. Himpunan dari token yang dikenal dengan nama simbol token. 2. Himpunan dari unsur non-terminal.
3. Himpunan dari produksi.
(Setiap produksi terdiri dari unsur non-terminal di bagian kiri, tanda panah, dan barisan token dan/non-terminal di bagian kanan.)
¾ Aturan umum dalam menentukan tatabahasa adalah:
1. Tuliskan produksi yang ada dengan dimulai dari produksi yang mengandung simbol awal.
2. Angka-angka, tanda-tanda (operator) seperti <=, dan kata baku seperti while dll. adalah unsur terminal.
3. Nama-nama variabel adalah unsur non-terminal, dan akan dicetak miring.
¾ Produksi-produksi yang mempunyai simbol non-terminal di sebelah kiri yang sama, bagian kanannya dapat dikelompokkan dengan
menggunakan tanda yang memisahkan pilihan bagian kanan yang
ada.
Tanda dapat dibaca sebagai "atau".
Contoh:
Ada beberapa produksi sbb.:
list ⇒ list + digit list ⇒ list - digit list ⇒ digit
digit ⇒ 0 1 2 3 4 5 6 7 8 9
produksi-produksi tersebut dapat dikelompokkan menjadi satu produksi yang setara yaitu:
list ⇒ list + digit list - digit digit
¾ Menurut definisi, maka token dari tatabahasa yang digunakan adalah: + - 0 1 2 3 4 5 6 7 8 9
sedangkan unsur non-terminal adalah yang dicetak miring seperti list
dan digit.
¾ Produksi-produksi tersebut disebut sebagai "produksi untuk unsur non-terminal", karena di bagian kiri produksi adalah unsur non-terminal.
¾ "Barisan token" adalah barisan dari nol atau lebih token. Unsur yang hanya mengandung nol token ditulis sebagai ε, dan disebut dengan nama barisan kosong.
Dari produksi
menunjukkan bahwa satu angka yang berdiri sendiri juga merupakan list.
Produksi-produksi berikut:
list ⇒list + list list ⇒ list - list
menyatakan bahwa list yang diikuti oleh tanda plus atau minus dan diikuti dengan list akan membentuk list baru.
¾ Cara penguraian ekspresi 9-5+2 dapat dilakukan sbb.:
1) 9 adalah list karena 9 adalah suatu angka dari produksi list⇒ digit. 2) 9-5 adalah list karena 9 dan 5 adalah list yang dihubungkan dengan
tanda minus.
3) 9-5+2 adalah list karena 9-5 dan 2 adalah list yang dihubungkan dengan tanda plus.
Dalam pohon urai dapat digambarkan sbb.:
Gambar 3.2. Pohon Urai
Pohon Urai
P
ohon urai menggambarkan bagaimana suatu simbol awal dari suatutatabahasa menyebabkan timbulnya suatu rangkaian dalam suatu bahasa.
Sebagai contoh, bila suatu unsur bukan terminal A mempunyai produksi
A →XYZ, maka pohon urai tersebut akan mempunyai suatu nodal
dalam (internal node) yang diberi label A dengan tiga buah anak yang diberi label X, Y dan Z.
Gambar 3.3. Contoh sebuah pohon urai. A
X Z Y
list
list digit list digit
list
Sifat-sifat pohon urai dari suatu tatabahasa bebas konteks, adalah sbb.:
1. Akar (root) dari pohon urai diberi label simbol awal 2. Setiap daun (leaf) dari pohon urai diberi label token atau ε
3. Setiap nodal dalam dari pohon urai diberi label unsur non-terminal
4. Bila A adalah suatu unsur non-terminal yang merupakan label dari suatu nodal dalam dan X1, X 2, ...X n adalah label anak-anak dari nodal
tersebut dari kiri ke kanan, maka A → X1X2...Xn adalah suatu
produksi.
Tatabahasa yang Berarti Ganda
T
atabahasa yang berarti ganda adalah bahwa tatabahasa ini dapatmemberikan lebih dari satu pohon urai.
Untuk aplikasi kompilasi harus dirancang suatu tatabahasa yang tidak mempunyai lebih dari satu arti, atau harus diciptakan aturan-aturan tatabahasa tambahan untuk menghilangkan kemungkinan timbulnya arti ganda.
Contoh:
Buatlah pohon urai dari ekspresi 9-5+2
Gambar 3.4. Pohon Urai
Kedua pohon urai di atas pada dasarnya berhubungan dengan dua cara pemberian tanda kurung pada ekspresi 9-5+2, yaitu (9-5)+2 dan 9-(5+2), yang masing-masing akan memberikan hasil yang berbeda.
Sifat Asosiatif dari Operator
P
ada kebanyakan bahasa pemrograman, keempat operator aritmetikyaitu penjumlahan, pengurangan, perkalian dan pembagian bersifat asosiatif kiri, yaitu apabila suatu bilangan berada diantara dua tanda
operator (misal +), maka bilangan tersebut akan menggunakan operator yang ada di sebelah kirinya. Sedangkan operator pemangkatan bersifat asosiatif kanan.
Contoh:
ekspresi 9+5+2 akan sama dengan (9+5)+2
bukan sama dengan 9+(5+2)
ekpresi 9**5**2 akan sama dengan (9**5)**2
bukan sama dengan 9**(5**2)
Urutan Pengutamaan Operator
(Presedensi dari Operator)
D
alam aritmetik biasa, operasi perkalian dan pembagian lebihdiutamakan terhadap operasi penjumlahan dan pengurangan, atau perkalian dan pembagian mempunyai presedensi yang lebih tinggi dari pada operasi penjumlahan dan pengurangan.
Pandang ekspresi 9+5.
Ada dua kemungkinan interpretasi dari ekspresi ini, yaitu (9+5) atau 9+(5). Untuk menghindari interpretasi ganda, perlu ditentukan urutan pengutamaan operator-operator yang digunakan.
Contoh:
Ekspresi 9+5*2 akan sama dengan 9+(5*2)
Pertanyaan Pendalaman Materi
1. Jelaskan apa yang dimaksud kompilator lintas tunggal (single pass compiler). Berikan contohnya.
2. Jelaskan beberapa klasifikasi atau kategori kompilator berdasarkan cara pembentukan dan tugas fungsionalnya.
3. Jelaskan mengapa kompilator untuk bahasa yang terstruktur
melakukan beberapa kali pembacaan program sumber.
4. Jelaskan apa yang dimaksud dengan notasi infix dan notasi postfix. Berikan contoh kedua notasi tersebut.
5. Jelaskan bagian-bagian utama kompilator lintas tunggal.
6. Jelaskan apa yang dimaksud dengan tatabahasa yang berarti ganda
(umbiguity grammar).
7. Jelaskan apa perbedaan antara sintaks dan tatabahasa. Berikan contoh masing-masing.
8. Jelaskan apa yang dimaksud dengan produksi dalam sebuah grammar.
Berikan contohnya.
9. Jelaskan apa yang dimaksud dengan pohon sintaks atau pohon urai.