Merupakan Teknik dalam melakukan pembacaan suatu
program yang ditulis dalam bahasa sumber, kemudian diterjemahkan ke dalam suatu
bahasa lain yang disebut bahasa sasaran. Dalam melakukan proses penerjemahan
tersebut, sudah barang tentu kompilator akan melaporkan adanya
keanehan-keanehan atau kesalahan yang mungkin ditemukannya. Proses penerjemahan
yang dilakukan oleh kompilator ini disebut proses kompilasi (compiling).
Bila dipandang sepintas lalu, maka akan timbul beranekaragam kompilator yang
dapat dibuat antara lain sebagai berikut :
ü Bahasa Sumber seperti bahasa FORTRAN,
PASCAL, C dan juga bahasa-bahasa lainnya yang sifat dan pemakaiannya agak
spesifik atau khusus, seperti bahasa untuk program DBASE, SPSS dan lain
sebagainya.
ü Bahasa Sasaran dapat berupa bahasa sumber
lain seperti C, FORTRAN dan lain sebagainya atau Bahasa Mesin (Machine
Language) yang digunakan oleh suatu prosessor mikro atau sumber komputer besar
maupun komputer super.
Sejarah perkembangan suatu kompilator sudah
dimulai sejak lama, yaitu pada saat mulai ditemukannya komputer pada awal
1950-an. Sejak waktu tersebut teknik dan cara pembentukan suatu kompilator
telah berkembang dengan sangat pesat dan pembentukkan suatu kompilator dapat
dilakukan makin mudah. Demikian pula program bantu (tools) untuk membuat suatu
kompilator sudah dapat diperoleh sehingga pembentukan suatu kompilator dapat
dilakukan dengan cepat.
Kompilator pertama yang dibuat adalah kompilator
untuk bahasa FORTRAN yang pada saat itu dikembangkan dengan memakan sejumlah
tenaga ahli yang setara dengan pekerjaan yang dilakukan oleh 18 orang. Dengan
adanya program bantu dan tata cara pembentukan yang sistematis dan tertata
dengan baik serta pendefinisian struktur bahasa yang cermat, maka suatu
kompilator untuk bahasa yang terstruktur seperti PASCAL atau C dapat
dikembangkan.
Proses kompilasi dari suatu kompilator pada dasarnya dapat dibagi ke dalam
2 bagian utama yaitu bagian analisis dan bagian sintesis.
ü Tahap analisis program yang ditulis dalam
bahasa sumber dibagi dan dipecah ke dalam beberapa bagian yang kemudian akan
dipresentasikan ke dalam suatu bentuk antara dari program sumber.
Operasi-operasi yang dilakukan oleh program sumber
ditentukan dan dicatat dalam suatu struktur pohon (tree) yang disebut dengan nama
pohon sintaks (sintax tree) Dalam hal ini setiap nodal pada tree tersebut
menyatakan suatu operasi, sedangkan anak dari nodal (titik) tersebut memberikan
argumen yang diperlukan
Secara umum proses dalam tahap analis terdiri dari
3 bagian utama, yaitu :
1. Proses analisis leksikal
2. Proses analisis sintaktik
3. Proses analisis semantik
ü Tahap sintesis yang berikutnya program
sasaran dibentuk berdasarkan representasi antara yang dihasilkan pada tahap
analisis.
Untuk tahap sintetis terdiri dari 2 bagian utama,
yaitu
4. Proses yang menghasilkan kode (code
generator)
5. Proses optimasi kode (code optimizer)
Sebelum Bahasa sasaran dapat dihasilkan, dalam
melakukan ini tiap bagian utama akan berhubungan dan berkomunikasi dengan suatu
berkas tabel yang disebut tabel simbol (symbol table) yaitu suatu tabel yang
berisi semua simbol yang digunakan dalam bahasa sumber. Selain kompilator masih
diperlukan beberapa program lainnya sebelum dapat dibentuk bahasa sasaran yang
dapat dijalankan. Seperti suatu bahasa sumber dapat dituliskan dalam beberapa
modul yang terpisah dan disimpan dalam beberapa file yang terpisah.
Untuk menanggulangi hal ini, maka suatu program
khusus yang disebut dengan suatu praprosesor digunakan untuk mengumpulkan
modul-modul yang saling lepas ini ke dalam suatu program baru. Praposesor dapat
pula melengkapi singkatan-singkatan atau ungkapan-ungkapan maupun
kependekan-kependekan yang digunakan dalam bahasa sumber seperti pendef
Analisis Leksikal
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.
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.
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.
5
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.
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.
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.
0 komentar:
Posting Komentar