You are on page 1of 18

Disusun untuk memenuhi tugas Teknik Kompilasi

“Analisa Leksikal dan Bahasa Reguler”


Semester 4
Oleh
Nama : Bela Putri
Desiderius Asmon
Ratih Putriningsih
Fakultas : Teknik
Jurusan : Informatika

UNIVERSITAS PRAMITA INDONESIA

TANGERANG-BANTEN
2020
BAB I
PENDAHULUAN

A . LATAR BELAKANG

Analisis leksikal (bahasa Inggris: lexical analysis) adalah sebuah proses yang mendahului
parsing sebuah rangkaian karakter. Ia menerima masukan serangkaian karakter (seperti dalam
dokumen plain-text atau source code) dan menghasilkan deretan simbol yang masing-masing
dinamakan token; proses parsing akan lebih mudah dilakukan bila inputnya sudah berupa token.

Analisis leksikal terdiri dari dua tahap. Tahap pertama adalah pemindaian (scanning);
scanner biasanya dibuat berdasarkan prinsip Finite State Machine ("mesin dengan jumlah
keadaan terbatas"). Pada tahap ini, scanner akan membaca input karakter-ke-karakter, mengubah
keadaannya sendiri berdasarkan karakter yang tengah dibaca. Setiap kondisi final (input
dianggap valid) akan dicatat, bersama dengan lokasi input. Pada akhirnya scanner akan menemui
keadaan penolakan, yang tidak akan berubah dengan input karakter apapun. Deteksi rekursi
semacam ini akan mengakhiri proses pemindaian dan memindahkan keadaan scanner ke keadaan
final terakhir, dan karenanya menyimpan informasi jenis dan besar lexeme valid yang terpanjang
di dalam input..

Analisis leksikal membuat pekerjaan parser jadi lebih mudah; daripada membangun nama
setiap fungsi dan variabel dari karakter-karakter yang menyusunnya, dengan analisis leksikal,
parser cukup hanya berurusan dengan sekumpulan token dan nilai sintaksis masing-masing.
Terlepas dari efisiensi pemrograman yang dapat dicapai dengan penggunaannya, proses kerja
analisis leksikal yang membaca lebih dari sekali setiap karakter dari input yang diberikan
menjadikan penganalisa leksikal sebagai sub-sistem yang paling intensif melakukan komputasi,
terutama bila digunakan dalam sebuah kompilator.

B . TUJUAN PENULISAN

Tujuan dalam penulisan makalah ini adalah untuk mengetahui fungsi-fungsi Analisis
Leksikal pada teknik kompilasi pembuatan program analisis leksikal menggunakan bahasa
pemograman java.

C . RUMUSAN MASALAH

1. bagaimana tahapan-tahapan Analisis Leksikal


2. apa pengertian Analisis Leksikal
3. apa tugas analisa leksikal
1
BAB II
PEMBAHASAN

2.1 Pengertian

Pada analisis leksikal yang di tuntun 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 Analisis 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 dengan
sekaligus membaca sejumlah besar bagian file. Perangkat masukkan/keluaran benar
benar di isolasi 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 white space (tab,spasi,karakter lainnya).


Tindakan house keeping 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 ditambahkan 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 :

1. 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.
 

2
2. 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 : 

a. Pengenalan Token.
1. Scanner harus dapat mengenali token
2. Terlebih dahulu di deskripsikan token-token yang harus dikenali
b. 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-stateacceptor
(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 yang sedang 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.

3
2.7 Besaran Leksik/Token
Besaran pembangun bahasa / leksis meliputi:

1. Identifier (huruf dan angka) Bisa berupa keyword atau nama.


keywords adalah kata kunci yang sudah disefinisikan oleh suatu bahasa seperti BEGIN,
END, IF, ELSE dalam Pascal.Nama dideklarasikan sendiri oleh pemakai, seperti nama
sebuah variabel.

Contoh :
VAR Nomor: INTEGER;
Suhu: REAL;
Maka Nomor dan Suhu adalah Token berupa nama variabel, sedangkan VAR, INTEGER,
dan REAL adalah keywords pada program tersebut.

2. Nilai Konstanta
Yaitu konstanta yang terdapat pada program. Berupa konstanta integer, real,boolean,
character, string.

Contoh:
N:=R+5*10
Kata:= kata1 + ‘makan’ A:=0.333
Selesai:= TRUE Maka 5, 10,’makan’,0.333, TRUE, termasuk Token Nilai Konstanta pada
program.

3. Operator dan Delimiter


Termasuk Operator adalah operator aritmetika , operator logika (). Delimiter berguna
sebagai pemisah/pembatas, contohnya: ( ), ;, :, white-space yaitu spasi (yg diabaikan di
program), enter, end of file.
Analisa Leksikal
Membaca program sumber, karakter demi karakter. Sederetan (satu
atau lebih) karakter dikelompokkan menjadi satu kesatuan mengacu
kepada pola kesatuan kelompok karakter (token) yang ditentukan
dalam bahasa sumber. Kelompok karakter yang membentuk sebuah
token dinamakan lexeme untuk token tersebut. Setiap token yang
dihasilkan disimpan di dalam table symbol. Sederetan karakter yang
tidak mengikuti pola token akan dilaporkan sebagai token tak dikenal
(unidentified 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.
Kira-kira seperti itulah pengertian Analisis Leksikal.

Untuk selanjutnya kita langsung saja ke contoh kasus analisis


leksikal.
Disini saya mempunyai sebuah coding program yaitu program Pola
Bintang menggunakan pemograman Java Netbeans. Agar dapat
melakukan analisis leksikal maka kita lakukan sedikit kesalahan pada
coding programnya seperti ini :

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
packet starpattern;

/**
*
* @author Picka
*/
publik klass Starpattern {
/**
* @param args the command line arguments
*/
publik staticc void main(String[] args) {
// TODO code application logic here
for (int i= 1; i<=5;i++)
{
for (int j=i;j<=5;j++)
{
System.out.print("*")
}
System.out.println()
}
}
}

Setelah itu kita coba compile maka pasti akan di temukan beberapa
kesalahan pada program dan program tidak dapat di-Run atau
dijalankan. Untuk mengetahui letak kesalahan pada program maka
kita lakukan analisis leksikal. Cara kerja analisis leksikal adalah
melakukan scanner atau pemindaian dari bagian atas duluan lalu ke
bawah dan juga dari arah kiri terlebih dahulu baru ke arah kanan.
Pada Java Netbeans, kesalahan pada coding langsung ditampilkan
dengan mark atau tanda merah di awal line seperti ini :
Setelah melakukan analisis leksikal kita akhirnya dapat mengetahui
kesalahan pada coding kita, langsung saja kita mencari solusi agar
kesalahan pada coding dapat diperbaiki.
Solusi dari kesalahan pada coding diatas adalah :

Setelah diperbaiki maka hasil coding yang sudah jadi dan tidak ada
lagi kesalahan adalah sebagai berikut :
Dan ini adalah output dari program "Pola Bintang" yang telah
dianalisa dan diperbaiki :

EKSPRESI REGULAR
2.1 Penerapan Ekspresi Reguler
Sebuah bahasa dinyatakan regular jika terdapat finite state automata yang dapat
menerimanya.Bahasa-bahasa yang diterima oleh suatu finit state automata bisa dinyataka secara
sederhana dengan ekspresi regular (Regular Expression).
 Ekspresi regular selanjutnya kita sebut sebagai ER, memungkinkan menspesifikasikan
atau mendefinisikan bahasa-bahasa.
 Ekspresi regular memberikan suatu pola (pattern) atau template untuk untai/string dari
suatu bahasa.
 Untai yang menyusun suatu bahasa regular akan cocok (match) dengan pola bahasa itu.

Banyak masalah pada perancangan perangkat lunak yang bisa disederhanakan dalam dengan
melakukan pengubahan notasi ekspresi regular ke dalam implementasi komputer dari finitestate
automata yang bersangkutan.Penerapan ekspresi regular misalnya : pencarian (searching) untai
karakter (string) pada suatu file, biasanya fasilitas ini ada pada text editor.
Contoh penerapan yang lain adalah pembatasan data masukan yang diperkenankan, misalnya
suatu field masukan hanya menerima input bilangan (0..9).Bisa kita lihat otomatanya pada
gambar.
2.2 Notasi Ekspresi Regular

Notasi dasar Ekspresi Reguler (*+ +∪ ) yaitu :

*(karakter asterisk), berarti bisa tidak muncul, bisa juga muncul berkali-kali (0-n)

(pada posisi superscript/diatas) berarti minimal muncul satu kali (1-n)


+

+ atau ∪ berarti union

.(titik) : berarti konkatensi biasanya titik bisa dihilangkan, misal ab bermakna seperti a.b

Contoh ekspresi regular

(selanjutnya kita singkat ER):

 ER: ab*cc

Contoh string yang dibangkitkan : abcc,abbcc, abbbcc, abbbbcc, acc,(b bisa tidak muncul atau
muncul sejumlah berhingga kali)

 ER:010*
Contoh string yang dibangkitkan : 01, 010, 0100, 01000

(jumlah 0 diujung bisa tidak muncul, bisa muncul berhingga kali)

 ER:a*d

Contoh string yang dibangkitkan : d, ad, aad, aaad

 ER:a+d

Contoh string yang dibangkitkan : ad, aad, aaad (a minimal muncul sekali)

 ER: a*∪b* ('∪'berarti atau)

Contoh string yang dibangkitkan : a, b, aa, bb, aaa, bbb, aaaa, bbbb

 ER: (a∪b)

Contoh string yang dibangkitkan : a, b

 ER: (a∪b)*

Contoh string yang dibangkitkan : a, b, ab, ba, abb, bba, aaaa, bbbb

(untai yang memuat a atau b)

* perhatikan : notasi '∪' kadang dituliskan juga sebagai '+'

 ER:01*+0

Contoh string yang dibangkitkan : 0, 01, 011, 0111, 01111`

(string yang berawalan dengan 0, dan selanjutnya boleh diikuti deretan 1)

2.3 Bahasa reguler

Misalkan ∑ merupakan sebuah abjad. Kumpulan dari bahasa reguler berdasar ∑ didefinisikan
secara rekursif sebagai berikut [1] :

a. ∅adalah sebuah bahasa regular


b. {λ} adalah sebuah bahasa regular
c. Untuk setiap a ∈ Σ, {a} merupakan bahasa regular. Disebut juga bahasa singleton
d. Jika A dan B bahasa regular maka A∪B, A.B dan A* atau B* merupakan bahasa regular
e. Tidak ada bahasa lain berdasarkan ∑ yang regular

Contoh 1 : Misalkan ∑ = {a,b}, maka berikut ini merupakan bahasa-bahasa regular berdasarkan
∑ yaitu ∅, {λ}. {a}, {b},{a,b},{ab}, {a,ab,b},{ai| i ≥0}, {(ab)i | i ≥0}

2.4 Hubungan Ekspresi Regular dan Finite State Otomata

Untuk setiap ekspresi regular ada satu Non-deterministic Finite Automata dengan transisi ε
(NFA ε-move ) yang ekivalen. Sementara untuk Deterministic Finite Automata ada satu ekspresi
regular dari bahasa yang diterima oleh Deterministic Finite Automata. Sederhananya kita bisa
membuat suatu Non-deterministic Finite Automata ε-move dari suatu ekspresi regular. Bisa
dilihat contohnya pada gambar 3,4,5 . Yang perlu diperhatikan disitu, state akhir akan
menandakan apakah suatu input di terima atau tidak.
Kemudian dari Non-deterministic Finite Automata ε-move tersebut dapat kita ubah ke Non-
dterministic Finite Automata dan selanjutnya ke Deterministic Finite Automata atau prosesnya
sebagai berikut :

NFA ε-move⇒ NFA ⇒ DFA

Bila ekspresi regularnya cukup sederhana kita bisa saja langsung mengkontruksi NFA-nya ,
tanpa melalui NFA ε-move. Misalkan saja NFA tanpa ε-move untuk ER: ab bisa dilihat pada
gambar 6
Contoh-contoh lain bisa lihat gambar 8-15
BAB III
PENUTUPAN

3.1 Kesimpulan

Analisis Leksikal Merupakan Analisi dalam melakukan proses yang mendahului parsing
sebuah rangkaian karakter. Untuk masukan serangkaian karakter (seperti dalam dokumen plain-
text atau source code) dan menghasilkan deretan simbol yang masing-masing dinamakan token;
proses parsing akan lebih mudah dilakukan bila inputnya sudah berupa token.

 Sebuah bahasa dinyatakan regular jika terdapat finite state otomata yang dapat
menerimanya
 Bahasa-bahasa yang diterima oleh suatu FSA bisa dinyatakan secara sederhana dengan
ekspresi regular
 Ekspresi Regular (ER), memungkinkan menspesifikasikan atau mendefinisikan bahasa-
bahasa
 Notasi ekspresi regular terdiri dari simbol “+”, “∪”,”*” dan “.”
 Hubungan ekspresi regular dan finite state otomata adalah
 Untuk setiap ER ada satu NFA ε-move yang ekivalen
 Untuk setiap DFA ada satu ER dari bahasa yang di terima oleh DFA

3.2 Saran

Apabila di dalam penulisan makalah ini terdapat kesalahan baik dari segi penulisan atau
dari segi pembahasan kami mohon kritikan dan saran anda untuk memperbaikinya karena
kesempurnaan itu hanya milik allah swt.

You might also like