03. KOMPILATOR LINTAS TUNGGAL - Teknik Kompilasi.zip
¾ 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.
penerjemah
rangkaian analisis rangkaian representasi
berdasarkarakter token antara
leksikal sintaksGambar 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 satu
¾ perintah 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 yang digunakan untuk kompilator lintas tunggal sederhana adalah tatabahasa bebas konteks.
¾ 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 ) stmt else 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.)
4. Salah satu dari unsur non-terminal yang telah ditentukan disebut sebagai simbol awal.
¾ 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
yang memisahkan pilihan bagian kanan yang menggunakan tanda ada. Tanda dapat dibaca sebagai "atau".
Contoh: Ada beberapa produksi sbb.:
⇒ list + digit
list
⇒ list - digit
list
⇒ digit
list
⇒ 0 1 2 3 4 5 6 7 8 9
digit
produksi-produksi tersebut dapat dikelompokkan menjadi satu produksi yang setara yaitu: ⇒ list + digit list - digit digit
list
¾ 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
list ⇒ digit 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.: ⇒ digit.
1) 9 adalah list karena 9 adalah suatu angka dari produksi list 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.:
list list digit list digit list
9
5
2
Pohon Urai
P ohon urai menggambarkan bagaimana suatu simbol awal dari suatu
tatabahasa menyebabkan timbulnya suatu rangkaian dalam suatu bahasa.
Sebagai contoh, bila suatu unsur bukan terminal A mempunyai produksi
→XYZ, maka pohon urai tersebut akan mempunyai suatu nodal A dalam (internal node) yang diberi label A dengan tiga buah anak yang diberi label X, Y dan Z.
A
X Z Y Gambar 3.3. Contoh sebuah pohon urai. 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 X , X , ...X adalah label anak-anak dari nodal
1 2 n
→ X tersebut dari kiri ke kanan, maka A X ......X adalah suatu
1 2 n produksi.
Tatabahasa yang Berarti Ganda
T atabahasa yang berarti ganda adalah bahwa tatabahasa ini dapat memberikan 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
list list list list list list
list list list list
2
9
5
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 aritmetik
yaitu 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 lebih
diutamakan 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) bukan 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.
Berikan contoh.
10.