Analisis Leksikal
2.1 Pengertian
Analisis Leksikal/Analisis Linier/Pembacaan Sekilas (Scanner). Dalam
kaitan ini aliran karakter yang membentuk program sumber dibaca dari kiri ke
kanan dan dikelompokkan dalam apa yang
disebut token yaitu barisan dari karakter yang dalam suatu kesatuan mempunyai suatu
arti tersendiri..
Analisis ini melakukan penerjemahan masukan menjadi bentuk yang
lebih berguna untuk tahap-tahap kompilasi berikutnya. Analisis Leksikal
merupakan antarmuka antara kode program sumber dan analisis sintaktik (parser).
Scanner melakukan pemeriksaan karakter per karakter pada teks masukan, memecah
sumber program menjadi bagian-bagian disebut Token. Analisis Leksikal
mengerjakan pengelompokkan urutan-urutan karakter ke dalam komponen pokok:
identifier, delimeter, simbol-simbol operator, angka, keyword, noise word,
blank, komentar, dan seterusnya menghasilkan suatu Token Leksikal yang akan
digunakan pada Analisis Sintaktik.
Model dasar untuk membentuk suatu Analisis Leksikal adalah
Finite-State Automata, 2 aspek penting pembuatan Analisis Leksikal adalah:
·
Menentukan token-token bahasa.
·
Mengenali token-token bahasa
dari program sumber.
Token-token dihasilkan dengan cara memisahkan program sumber
tersebut dilewatkan ke parser. Analisis Leksikal harus mengirim token ke
parser. Untuk mengirim token, scanner harus mengisolasi barisan karakter pada
teks sumber yang merupakan 1 token valid. Scanner juga menyingkirkan informasi
seperti komentar, blank, batas-batas baris dan lain-lain yang tidak penting
(tidak mempunyai arti) bagi parsing dan Code Generator.
Scanner juga harus dapat mengidentifikasi token secara lengkap dan
membedakan keyword dan identifier. Untuk itu scanner memerlukan tabel simbol.
Scanner memasukkan identifier ke tabel simbol, memasukkan konstanta literal dan
numerik ke tabel simbol sendiri setelah konversi menjadi bentuk internal.
Analisis Leksikal merupakan komponen kompilasi independen yang
berkomunikasi dengan parser lewat antarmuka yang terdefinisi bagus dan
sederhana sehingga pemeliharaan analisis leksikal menjadi lebih mudah dimana
perubahan-perubahan terhadap analisis leksikal tidak berdampak pada pengubahan kompilator
secara keseluruhan. Agar dapat memperoleh fitur ini, maka antarmuka harus tidak
berubah. Kebanyakan kode yang menyusun analisis leksikal adalah sama untuk
seluruh kompilator, tidak peduli bahasa.
Pada analisis leksikal yang dituntun tabel (table-driven lexical
analyzer), maka satu-satunya yang berubah adalah tabel itu sendiri. Kadang
diperlukan interaksi analisis leksikal dan analisis sintaktik yang lebih kompleks.
Sehingga analisis leksikal harus dapat menganggap string sebagai token bertipe,
bukan identifier. Untuk itu perlu komunikasi
tingkat lebih
tinggi yang biasanya dilakukan suatu struktur data dipakai bersama seperti
tabel simbol. Analisis Sintaktik dapat memasukkan string ke tabel simbol,
mengidentifikasi sebagai Type atau typedef, sehingga analisis leksikal dapat
memeriksa tabel simbol untuk menentukan apakah lexeme adalah tipe token atau
identifier.
2.2 Tugas-tugas Analsis Leksikal
Tugas-tugas
Analisis leksikal antara lain sebagai berikut :
1.
Konversi Program Sumber Menjadi
Barisan Token. Mengubah program sumber yang dipandang sebagai barisan byte/karakter
menjadi token.
2.
Menangani Kerumitan Sistem
Masukkan/Keluaran. Karena analisis leksikal biasanya berhubungan langsung
dengan kode sumber yang diwadahi file, maka analisis leksikal juga bertindak
sebagai benteng untuk komponen-komponen lain di kompilator dalam mengatasi
keanehan-keanehan sistem masukkan/keluaran sistem operasi dan sistem komputer.
Optimasi perlu dilakukan agar analisis leksikal membaca karakter
degan sekaligus membaca sejumlah besar bagian file. Perangkat masukkan/keluaran
benar-benar diisolasi agar tidak terlihat oleh parser dan komponen-komponen
kompilator yang lain.
2.3 Tugas-tugas tambahan Analisis Leksikal
Tugas-tugas
tambahan Analisis Leksikal antara lain sebagai berikut :
1.
Penghilangan komentar dan
whitespace (tab,spasi,karakter lainnya).Tindakan housekeeping dilakukan scanner
sehingga mengisolasikan dari parser dan komponen-komponen kompilator lain.
Peran ini menyederhanakan perancangan parser (dan grammar bahasa
pemrograman). Scanner juga mencatat nomor baris saat itu sehingga penanganan
kesalahan yang cerdas dapat mengirim pesan kesalahan dengan lebih akurat.
2.
Konversi literal/konstanta numerik
menjadi tipe data tertentu. Analisis leksikal dapat mengirim token, dan
nilainya. Nilai ini biasa disebut atribut. Namun demikian, bila analisis
leksikal ditambahin dengan tugas-tugas tambahan yang terlalu banyak juga akan
menjadi tidak baik. Karena itu membatasi analisis
leksikal hanya untuk melakukan tugas pengenalan pola token (ditambah
membuang komentar) adalah mempermudah pemeliharaan.
2.4 Tahap-tahap Pelaksanaan Analisis Leksikal
Tahap Pelaksanaan Analisis Leksikal antara lain sebagai berikut :
ü Pada single one pass.
Terjadi interaksi antara scanner dan parser. Sacnner dipanggil saat
parser memerlukan token berikutnya. Pendekatan ini lebih baik karena bentuk
internal program sumber yang lengkap tidak perlu dibangun dan disimpan di memori
sebelum parsing dimulai.
ü Pada separate pass.
Scanner memproses secara terpisah, dilakukan sebelum parsing. Hasil
scanner disimpan dalam file. Dari file tersebut, parsing melakukan kegiatannya.
Scanner mengirim nilai-nilai integer yang mempresentasikan bentuk internal token,
bukan nilai-nilai string.
Keunggulan cara ini adalah ukurannya kecil dan tetap. Parser sangat
lebih efisien bekerja dengan nilai integer yang mempresentasikan simbol daripada
string nyata dengan panjang variabel.
2.5 Implementasi Analisis Leksikal
Implementasi Analisis Leksikal antara lain sebagai berikut :
ü Pengenalan Token.
1.
Scanner harus dapat mengenali
token
2.
Terlebih dahulu dideskripsikan
token-token yang harus dikenali
ü Pendeskripsian Token.
1.
Menggunakan reguler grammar.
Menspesifikasikan aturan-aturan pembangkit token-token dengan kelemahan reguler
grammar menspesifikasikan token berbentuk pembangkit, sedang scanner perlu
bentuk pengenalan.
2.
Menggunakan ekspresi grammar.
Menspesifikasikan token-token dengan ekspresi reguler.
3.
Model matematis yang dapat
memodelkan pengenalan adalah finite-state acceptor (FSA) atau finite automata.
ü Implementasi Analisis Leksikal sebagai Finite Automata.
Pada pemodelan analisis leksikal sebagai pengenal yang menerapkan
finite automata, analisis leksikal tidak cuma hanya melakukan mengatakan YA
atau TIDAK. Dengan demikian selain pengenal, maka analisis leksikal juga
melakukan aksi-aksi tambahan yang diasosiasikan dengan string yangsedang
diolah.
Analisis leksikal dapat dibangun dengan menumpangkan pada konsep
pengenal yang berupa finite automata dengan cara menspesifikasikan rutin-rutin
(aksi-aksi) tertentu terhadap string yang sedang dikenali.
ü Penanganan Kesalahan di Analisis Leksikal Hanya sedikit kesalahan
yang diidentifikasi di analisis leksikal secara mandiri karena analisis
leksikal benar-benar merupakan pandangan sangat lokal terhadap program sumber.
Bila ditemui situasi dimana analisis leksikal tidak mampu
melanjutkan proses karena tidak ada pola token yang cocok, maka terdapat beragam
alternatif pemulihan. yaitu:
1.
"Panic mode" dengan
menghapus karakter-karakter berikutnya sampai analisis leksikal menemukan token
yang terdefinisi bagus
2.
Menyisipkan karakter yang
hilang
3.
Mengganti karakter yang salah
dengan karakter yang benar
4.
Mentransposisikan 2 karakter
yang bersebelahan.
Salah
satu cara untuk menemukan kesalahan-kesalahan di program adalah menghitung
jumlah transformasi kesalahan minimum yang diperlukan untuk mentransformasikan
program yang salah menjadi program yag secara sintaks benar.
2.6 Input Buffering
Perancangan analisis leksikal seharusnya dapat membuat buffering
masukkan yang membantu mempercepat proses pembacaan dari file serta mempunyai
fleksibelitas yang tinggi agar analisis leksikal tidak bergantung platform
sehingga mempunyai portabilitas yang tinggi.
Comments
Post a Comment