Presentasi sedang didownload. Silahkan tunggu

Presentasi sedang didownload. Silahkan tunggu

SEMANTIKS Pertemuan Ke-3.

Presentasi serupa


Presentasi berjudul: "SEMANTIKS Pertemuan Ke-3."— Transcript presentasi:

1 SEMANTIKS Pertemuan Ke-3

2 Konsep Semantiks Semantiks mendefinisikan ”arti” dari program yang sudah benar secara sintaks dari bahasa pemrograman tersebut. Sebagai contoh adalah deklarasi dalam bahasa C berikut ini : Int vector[10]; Secara sintaks akan diperiksa bahwa penulisan ”[” harus berpa-sangan dengan ”]” dan akhir dari suatu statement ditandai dengan ”;” sedangkan secara semantiks statement di atas akan menyebabkan disediakannya ruang sebanyak 10 elemen integer yang diberikan kepada variabel bernama vector, dimana elemen-elemen array 1 dimensi ini akan ditunjukan dengan index i yang terdiri dari 0,1,2,3,4,5,6,7,8,9.

3 Proses analisa sintaks dan analisa semantiks merupakan dua proses yang sangat erat kaitannya dan sulit untuk dipisahkan. Contoh : A:=(A+B)*(C+D) Parser hanya akan mengenali simbol-simbol ”:=”, ”+” dan ”*”, parser tidak mengetahui makna dari simbol-simbol tersebut. Untuk mengenali makna dari simbol-simbol tersebut maka compiler memanggil routine semantiks. Untuk mengetahui makna, maka routine semantiks akan memeriksa : Apakah variabel yang ada telah didefinisikan sebelumnya, Apakah variabel-variabel tersebut tipenya sama, Apakah operand yang akan dioperasikan tersebut ada nilai-nya, dan seterusnya. Menggunakan tabel simbol. Pemeriksaan dapat dilakukan pada tabel identifier, tabel display, dan tabel blok.

4 Pengecekan yang dilakukan dapat berupa :
Memeriksa penggunaan nama-nama (keberlakuannya) Duplikasi Apakah sebuah nama terjadi pendefinisian lebih dari 2 kali. Pengecekan dilakukan pada bagian pengelo-laan blok. Terdefinisi Apakah nama yang dipakai dalam program sudah terdefinisi atau belum. Pengecekan dilakukan pada semua tempat kecuali blok. Memeriksa tipe Melakukan pemeriksaan terhadap kesesuaian tipe dalam statement- statement yang ada. Misalnya bila terdapat suatu operasi, diperiksa tipe operandnya. Contoh : Ekspresi yang mengikuti if berarti tipenya boolean, akan diperiksa tipe identifier dan tipe ekspresinya. Bila ada operasi antara dua operand, maka tipe operand yang pertama harus bisa dioperasikan dengan operand kedua.

5 KODE ANTARA Dalam menganalisa semantik sering juga digunakan intermediate code. Kode antara (intermdiate code) adalah sebuah representasi yang disiapkan untuk mesin abstrak tertentu yang biasanya berbentuk tiga alamat (three address code, baik berupa triples maupun quadruples) dan merupakan hasil dari tahapan analisis yang dibuat oleh kompilator pada saat mentranslasikan program dari bahasa tingkat tinggi. Dua sifat yang harus dipenuhi oleh kode antara (intermediate code) adalah : Dapat dihasilkan dengan mudah Mudah ditranslasikan menjadi program sasaran (target program). Ada dua macam kode antara (intermediate code) : Notasi Postfix Notasi N-Tuples

6 NOTASI POSTFIX Suatu operasi matematika, dapat ditulis dalam :
Notasi Infix (letak operator berada di tengah) Bentuk Umum : <operand> <operator> <operand> Contoh : (a+b)*(c+d) Notasi Postfix (letak operator berada di belakang) Bentuk Umum : <operand> <operand> <operator> Contoh : ab+cd+* Notasi Prefix (letak operator berada di depan) Bentuk Umum : <operator> <operand> <operand> Contoh : *+ab+cd

7 Konversi Infix ke posfix
ada tiga cara yang dapat dilakukan, yaitu manual, stack, dan binary tree. Berikut contoh notasi infixnya: A * ( B + C ) / D ^ E – F 1.a. Cara Manual Caranya adalah dengan menyederhanakan notasi menjadi dua operand (variabel) dan satu operator, seperti A + B. Langkah 1: tentukan (berdasarkan derajat operasi) mana yang akan diproses terlebih dulu. Diperoleh ( B + C ). Jika ( B + C ) dianggap G, maka notasi infix tadi menjadi: A * G / D ^ E – F Langkah 2: dari hasil langkah 1, akan disederhanakan D ^ E. Bila D ^ E dianggap H, maka notasi infix tadi menjadi: A * G / H – F Langkah 3: dari hasil langkah 2, akan disederhanakan A * G. Bila A* G dianggap I, maka notasi infix tadi menjadi: I / H – F

