Sebuah
kompilator akan sering menemui program yang mengandung kesalahan, maka
kompilator harus memiliki strategi apa yang harus dilakukan untuk menangani
kesalahan - kesalahan tersebut.
1 Jenis
– jenis Kesalahan
n
Kesalahan Leksikal
Misalnya kesalahan mengeja keyword,
contoh: then ditulis ten
n
Kesalahan Sintaks
Misalnya pada operasi aritmatika kekurangan jumlah paranthesis (kurung).
contoh : A:=X+(B*(C+D)
n Kesalahan Semantik
o
Tipe
data yang salah, misal tipe data integer digunakan untuk variabel string.
Contoh : Var Siswa : Integer
Siswa := 'Aka' {tipe string}
o
Variabel
belum didefinisikan tetapi digunakan dalam operasi.
Contoh : B := B + 1 {B belum didefinisikan}
2 Penanganan Kesalahan
n Prosedur penanganan kesalahan terdiri
dari :
·
Mendeteksi
kesalahan
· Melaporkan kesalahan
· Tindak lanjut perbaikan / pemulihan
n
Pelaporan kesalahan yang dilakukan oleh
sebuah kompilator yang menemukan kesalahan meliputi :
· Kode kesalahan
· Pesan kesalahan dalam bahasa natural
· Nama dan atribut identifier
· Tipe – tipe yang terkait bila type
checking
Contoh
: Error Message : Error 162 jumlah:
unknown identifier
Ø Kode kesalahan = 162
Ø Pesan kesalahan = unknown
identifier
Ø Nama identifier = jumlah
Adanya pesan kesalahan
tersebut akan memudahkan pemrogram dalam mencari dan mengoreksi sumber dari
kesalahan.
n
Pada saat kompilator menemukan kesalahan
terdapat beberapa tingkatan reaksi diantaranya adalah :
a.
Reaksi
yang tidak dapat diterima (tidak melaporkan error)
·
Kompilator
crash : berhenti atau hang
·
Looping : kompilator masih berjalan tapi tidak pernah berakhir karena looping tak
berhingga (indefinite/onbounded loop)
·
Menghasilkan
program objek yang salah : kompilator melanjutkan proses sampai selesai tapi
program objek yang dihasilkan salah. Ini berbahaya bila tidak diketahui
pemrogram, karena baru akan muncul saat program dieksekusi.
b. Reaksi yang benar tapi kurang dapat
diterima dan kurang bermanfaat. Kompilator menemukan kesalahan pertama,
melaporkannya, lalu berhenti (halt). Ini bisa muncul bila pembuat kompilator
menganggap jarang terjadi kemunculan error dalam program sehingga kemampuan
kompilator untuk mendeteksi dan melaporkan kesalahan hanya satu untuk setiap
kali kompilasi. Pemrogram akan membuang waktu untuk melakukan pengulangan
kompilasi setiap kali terdapat sebuah error.
c. Reaksi yang dapat diterima
·
Reaksi
yang sudah dapat dilakukan, yaitu kompilator melaporkan kesalahan / error, dan
selanjutnya melakukan:
Ø Recovery /
pemulihan, lalu melanjutkan menemukan kesalahan / error yang lain bila masih
ada.
Ø Repair / Perbaikan kesalahan, lalu
melanjutkan proses translasi dan menghasilkan program objek yang valid
Kebanyakan kompilator
dewasa ini sudah memiliki kemampuan recovery dan repair.
·
Reaksi
yang belum dapat dilakukan, yaitu kompilator mengkoreksi kesalahan, lalu
menghasilkan program objek sesuai dengan yang diinginkan pemrogram. Disini
komputernya sudah memiliki kecerdasan untuk mengetahui maksud pemrogram.
Tingkatan respon ini belum dapat diimplementasikan pada kompilator yang ada
dewasa ini.
3 Pemulihan Kesalahan
Tujuannya mengembalikan kondisi
parser ke kondisi stabil (supaya bisa melanjutkan proses parsing
ke posisi selanjutnya). Strategi yang dilakukan error recovery sebagai
berikut :
v Mekanisme Ad Hoc
Recovery yang dilakukan
tergantung dari pembuat kompilator sendiri/Spesifik, dan tidak terikat pada
suatu aturan tertentu. Cara ini biasa disebut juga special purpose error
recovery.
v Syntax Directed Recovery
Melakukan
recovery berdasarkan syntax
Contoh : ada program
begin
A:=A+1
B:=B+1;
C:=C+1
end;
kompilator akan
mengenali sebagai (dalam notasi BNF)
begin
< statement>?;end;
? akan diperlakukan sebagai “;”
v Secondary Error Recovery
Berguna untuk melokalisir kesalahan / error, caranya :
·
Panic mode
Maju terus dan
mengabaikan teks sampai bertemu delimeter (misal ‘;’)
contoh :
IF A := 1
Kondisi :=
true;
Teks diatas terjadi
kesalahan karena tidak ada instruksi THEN, kompilator akan maju terus sampai
bertemu ‘;’
·
Unit deletion
Menghapus keseluruhan
suatu unit sintaktik (misal: ,, dan
sebagainya), efeknya sama dengan panic mode tetapi unit deletion
memelihara kebenaran sintaksis dari source program dan mempermudah untuk
melakukan error repairing lebih lanjut.
v Context Sensitive Recovery
Berkaitan dengan semantik,misal bila
terdapat variabel yang belum dideklarasikan(undifined variabel) maka
diasumsikan tipenya berdasarkan kemunculannya.
Contoh :
B:=
'nama'
sementara diawal program variabel B
belum dideklarasikan, maka berdasarkan
kemunculannya diasumsikan variabel B bertipe string.
4 Error
Repair
Bertujuan untuk memodifikasi source
program dari kesalahan dan membuatnya valid sehingga memungkinkan kompilator
untuk melakukan translasi program yang mana akan dialirkan ketahapan
selanjutnya pada proses kompilasi. Mekanisme error repair meliputi :
Ø Mekanisme Ad Hoc
Tergantung
dari pembuat kompilator sendiri / spesifik.
Ø Syntax Directed Repair
Menyisipkan simbol terminal
yang dianggap hilang atau membuang terminal penyebab kesalahan
Contoh :
While a<1 span="">1>
I:=I+1;
Kompilator akan menyisipkan DO karena kurang simbol DO
contoh lain :
Procedure Increment;
begin
x:=x+1;
end;
end;
terdapat kelebihan simbol end, yang menyebabkan kesalahan maka kompilator
akan membuangnya.
Ø Context Sensitive Repair
Perbaikan dilakukan pada
kesalahan :
·
Tipe identifier. Diatasi dengan
membangkitkan identifier dummy, misalkan :
Var A : string;
begin
A:=0;
end;
·
Tipe
konstanta. Diatasi dengan membangkitkan konstanta baru dengan tipe yang tepat.
Ø Spelling repair
Memperbaiki kesalahan
pengetikan pada identifier, misal :
WHILLE
A = 1 DO
Identifier yang salah tersebut akan
diperbaiki menjadi WHILE
0 komentar:
Posting Komentar
please your comment n thanks ^.^