Hallo....jumpa lagi dalam tugas - tugas kampus...:D
kali ini tugas pertama dari mata kuliah teknik kompilasi....
na dalam tugas ini kita disuruh menjelaskan tentang analisis dalam teknik kompilasi, dalam hal ini ada 3 jenis analisis yaitu:
1.Analisis Leksikal
2. Analisis Sintaksis atau Sintaks
3.Analisis Simantik
saya lngsung saja jelaskan berhubung keyboard saya rusak dan ini saya lagi pakai keyboarrd on screen punya windows maka saya langsung jelaskan saja -_-
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.
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 Analisis
leksikal
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.
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
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.
Tahap Pelaksanaan
Analisis Leksikal
- 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 dalamfile. 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
1. Pengenalan Token
-
Scanner harus dapat mengenali token
-
Terlebih dahulu dideskripsikan token-token yang harus dikenali
2. Pendeskripsian Token
-
Menggunakan reguler grammar. Menspesifikasikan aturan-aturan pembangkit
token-token dengan kelemahan reguler grammar menspesifikasikan token berbentuk
pembangkit, sedang scanner perlu bentuk pengenalan.
-
Menggunakan
ekspresi grammar. Menspesifikasikan token-token dengan ekspresi reguler.
-
Model matematis yang dapat memodelkan
pengenalan adalah finite-state acceptor (FSA) atau finite automata.
3. 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.
4. 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:
-
"Panic mode" dengan menghapus karakter-karakter berikutnya sampai
analisis leksika menemukan token yang terdefinisi bagus
-
Menyisipkan karakter yang hilang
-
Mengganti karakter yang salah dengan karakter yang benar
-
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.
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.
Operator dan Delimineter
- Operator aritmatika ( +, -, *, /
- Operator logika (<, =, >, <=, >=, !=, <>)
- Delimiter berguna sebagai pemisah atau pembatas, contoh:
- Karakter sebagai berikut ( ) { } ; . , :
- Karakter white space.
Analisis Sintaksis atau Sintaks
Analisis sintak lebih sering disebut penguraian (parsing). Tujuan utama dari analisis sintak adalah memeriksa apakah urutan token-token yang dihasilkan sesuai dengan tata bahasa dari bahasa yang bersangkutan. Misalnya bahasa C mengenal kalimat: jumlah++; yang berarti menaikkan harga variabel jumlah dengan angka satu. Tetapi kalimat di atas akan salah jika dikompilasi dengan kompilator bahasa Pascal, karena tidak sesuai dengan tata bahasa Pascal.
Dalam analisis sintak, tata bahasa yang digunakan untuk mendefinisikan aturan sintak suatu bahasa disebut tata bahasa bebas konteks (Context Free Grammar). Tata bahasa ini memiliki empat komponen penting yaitu himpunan simbol terminal, himpunan non-terminal, himpunan produksi dan simbol awal. Dalam bahasa pemrograman, yang disebut terminal adalah token. Contoh terminal adalah token. Contoh token misalnya kata kunci (keyword) if, while, dan identifier serta bilangan. Sedangkan non-terminal merupakan variabel-variabel sintak yang menyatakan himpunan terminal maupun non-terminal. Dalam proses parsing terjadi proses penggantian suatu non terminal dengan sederetan himpunan non terminal dan terminal yang berada dalam sisi kanan produksnya. Proses ini disebut sebagai derivasi. Contohnya non-terminal if_stmt merupakan himpunan terminal if, then, else, dan non-terminal expr dan stmt, yang membentuk aturan produksi : if_stmt ?? if expr then stmt else stmt. Dari semua simbol non-terminal yang digunakan, ada satu simbol yang bertindak sebagai simbol awal, yaitu simbol yang pertama kali diderivasi. Aturan produksi menggambarkan bagaimana kombinasi non-terminal dan terminal yang benar menurut tata bahasa yanbg bersangkutan. Dalam proses penguraian, token-token yang dihasilkan dalam analisis leksikal dibentuk menjadi pohon urai (parse tree).
Pohon urai merupakan hasil derivasi dari aturan –aturan produksi.
Ada dua jenis derivasi, yaitu derivasi terkiri (Left Most Derivation) dan derivasi terkanan (Right Most Derivation). Derivasi terkiri akan menderivasi suatu aturan produksi mulai dari non-terminal yang paling kiri. Sedangkan derivasi terkanan akan menderivasi suatu aturan produksi mulai dari non-terminal yang paling kanan.
Jika proses derivasi aturan-aturan produksi suatu tata bahasa terhadap suatu masukan menghasilkan lebih dari satu pohon urai maka tata bahasa tersebut dikatakan rancu (ambiguous).
Proses Analisis Simantik
Analisa semantik berperan dalam memeriksa kesalahan yang bersifat semantic. Salah satu peranannya analisa semantic yang penting adalah pemeriksaan tipe variable. Contohnya operator * hanya digunakan untuk operan dengan tipe integer ataupun real. Sedangkan operator and, or, digunakan untuk operand dengan tipe boolean.
Analisis sintak lebih sering disebut penguraian (parsing). Tujuan utama dari analisis sintak adalah memeriksa apakah urutan token-token yang dihasilkan sesuai dengan tata bahasa dari bahasa yang bersangkutan. Misalnya bahasa C mengenal kalimat: jumlah++; yang berarti menaikkan harga variabel jumlah dengan angka satu. Tetapi kalimat di atas akan salah jika dikompilasi dengan kompilator bahasa Pascal, karena tidak sesuai dengan tata bahasa Pascal.
Dalam analisis sintak, tata bahasa yang digunakan untuk mendefinisikan aturan sintak suatu bahasa disebut tata bahasa bebas konteks (Context Free Grammar). Tata bahasa ini memiliki empat komponen penting yaitu himpunan simbol terminal, himpunan non-terminal, himpunan produksi dan simbol awal. Dalam bahasa pemrograman, yang disebut terminal adalah token. Contoh terminal adalah token. Contoh token misalnya kata kunci (keyword) if, while, dan identifier serta bilangan. Sedangkan non-terminal merupakan variabel-variabel sintak yang menyatakan himpunan terminal maupun non-terminal. Dalam proses parsing terjadi proses penggantian suatu non terminal dengan sederetan himpunan non terminal dan terminal yang berada dalam sisi kanan produksnya. Proses ini disebut sebagai derivasi. Contohnya non-terminal if_stmt merupakan himpunan terminal if, then, else, dan non-terminal expr dan stmt, yang membentuk aturan produksi : if_stmt ?? if expr then stmt else stmt. Dari semua simbol non-terminal yang digunakan, ada satu simbol yang bertindak sebagai simbol awal, yaitu simbol yang pertama kali diderivasi. Aturan produksi menggambarkan bagaimana kombinasi non-terminal dan terminal yang benar menurut tata bahasa yanbg bersangkutan. Dalam proses penguraian, token-token yang dihasilkan dalam analisis leksikal dibentuk menjadi pohon urai (parse tree).
Pohon urai merupakan hasil derivasi dari aturan –aturan produksi.
Ada dua jenis derivasi, yaitu derivasi terkiri (Left Most Derivation) dan derivasi terkanan (Right Most Derivation). Derivasi terkiri akan menderivasi suatu aturan produksi mulai dari non-terminal yang paling kiri. Sedangkan derivasi terkanan akan menderivasi suatu aturan produksi mulai dari non-terminal yang paling kanan.
Jika proses derivasi aturan-aturan produksi suatu tata bahasa terhadap suatu masukan menghasilkan lebih dari satu pohon urai maka tata bahasa tersebut dikatakan rancu (ambiguous).
Proses Analisis Simantik
Analisa semantik berperan dalam memeriksa kesalahan yang bersifat semantic. Salah satu peranannya analisa semantic yang penting adalah pemeriksaan tipe variable. Contohnya operator * hanya digunakan untuk operan dengan tipe integer ataupun real. Sedangkan operator and, or, digunakan untuk operand dengan tipe boolean.
Penganalisaan semantik dapat dilakukan dengan dua bentuk notasi yaitu : DBS(Defenisi Berdasarkan Sintaks) dan Skema Translasi.
DBS
merupakan tata bahasa dengan himpunan aturan semantic yang akan
menentukan struktur sintaks dari suatu masukan, sedangkan Skema
Translasi adalah suatu tata bahasa bebas konteks dengan penyisipan suatu
bagian program, yang disebut aksi semantik, pada sisi kanan produksi.
Fungsi
dari analisa semantik adalah untuk menentukan makna dari serangkaian
instruksi yang terdapat dalam program sumber. Untuk mengetahui makna,
maka rutin analisa semantik akan memeriksa :
a. Apakah variabel yang ada telah didefenisikan didefenisikan sebelumnya
b. Apakah variabel-variabel tersebut tipenya sama
c. Apakah operan yang akan dioperasikan tersebut ada nilainya dan seterusnya.
Pengecekan yang dilakukan oleh analisa semantik adalah:
Ø Memeriksa pemberlakuan nama-nama yang meliputi Duplikasi (pengecekan apakah sebuah nama terjadi duplikasi) dan Terdefenisi (Pengecekan apakah sebuah nama yang dipakai pada tubuh program sudah terdefenisi atau belum)
Ø Memeriksa tipe disini dilakukan pemeriksaan misal dalam penjumlahan
A+ B = C disini diperiksa apakah A,B dan C bertipe number atau tidak.
Setelah
pengecakan dilakukan dan proses analisa semantik akan beraksi maka
dibutuhkan tabel simbol. Tabel simbol digunakan untuk pembuatan dan
implementasi dari analisa semantik Tabel simbol berfungsi untuk :
v Menyimpan inforamasi tentang :
· Nama variabel dan tipe datanya
· Informasi detail untuk record dan array
· Nama prosedur dan fungsi yang ada
· Jumlah, nama, tipe data dan parameter fungsi/prosedur
· Nama label
· Konstanta dan String
v Membantu memeriksa kebenaran semantic dari source code
v Membantu mempermudah dalam pembuatan intermediate code dan code
generation.
sekian dan terima kasih
0 komentar :
Posting Komentar