SEMANTIK
SEMANTIC ANALYZER
Proses ini merupakan kelanjutan dari proses sebelumnya yaitu analisa leksikal
(scanning) dan analisa sintaksis (parsing)
Bagian terakhir dari tahapan analisis yaitu analisis semantik
Memanfaatkan pohon sintaks yang dihasilkan dari parsing
Proses analisa sintak dan analisa semantik merupakan dua proses yang sangat
erat kaitannya dan sulit untuk dipisahkan
Secara umum, fungsi penganalisis semantik adalah untuk menentukan makna
dari serangkaian instruksi yang terdapat dalam program sumber.
Contoh:
A :=(A+B)*(C+D)
Parser hanya akan mengenali symbol “:=“, “+”, “*” dan parser tidak
mengetahui makna dari symbol-symbol tersebut
Maka penganalisis semantik harus mampu menentukan aksi apa yang akan
dilakukan oleh operator-operator tersebut
Untuk mengenali makna dari rangkaian simbol tsb, kompilator akan
memanggil rutin semantik untuk menentukan aksi khusus yang dilakukan
rangkaian simbol tersebut.
Untuk mengetahui makna, maka routin ini akan memeriksa :
b. Memeriksa tipe
Melakukan pemeriksaan terhadap kesesuaian tipe dalam statemen –statemen yang ada.
Misal; bila ada operasi antara dua operan maka tipe operan pertama harus bisa dioperasikan
dengan operan kedua.
Contohnya;
Ekspresi yang mengikuti instruksi IF berarti tipenya Boolean, akan diperiksa tipe identifier
dan tipe ekspresinya
Bila ada operasi antara dua operan maka kedua operan harus bertipe sama
Analisa semantic sering juga digunakan dengan intermeadiate code yang akan menghasilkan
output intermediate code.
Intermediate Code nantinya akan digunakan pada proses kompilasi berikutnya (pada bagian
backend compilation)
INTERMEDIATE CODE (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 optimasi masih lebih mudah dibanding dalam bahasa assembly atau mesin
Bisa melihat program internal yang mudah dimengerti
2 macam Kode Antara yang biasa digunakan adalah Notasi Postfix dan N-Tuple
NOTASI POSTFIX
Pada notasi postfix operator diletakkan paling akhir sehinga disebut juga notasi sufix
atau reverse Polish.
Sintax notasi postfix :
<operan><operan><operator>
Contoh:
ekspresi : (a+b) * (c+d)
Contoh :
1. A + B 2. A + B * C
postfix : postfix :
AB+ A + BC*
ABC*+
B. U POSTFIX
(OPERAND 1) (OPERAND 2) (OPERATOR)
Contoh :
(A + B)/D
postfix :
AB+ / D
AB+D/
B. U POSTFIX
(OPERAND 1) (OPERAND 2) (OPERATOR)
Contoh :
(A + B) / (D – E)
POSTFIX :
AB+ / (D – E)
AB+ / DE-
AB+DE-/
CONTOH :
D * C +B/E
POSTFIX :
DC* + B/E
DC* + BE/
DC*BE/+
CONTOH :
(A * (B – C) ^ D) / E + F
POSTFIX :
(A * BC- ^D) / E + F
(A *BC-D^) / E + F
ABC-D^*/ E + F
ABC-D^*E/ + F
ABC-D^*E/F+
Notasi N-Tuple
Pada notasi N-Tuple setiap baris bisa terdiri dari beberapa tupel.
Format umum dari notasi N-Tuple adalah :
operator ………….N-1 operan
Notasi N-Tuple yang biasa digunakan adalah notasi 3 tupel dan 4 tupel.
Triples Notation
Memiliki format:
<operator><operand><operand>
Triples notation :
Contoh, instruksi :
1. *, D, C
A := D * C + B / E
2. /, B, E
3. +,(1),(2)
4. :=, A, (3)
Quadruples Notation
• hasil adalah temporary yang bisa ditempatkan pada memory atau regist
contoh instruksi:
A := D * C + B / E
Ubahlah notasi infix dibawah ini ke dalam bentuk postfix, triples notation dan quadruples
notation.
1. A – ( B + C ) * D ^ E
2. X := A * ( B + C ) / ( D – E )
3. X := (A – B) + C ^ D / ( E + F )
4. ( ( A + B ) / C ) – ( D + E ) ^ F
5. A - ( ( B + C ) / ( D ^ E ) ) + F
6. (a * (b – c) ^ d) / e + f
7. x := (a + b ) ^ c * d – ( e + f )