8 Langkah 4: dari hasil langkah 3, akan disederhanakan I / H
Langkah 4: dari hasil langkah 3, akan disederhanakan I / H. Bila I / H dianggap J, maka notasi infix tadi menjadi: J – F. Setelah diperoleh bentuk seperti itu, maka satu per satu kita kembalikan ke notasi semula sambil mengubahnya menjadi notasi postfix. Langkah 5: hasil akhir J – F, dibentuk postfixnya, menjadi J F – Langkah 6: J sebenarnya adalah I / H yang jika ditulis dalam bentuk postfix menjadi I H /, lalu kita gabung dengan hasil di langkah 5 tadi, diperoleh: I H / F - Langkah 7: H sebenarnya adalah D ^ E yang jika ditulis dalam bentuk postfix menjadi D E ^, lalu kita gabung dengan hasil di langkah 6 tadi, diperoleh: I D E ^ / F – Langkah 8: I sebenarnya adalah A * G yang jika ditulis dalam bentuk postfix menjadi A G *, lalu kita gabung dengan hasil di langkah 7 tadi, diperoleh: A G * D E ^ / F – Langkah 9: G sebenarnya adalah B + C yang jika ditulis dalam bentuk postfix menjadi B C +, lalu kita gabung dengan hasil di langkah 8 tadi, diperoleh: A B C + * D E ^ / F –

9 1.b. Cara Stack Stack adalah tumpukan (jadi, memori diibaratkan dengan tumpukan) yang memiliki cara kerja, “yang pertama masuk ke kotak, maka akan terakhir kali diambil kembali” atau “first in last out”, atau sebaliknya, “yang terakhir masuk ke kotak, akan diambil yang pertama kali,” atau “last in first out.” Berikut ini langkah-langkahnya: 1. Proses akan dilakukan dari kiri ke kanan 2. Bila yang diproses adalah operand, maka tulis di hasil. Di sini operand “A”: 3. Lanjutkan ke operator “*”, karena stack masih dalam keadaan kosong, maka masukkan operator tersebut ke dalam stack;

