Analisis Semantik Kode antara Pembangkit Kode Pertemuan kesebelas
Analisis Semantik, Kode antara, Pembangkit Kode Pertemuan kesebelas
Analisis Semantik Merupakan bagian terakhir dari tahapan analisis. Pada tahap ini dilakukan pengecekan pada struktur akhir yang telah diperoleh dan diperiksa kesesuaiannya dengan komponen program yang ada. Penganalisis semantik bekerja dengan memanfaatkan pohon sintaks yang telah dibuat oleh parser. Secara teoritis, proses analisis sintaks dan semantik adalah dua proses yang terpisah, tapi pada prakteknya hal itu sulit dilakukan karena kedua proses tsb sangat erat kaitannya dan sulit untuk dipisahkan.
Secara umum, fungsi penganalisis semantik adalah untuk menentukan makna dari serangkaian instruksi yang terdapat dalam program sumber. Misal untuk ekspresi : A : =(A+B)*(C+D) Maka penganalisis semantik harus mampu menentukan aksi apa yang akan dilakukan oleh operator-operator tsb. Untuk mengenali makna dari rangkaian simbol tsb, kompilator akan memanggil rutin semantik untuk menentukan aksi khusus yang dilakukan rangkaian simbol tsb. Untuk mengetahui maknanya, rutin ini akan mungkin memeriksa : • Apakah variabel yg ada sudah didefinisikan sebelumnya • Apakah variable-variabel tsb bertipe sama • Apakah operan yang akan dikerjakan tsb ada nilainya • dst
Pengecekan yang dilakukan oleh analisis semantik adalah : a Memeriksa keberlakuan nama-nama, meliputi : - Duplikasi Dilakukan pengecekan apakah terjadi pendefinisian sebuah nama/identifier lebih dari sekali Pengecekan dilakukan pd bgn pengelola blok - Terdefinisi Melakukan pengecekan apakah sebuah nama yang dipakai dalam blok program sudah terdifinisi atau blm. Pengecekan dilakukan pada semua tempat kecuali blok
b Memeriksa tipe melakukan pemeriksaan terhadap kesesuaian tipe dalam statement-statement yang ada. Misal bila terdapat suatu operasi, diperiksa tipe operannya. Misal ekspresi yang mengikuti instruksi IF berarti tipenya boolean, akan diperiksa tipe identifier dan tipe ekspresi. Bila ada operasi antara dua operan maka kedua operan harus bertipe sama
Kode Antara Merupakan hasil dari tahapan analisis, yang dibuat oleh kompilator pada saat menterjemahkan program dari bahasa tingkat tinggi. Kegunaan kode antara : • Untuk memperkecil usaha dalam membangun kompilator dari sejumlah bahasa ke sejumlah mesin. Dengan adanya kode antara yang lebih machine independent maka kode antara yang dihasilkan dapat digunakan lagi pada mesin lainnya • Proses optimasih lebih mudah dibanding dalam bahasa assembly atau mesin • Bisa melihat program internal yang mudah dimengerti
Notasi postfix Pada notasi postfix operator diletakkan paling akhir sehinga disebut juga notasi sufix atau reverse Polish. Sintax notasi postfix : <operan><operator> Contoh: ekspresi : (a+b) * (c+d) maka bentuk notasi postfix nya adalah : ab+cd+* *contoh lain dapat diberikan dgn bantuan pohon biner
Instruksi kontrol program yang ada juga dapat diubah ke dalam notasi postfix. Contoh: if<exp> then <stmt 1> else <stmt 2> Diubah kedalam notasi postfix : <exp><label 1>BZ<stmt 1><label 2>BR<stmt 2> Keterangan : BZ : branch if zero(zero=salah) bercabang atau lompat ke lokasi yang ditunjuk label 1 bila kondisi salah BR : branc (bercabang / lompat) tanpa syarat Jika exp salah maka instruksi akan locat ke lokasi yang ditunjuk label 1 dan menjalankan stmt 2, jika benar akan menjalankan stmt 1 dan kemudian loncat ke lokasi yang ditunjuk label 2
Implementasi kode antara Contoh : If a>b then c: =d Else c: =e Notasi 11 12 13 14 15 16 17 18 19 20 21 22 23 24 postfixnya : a b > 21 {label 1} BZ c d : = 24 {label 2} BR c e : =
Contoh lain : While <exp> Do <stat> Diubah ke Postfix : <exp> <label 1> BZ <stat> <label 2> BR
Contoh Instruksi a: =1 while a<5 do a: =a+1 Notasi postfixnya : 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 a 1 : = a 5 < 26 BZ a a 1 + : = 13 BR
Contoh lain buat notasi postfix untuk statement berikut : a : = 1 Repeat a: =a+1 Until a>5
Triples Notation Format : <oprator> <operan> Contoh, instruksi : A : = D * C + B/E Triples notation : 1. *, D, C 2. /, B, E 3. +, (1), (2) 4. : =, A, (3)
Contoh lain : if x > y then x: =a-b else x: = a+b 1. 2. 3. 4. 5. 6. 7. 8. >, x, y BZ, (1), (6) -, a, b : =, x, (3) BR, , (8) +, a, b : =, x, (6)
Contoh : buat notasi triple A : = 1 B : = 0 While A<10 do Begin B : = B+A A : = A+2 end
Indirect Triples Kelemahan notasi triple adalah sulit pada saat melakukan optimasi, maka dikembangkan indirect triples yang memiliki dua list, yaitu list instruksi dan list eksekusi. List instruksi berisi notasi triple, sedangakn list eksekusi mengatur urutan eksekusinya. Contoh : terdapat urutan statement : A : = B + C * D / E F : = C * D maka Indirect triple nya adalah :
Quadrupel Notation Format : <operator><operan><hasil> Hasil adalah temporary variable yang bisa ditempatkan pada memory atau register. Masalah yang ada bagaimana mengelola temporary variable seminimal mungkin Contoh statement : A: =D*C+B/E Kode antaranya adalah : 1. *, D, C, T 1 2. /, B, E, T 2 3. +, T 1, T 2, A
Code Generator & Code Optimizer Bagian ini akan menterjemahkan kode antara kedalam bahasa assembly atau bahasa mesin Contoh : ekspresi (A+B) * (C+D) dengan kode antara : 1. *, D, C, T 1 2. /, B, E, T 2 3. +, T 1, T 2, A dapat diterjemahkan kedalam bahasa assembly sbb:
LDA A ADD B STO T 1 LDA C ADD D STO T 2 LDA T 1 MUL T 2 STO T 3 Dioptimasi menjadi : LDA A ADD B STO T 1 LDA C ADD D MUL T 1 STO T 2
- Slides: 20