4. ANALISIS LEKSIKAL
Struktur KompilerAnalisis Leksikal – Apa itu?
Masukan bagi sebuah compiler/interpreter adalah program sumber yang strukturnya berupa deretan dari karakter-karakter
o or rather unstructured
Pemrosesan individual karakter yang ketidakefisiennya sangat tinggi o Imagine recognizing ‘while’ as ‘w’ ‘h’ ‘i’ ‘l’ ‘e’
Oleh karenanya, hal pertama yang kita perhatikan adalah bentuk kode sumbernya
A Lexical Analyzer (scanner) mengubah deretan karakter-karakter menjadi deretan token-token
o i.e. a scanner “tokenizes” the input
Sebuah token (lexeme or syntactic unit) adalah komponen dasar leksikal dari program
Analisis Leksikal–Token
Token adalah level entitas yang paling rendah dalam diagram sintaks Jenis-jenis token antara lain:
o identifiers (e.g. variable & function names, etc.) o keywords (like while, if, function, etc.)
o operators (like +, -, *, ++, +=, etc.)
o literals (constant values like 27.3, “Hello”, etc.) o punctuation (like ‘;’, ‘:’, ‘,’, etc.)
Consider a simple program and its tokens:
Fungsi Scanner
o Melakukan pembacaan kode sumber dengan merunut karakter demi karakter o Mengenali besaran leksik
o Mentransformasi menjadi sebuah token dan menentukan jenis tokennya
o Mengirim token
o Membuang blank dan komentar dalam program o Menangani kesalahan
Scanning berdasarkan MSH (Mesin Stata Hingga = Finite State Automata (FSA))
Hampir sebagian besar teknik yang digunakan untuk membangun scanners menggunakan
mesin stata hingga (MSHs) atau Finite State Automata (FSA)
MSHs dapat dengan mudah digunakan untuk mengenali kontruksi bahasa (i.e. tokens) yang digambarkan dengan bahasa regular
Membangun Scanner
Bagaimana scanner berinteraksi dengan parser?
– parser akan menjadi bagian selanjutnya dari kompilasi Perhatikan gambar berikut:
Aksi Scanner
Karena scanner mengubah dari stata ke stata, maka harus dilakukan sesuatu dengan karakter-karakter tersebut untuk mengenali sesuai dengan pembentukan token yang akan dikembalikan pada tahap parser
Dalam beberapa kasus, harus menambahkan character seperti terlihat pada pembentukan token dan memanfaatkannya (menjadikan karakter masukan berikutnya menjadi kelihatan)
– E.g. when scanning characters in an identifier
Dalam kasus lainnya harus menjaga character dan mengembalikan dalam token lengkap
Aksi kemungkinan lainnya adalah menghilangkan karakter agar lebih sederhana – E.g. karakter pada komentar
Besaran Leksik
Besaran pembangun bahasa/leksik meliputi hal-hal sebagai berikut :
1. Identifier
Identifier dapat berupa keywords atau nama. Keywords adalah kata kunci yang sudah didefinisikan oleh suatu bahasa seperti Begin, End, If, Else dalam Pascal. Nama dideklarasikan sendiri oleh pemakai seperti nama variabel.
Contoh bila pada suatu program Pascal terdapat deklarasi: Var
Nomor: Integer; Suhu: Real;
Maka Nomor dan Suhu akan dikenali sebagai besaran leksik berupa nama variabel yang terdapat pada program tersebut. Sedangkan Var, Integer dan Real merupakan keyword
pada program tersebut. Nama bisa berupa nama program, procedure, var, type, constant. Keyword pada Pascal, misalnya : and, array, begin, case, const, div, do, downto, else, not, of, or, procedure, program, record, repeat, for, function, goto.
2. Nilai Konstanta
Nilai konstanta adalah suatu konstanta yang terdapat pada program. Bisa berupa konstanta integer, real, boolean, character, string dan sebagainya. Misalkan saja dalam Pascal pada suatu program terdapat statement.
N := R + 5 * 10
kata := kata1 + ‘makan’ A := 0.333
selesai := True
Maka 5, 10, ‘makan’, 0.333, True, termasuk besaran leksik berupa nilai konstan yang terdapat pada program sumber tersebut.
3. Operator dan Delimiter
Operator, misalnya operator aritmatika (+, - , * , /), operator logika (<, =, >)
4. Delimiter
Delimiter berguna sebagai pemisal/ pembatas, misalnya: ( ) , . ; : (kurung buka/tutup, koma, titik, titik koma, titik dua), white-space (pemisah yang diabaikan di program seperti spase, karakter enter, ganti baris, akhir file.
Contoh 1:
Misalkan terdapat sebuat source program: Program coba;
Var A : integer; Begin
A := A + 2; End.
Pada contoh di atas, besaran leksik (token) nya adalah simbol yang bernilai ‘Program’, ‘Coba’, ‘Var’, ‘A’, ‘Integer’, ‘;’, ‘:’, ‘+’, ‘.’,’2’, ‘:=‘, ‘Begin’, ‘End’.
Contoh 2 :
Ada urutan karakter yang disebut dengan statement Fahrenheit := 32 + celcius * 1,8
Maka akan diterjemahkan ke dalam token-token di bawah ini:
identifier fahrenheit operator := integer 32 operator + identifier celcius operator perkalian * real / float 1,8
Setiap bentuk dari token direpresentasi sebagai angka dalam bentuk internal, dan angkanya adalah unik. Misalnya nilai 1 untuk variabel, 2 untuk konstanta, 3 untuk label, 4 untuk operator, dst.
Contoh : Kondisi : If A > B then C = D;
Maka Scanner akan mentransformasikan ke dalam token-token sbb: kondisi3 : 26 If 20 A 1 > 15 B 1 then 21 C 1 D 1 ; 27
Token-token ini sebagai inputan untuk syntax analyser, token-token ini bisa berbentuk pasangan item. Dimana item pertama menunjukkan alamat atau lokasi dari token pada tabel simbol. Item kedua adalah representasi internal dari token.
Semua token direpresentasikan dengan informasi yang panjangnya tetap (konstan), suatu alamat (address atau pointer) dan sebuah integer (bilangan bulat).
Misalkan sebuah bahasa memiliki himpunan simbol terminal/token : ‘<‘ , ‘>’, ‘=‘, ‘<=‘, ‘>=‘ , ‘<>’
Atau bisa dibaca sebagai token-token : t_L, t_G, t_E, t_LE, t_GE, t_NE
(G=greater, L=Less, E=Equal, N=Not). Bahasa tersebut juga mendukung penulisan komentar yang diawali dengan ‘{‘ dan diakhiri dengan ’}‘. Kita lihat Diagram Keadaan untuk kumpulan token di atas pada gambar berikut :
Start t_L t_LE t_NE t_E t_GE t_G komentar apa saja selain } < = > = > = { }
Tabel State T(stata,karakter) dari Diagram State di atas :
Stata
Karakter
< > = { } apa saja
Start t_L t_G t_E komentar x x
t_L x t_NE t_LE x x x t_LE x x x x x x t_E x x x x x x t_NE x x x x x x t_G x x t_GE x x x t_GE x x x x x x
Komentar x x x x Start komentar
Formula tabel tersebut adalah :
j, jika ada transisi berlabel a dari i ke j T(i,a)=
x, jika tidak ada transisi berlabel a dari i Jika T(i,a) = x, maka ada 2 kemungkinan :
Jika stata i merupakan stata akhir berarti pada stata i telah ditemukan sebuah token. Jika stata i bukan stata akhir berarti pada stata i telah terdeteksi token tidak dikenal. Dalam Pascal, komentar tidak diperlukan lagi pada proses selanjutnya, karena itu
komentar tidak dimasukkan sebagai token. Setiap scanner menemukan awal komentar, scanner hanya mengambil simbol yang didapat tanpa disimpan ke dalam token. Setelah ditemukan akhir dari komentar, state dikembalikan ke state awal (serupa dengan white space)
Scanner biasanya diimplementasikan sebagai sebuah prosedur yang dipanggil oleh Parser. Contoh Prosedur scan sederhana yang akan membaca sebuah file input dan memberikan
token hasilnya dapat dilihat pada : Procedure GetChar;
Begin
Read(FileInput, Kar); end;
dimana :
Procedure Scan Begin
While Kar=‘ ‘ do GetChar ; {selama ketemu spasi maju terus} Repeat
Case Kar Of ‘<‘ : begin
GetChar ; Case Kar Of
‘=‘ : begin token:=t_LE; exit; end; ‘>’ : begin token:=t_NE; exit; end; else
begin token:=t_L; exit; end; end;
‘=‘ : begin token:=t_E; exit; end; ‘>’ : begin
GetChar ; If Kar = ‘=‘ then
begin token:=t_GE; exit; end else
begin token:=t_G; exit; end; end;
‘ { ‘: begin Repeat
GetChar ;
{maju sampai ketemu penutup komentar} Until Kar = ‘ } ‘
GetChar ;
{lanjutkan maju, tanpa memperoleh token} end;
EOF:exit; {akhir file}
Until False; {sampai ketemu sebuah token atau akhir file } End;