10 4. Lanjutkan ke operator “(“, operator ini masukkan (tumpuk) saja ke dalam stack; 5. Lanjutkan ke operand “B”, karena sebagai operand, maka “B” dijadikan hasil saja. 6. Lanjutkan ke operator “+”, operator ini masukkan (tumpuk) saja ke dalam stack;

11 7. Lanjutkan ke operand “C”, karena sebagai operand, maka “C” dijadikan hasil saja. 8. Lanjutkan ke operator “)“, operator ini akan mengeluarkan seluruh isi stack (mulai dari atas) hingga bertemu operator “(“ yang menjadi pasangannya. Karena di antara “(“ dan “)” hanya ada “+” maka “+” saja yang dijadikan hasil. Tanda kurung dibuang saja. 9. Lanjutkan ke operator “/“, operator ini akan dimasukkan ke dalam stack. Karena di top stack sudah ada isinya, maka bandingkan keduanya. Bila yang akan masuk memiliki derajat yang lebih besar, maka tumpuk saja. Sebaliknya, bila yang akan masuk memiliki derajat yang sama atau lebih kecil, maka keluarkan top stack hingga operator yang berada di top stack berderajat lebih kecil dari operator yang akan masuk. Karena “/” berderajat sama dengan “*” maka keluarkan top stack (“*”). Karena stack sudah hampa, maka operator “/” dimasukkan ke dalam stack sebagai top stacknya.

12 10. Lanjutkan ke operand “D”, karena sebagai operand, maka “D” dijadikan hasil saja. 11. Lanjutkan ke operator “^“, operator ini akan dimasukkan ke dalam stack. Karena di top stack sudah ada isinya, maka bandingkan keduanya. Karena “^” berderajat lebih besar dari top stacknya (“/”) maka masukkan (tumpuk) saja.

13 12. Lanjutkan ke operand “E”, karena sebagai operand, maka “E” dijadikan hasil saja. 13. Lanjutkan ke operator “-“, operator ini akan dimasukkan ke dalam stack. Karena di top stack sudah ada isinya, maka bandingkan keduanya. Karena “-“ berderajat lebih kecil dari “^” maka operator “^” dikeluarkan dari tumpukan dan dijadikan hasil. Ketika “-“ akan masuk, di top stack kini ada “/” yang berderajat lebih besar dari “-“, akibatnya top stack (“/”) dikeluarkan juga dan dijadikan hasil. Kini “-“ menjadi top stacknya. 14. Lanjutkan ke operand “F”, karena sebagai operand, maka “F” dijadikan hasil saja.

14 15. Karena proses telah selesai, maka keluarkan seluruh isi stack mengikuti kaidahnya, last in first out. Karena hanya ada “-“ maka hasil akhirnya menjadi: A B C + * D E ^ / F –

15 1.c. Cara Binary Tree 1. Langkah pertama untuk membuat struktur pohonnya adalah dengan menyederhanakan notasi seperti yang pernah dilakukan di cara manual hingga langkah 4, yaitu: J – F yang struktur pohon binarnya adalah: 2. Jabarkan J, yaitu I / H yang struktur pohon binarnya adalah: 3. Jabarkan I, yaitu A * G. Sama dengan langkah 2, maka struktur pohon binarnya menjadi:

16 4. Jabarkan G, yaitu B + C. Sama caranya dengan langkah 2, maka struktur pohon binarnya menjadi: 5. Jabarkan H, yaitu D ^ E. Sama caranya dengan langkah 2, maka struktur pohon binarnya menjadi:

17 Cara menentukkan notasi postfix nya yaitu rekursif dari (left-right-root) atau ulangi(kiri, kanan, tengah). Hasil : A B C + * D E ^ / F – Skema Pergerakkannya :

18 Konversi Infix Ke Prefix
Cara mengonversi infix ke prefix dapat dilakukan dengan dua cara, yaitu (a) manual, dan (b) binary tree. 2.a. Cara Manual Dengan soal yang sama, maka cara manual mengkonversi notasi infix ke prefix dimulai sama dengan cara di sub-bab 1.a. proses 1 sampai 4, hingga diperoleh: J – F. Langkah 1: J – F dalam notasi prefix ditulis dengan - J F Langkah 2: J adalah I / H yang notasi prefixnya adalah / I H, sehingga ketika digabung akan menjadi - / I H F Langkah 3: I adalah A * G yang notasi prefixnya adalah * A G, sehingga ketika digabung akan menjadi - / * A G H F Langkah 4: G adalah (B + C) yang notasi prefixnya adalah + B C, sehingga ketika digabung akan menjadi - / * A + B C H F Langkah 5: H adalah D ^ E yang notasi prefixnya adalah ^ D E, sehingga ketika digabung akan menjadi - / * A + B C ^ D E F Jadi, untuk notasi infix: A * ( B + C ) / D ^ E – F, maka notasi postfix adalah: - / * A + B C ^ D E F

19 2.b. Cara Binary Tree Caranya sama dengan cara binary tree sebelumnya. Singkatnya, setelah struktur pohonnya terbentuk, maka berikut ini traversalnya secara pre-order dengan rumus: rekursif(tengah, kiri, kanan), atau rekursif (root, left, right) sebagai berikut: Skema Pergerakannya: - / * A+ B C^ D E F,

20 Dalam bahasa pemrograman notasi postfix ditulis :
Notasi Infix : IF <exp> THEN <stmn1> ELSE <stmn2> notasi postfix : <exp> <label1> BZ <stmn1> <label2> BR <stmn2> label1 label2 artinya : ”Jika kondisi ekspresi salah maka instruksi akan meloncat ke label1 dan menjalankan statement2. Bila kondisi ekspresi benar, maka statement1 akan dijalankan lalu meloncat ke label2. Label1 dan label2 sendiri menunjukkan posisi tujuan loncatan. Untuk label1 posisinya tepat sebelum statement2, dan label2 setelah statement2”

21 BZ  branch if zero (zero=salah), maksudnya bercabang/ melon-cat bila kondisi yang dites salah.
BR  branch, maksudnya bercabang/ meloncat tanpa ada kondi-si yang dites.   Contoh : IF a > b THEN c := d ELSE c := e notasi postfixnya : 11 a artinya : 12 b bila ekspresi (a>b) salah, maka lon- 13 > cat ke instruksi nomor 22. (menunjuk label1) - bila ekspresi (a>b) benar, tidak ter- 15 BZ jadi loncatan, instruksi berlanjut ke 16 c nomor 16 sampai 18, lalu loncat ke 17 d nomor 25. 18 := 19 (menunjuk label2) 21 BR 22 c 23 e 24 := 25 End

22 N-TUPLES Notasi n-tuples setiap baris dapat terdiri dari beberapa tuple. Misalnya :  Triples Notation (3 tuples) Bentuk Umum : <operator>, <operand>, <operand> Contoh : A := B * C + D / E Triples Notationnya *, B, C /, D, E +, (1), (2) :=, A, (3)  Quadruples Notation (4 tuples) Bentuk Umum : <operator>, <operand>, <operand>, <hasil> Quadruples Notationnya : *, B, C, T1 /, D, E, T2 +, T1, T2, A

23 Contoh Triple Notation dalam bahasa pemrograman :
IF x > y THEN x := a – b ELSE x := a + b triples notationnya :  >, x, y BZ, (1), (7) {Bila kondisi (1) salah loncat ke nomor 7} -, a, b :=, x, (3) BR, , (8) +, a, b :=, x, (6) End

24 Terima kasih


Download ppt "SEMANTIKS Pertemuan Ke-3."

Presentasi serupa


Iklan oleh Google