You are on page 1of 18

BAB 2

Analisis Leksikal
2.1Introduction
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:
identiIier, 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:
1. Menentukan token-token bahasa.
2. 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 inIormasi seperti komentar, blank, batas-batas baris dan lain-lain yang tidak
penting (tidak mempunyai arti) bagi parsing dan Code Generator.
Scanner juga harus dapat mengidentiIikasi token secara lengkap dan membedakan
keyword dan identiIier. Untuk itu scanner memerlukan tabel simbol. Scanner memasukkan
identiIier 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 terdeIinisi 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 Iitur
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 identiIier. 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, mengidentiIikasi sebagai
Type atau typedeI, sehingga analisis leksikal dapat memeriksa tabel simbol untuk menentukan
apakah lexeme adalah tipe token atau identiIier.

2.1.1 !eranan Analisis Leksikal
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 Iile, 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 Iile. 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.

2. Membaca karakter input dan menghasilkan output berupa token.Token akan akan dipakai
oleh pengurai parser sebagai input untuk analisa sintak
3. Menghubungkan pesan kesalahan kompilator dengan program sumbernya. Contoh :
baris dari program
4. 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 !elaksanaan 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 Iile. Dari Iile 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 eIisien
bekerja dengan nilai integer yang mempresentasikan simbol daripada string nyata
dengan panjang variabel.

2.1.2 Token, !ola , dan Leksim
Token adalah himpunan karakter yang mempunyai arti khusus. Token merupakan unit atau
elemen dasar bahasa komputer (seperti 'kata' di bahasa manusia), dimana unit tersebut tidak
terbagi lagi. Token merupakan bagian hasil dari pemecahan sumber program yaitu
penerjemahan lexeme pada saat melakukan scanner.
Token mereprentasikan nama:
identiIier
Keyword
literal string
operator
label
simbol tanda
Pola Pattern adalah aturan pembentukan suatu token
Leksim adalah sebarisan karakter program sumber yang sesuai dengan pola suatu token.
Contoh :: const pi 3.1416. Maka pi adalah leksim untuk token identier.
Reserved String artinya string yang sudah ditentukan, dan tidak dapat diubah atau dipakai.
Contoh : keywords

2.1.3 Atribut dari Token
Atribut - atribut suatu token
a. DeIinisi : InIormasi tambahan yang berhubungan dengan suatu token
b. Contoh : nilai atribut dan token untuk statement FORTRAN, E M*C**2, atribute
ditulis dalam bentuk pasangan token dan atribut
<id, pointer e entri tabel simbol untuk E
<assign_op,
<id, pointer e entri tabel simbol untuk M
<mult_op,
<id, pointer e entri tabel simbol untuk C
<exp_op,
<num, nilai integer 2

2.1.4 Kesalahan Leksikal dan Input Buffering
Kesalahan leksikal
Merupakan kesalahan dalam mengetik atau mengeja. Sedikit yang dapat dideteksi,
Contoh :: jika Ii ditemukan pada program C: Ii (a I (x)) penganalisa leksikal tidak
dapat menentukan bahwa Ii salah ejaan. Kesalahan ini akan dideteksi di Iase lain yakni
parser.
ang dapat dilakukan jika ada kesalahan pada awal token:
O menghapus karakter-karakter sampai token dapat dibentuk
O menghapus karakter yang berlebihan
O menyisipkan karakter yang hilang
O mengganti karakter dengan karakter yang benar
O mengubah posisi dua karakter yang berdampingan

Input Buffering
Digunakan karena pada kebanyakan bahasa sumber penganalisa leksikalnya kadang
kadang perlu mengetahui beberapa karakter tambahan di luar leksim untuk menentukan
bahwa leksim yang ditemukan sesuai dengan salah satu pola token. Proses ini sangat
memakan waktu.
Algoritma pointer Iorward
if forward pada akhir bufer kiri then
baca N karakter ke bufer kanan
forward := forward+1
end
else if forward pada akhir bufer kanan then
baca N karakter ke bufer kiri
pindahkan forward ke awal bufer kiri
end
else
forward := forward+1

Ada maksimal 2 kali test (akhir buIer kiri dan akhir buIIer kanan) setiap kali baca satu
karakter. ,/i m,simum ,/, 4N test.

$kema input dua buffer dengan sentinel
Suatu karakter sentinel biasanya eoI diletakkan pada akhir kedua sisi buIIer.
forward := forward +1
if forward not = eof then begin
if forward pada akhir sisi kiri then begin
baca N karakter ke bufer kanan
forward := forward+1
else if forward pada akhir sisi kanan then begin
baca N karakter ke bufer kiri
pindahkan forward ke awal bufer kiri
end

else / eof merupakan akhir input /
hentikan analisa leksikal
Ada 2 ( n + 2 ) test


2.1.5 $pesifikasi dari Token
O AlIabet / kelas karakter adalah sembarang himpunan simbol, banyaknya hingga. Contoh
: 0,1}, ASCII EBCDIC,
O string terhadap alIabet adalah barisan hingga dari simbol simbol, dibentuk dari alIabet. (
Dalam teori bahasa, kalimat = kata = string )
O Panjang string S, ,S, adalah banyaknya simbol yang muncul pada S.
O String kosong (e) adalah string yang panjangnya nol,
O Bahasa adalah sembarang himpunan string terhadap alIabet tertentu
O Penggabungan string x dan y (concatenation) ditulis sebagai xy

rammar
Konsep Dasar
O Anggota alIabet dinamakan simbol terminal.
O Kalimat adalah deretan hingga simbol-simbol terminal.
O Bahasa adalah himpunan kalimat-kalimat. Anggota bahasa bisa tak hingga kalimat.
O Simbol-simbol berikut adalah simbol terminal :
huruI kecil, misalnya : a, b, c, 0, 1, ..
simbol operator, misalnya : , , dan L
simbol tanda baca, misalnya : (, ), dan ;
string yang tercetak tebal, misalnya : if, then, dan else.

O Simbol-simbol berikut adalah simbol non terminal /Variabel :
huruI besar, misalnya : A, B, C
huruI S sebagai simbol awal
string yang tercetak miring, misalnya 057
O HuruI yunani melambangkan string yang tersusun atas simbol-simbol terminal atau
simbol-simbol non terminal atau campuran keduanya, misalnya : -, ., dan .
O Sebuah produksi dilambangkan sebagai - F ., artinya : dalam sebuah derivasi dapat
dilakukan penggantian simbol - dengan simbol ..
O Derivasi adalah proses pembentukan sebuah kalimat atau sentensial. Sebuah derivasi
dilambangkan sebagai : - ..
O Sentensial adalah string yang tersusun atas simbol-simbol terminal atau simbol-simbol
non terminal atau campuran keduanya.
O Kalimat adalah string yang tersusun atas simbol-simbol terminal. Kalimat adalah
merupakan sentensial, sebaliknya belum tentu..
Grammar :
Grammar G dideIinisikan sebagai pasangan 4 tuple : V
T
, V
N
, S, dan P, dan dituliskan
sebagai G(V
T
, V
N
, S, P), dimana :
V
T
: himpunan simbol-simbol terminal (alIabet) kamus
V
N
: himpunan simbol-simbol non terminal
SZV
N
: simbol awal (atau simbol start)
P : himpunan produksi
Contoh:
G
1
: V
T
a}, V
N
S}, P S F aSa}
S aS
aaS
aaa L(G
2
) a
n
n _ 1}
L(G1)a, aa, aaa, aaaa,.}

perasi Dasar $tring
Diberikan dua string : ,-c, dan y 123
O PreIik string adalah string yang dihasilkan dari string dengan menghilangkan nol
atau lebih simbol-simbol paling belakang dari string tersebut.
Contoh : ,-c, ,-, ,, dan 1 adalah semua PreIix()
O ProperPreIix string adalah string yang dihasilkan dari string dengan menghilangkan
s,tu atau lebih simbol-simbol paling belakang dari string tersebut.
Contoh : ,-, ,, dan 1 adalah semua ProperPreIix()
O PostIix (atau SuIix) string adalah string yang dihasilkan dari string dengan
menghilangkan nol atau lebih simbol-simbol paling depan dari string tersebut.
Contoh : ,-c, -c, c, dan 1 adalah semua PostIix()
O ProperPostIix (atau PoperSuIix) string adalah string yang dihasilkan dari string
dengan menghilangkan s,tu atau lebih simbol-simbol paling depan dari string tersebut.
Contoh : -c, c, dan 1 adalah semua ProperPostIix()
O Head string adalah simbol paling depan dari string .
Contoh : , adalah Head()
O Tail string adalah string yang dihasilkan dari string dengan menghilangkan simbol
paling depan dari string tersebut.
Contoh : -c adalah Tail()
O Substring string adalah string yang dihasilkan dari string dengan menghilangkan nol
atau lebih simbol-simbol paling depan dan/atau simbol-simbol paling belakang dari string
tersebut.
Contoh : ,-c, ,-, -c, ,, -, c, dan 1 adalah semua Substring()
O ProperSubstring string adalah string yang dihasilkan dari string dengan
menghilangkan s,tu atau lebih simbol-simbol paling depan dan/atau simbol-simbol
paling belakang dari string tersebut.
Contoh : ,-, -c, ,, -, c, dan 1 adalah semua Substring()
O Subsequence string adalah string yang dihasilkan dari string dengan menghilangkan
nol atau lebih simbol-simbol dari string tersebut.
Contoh : ,-c, ,-, -c, ,c, ,, -, c, dan 1 adalah semua Subsequence()
O ProperSubsequence string adalah string yang dihasilkan dari string dengan
menghilangkan s,tu atau lebih simbol-simbol dari string tersebut.
Contoh : ,-, -c, ,c, ,, -, c, dan 1 adalah semua Subsequence()
O Concatenation adalah penyambungan dua buah string. Operator concatenation adalah
conc,te atau tanpa lambang apapun.
Contoh : concate(y) y ,-c123
O Alternation adalah pilihan satu di antara dua buah string. Operator alternation adalah
,ltern,te atau .
Contoh : alternate(y) y ,-c atau 123
O Kleene Closure : * 1. 1
2

3
.
O Positive Closure :

.
2

3
.

perasi-operasi pada bahasa union, concatenation, closure
L U M s , s e L or s e M }
LM s t , s e L and t e M }
Closure Kleene dari L adalah ( I
-
) I
\
=0

Closure positiI dari L adalah ( I
+
) I
\
=1

Contoh : L A, B, ., Z, a, b, ., z}
D 0, 1, ., 9}
L U D Himpunan huruI dan digit
L D Himpunan string yang terdiri dari huruI diikuti oleh digit
L* Himpunan semua string huruI, termasuk e
D Himpuanan semua string dari satu atau lebih digit.
L ( L U D )* Himpunan dari semua string huruI dan digit, dimulai dengan huruI


2.1.6 Ekspresi Regular
Regular Expression berguna sebagai notasi untuk mendeIinisikan suatu pola.
Aturan pendeIinisian ekspresi regular terhadap alphabet
1. e adalah ekspresi regular untuk e }.
2. ika a adalah symbol di dalam , maka a adalah ekspresi regualar untuk a }.
3. r, s ekspresi regular untuk L ( r ) dan L ( s ), maka :
O ( r ) , ( s ) adalah ekspresi regular untuk L ( r ) U L ( s ).
O ( r ) * adalah ekspresi regular untuk ( L ( r ) )*.
O ( r ) adalah ekspresi regular untuk L ( r ).
Contoh : a, b }
1. a , b ekspresi regular untuk a, b}
2. ( a , b ) ( a , b ) 7 aa, ab, ba, bb }
3. a* ekspresi regular untuk e, a, aa, aaa, .}
4. ( a , b )* ekspresi regular untuk himpunan semua string yang memuat nol atau lebih a atau
b
5. a , a * b ekspresi regular untuk himpunan yang memuat a dan semua string memuat nol
atau lebih diikuti oleh b.
adi, r dan s menyatakan bahasa yang sama, dikatakan r dan s ekivalen dan ditulis r s.
Contoh : ( a , b ) ( b , a )
Hukum-hukum aljabar pada ekspresi regular
O , komutatiI r , s s , r
O , asosiatiI r , ( s , t ) ( r , s ) , t
O Concatenation asosiatiI ( r s ) t r ( s t )
O Concatenation distributive terhadap , r ( s , t ) r s , r t ( s , t ) r s r , s t
O e elemen concatenation dari e r r , r e r
O Relasi antara * dan e, r* ( r , e )*
O * Indepoten r** r*
DeIenisi Beraturan ( Notasi lain dari ekspresi regular ). Barisan dari deIinisi deIenisi
dalam bentuk:

1
7 J
1

7 J


...

7 J




Dimana masing masing
1
adalah nama nama yang berbeda, dan masing masing
J
1
adalah ekspresi regular terhadap symbol symbol di U
1
, .,
1
}
Contoh : DeIinisi regular untuk himpunan identiIier Pascal
letter 7 A | B | .| Z | a | b | . | z
digit 7 0 | 1 | . | 9
id 7 letter ( letter | digit )

Beberapa singkatan notasi:
1. adalah satu atau lebih symbol 7 I
+
a, aa, aaa, . }
2. adalah nol atau satu symbol 7 r r , e
3. .| adalah kelas-kelas karakter a - - z| menotasikan 7 a , b , . , z
adi, id dapat dinotasikan sebagai A-Za-z| A-Za-z0-9|*

enentukan token kalau sudah sesuai pola
Digunakan diagram peralihan ( transition diagram ) menggambarkan aksi yang terjadi
sewaktu menganalisa leksikal ( scanner ) dipanggil oleh pengurai ( parser ).
Contoh: stmt 7 IF expr THEN stmt | IF expr THEN stmt ELSE
stmt | e
expr 7 term RELJP term | term
term 7 ID | NUM
suatu lexim akan diklasiIikasikan sebagai salah satu dari IF, THEN, ELSE, RELOP, ID,
dan NUM jika lexim yang dibaca memenuhi sisi kanan ekspresi beraturan berikut:
IF 7 if
THEN 7 then
ELSE 7 else
RELJP 7 < | <= | = | < | | =
ID 7 letter ( letter|digit )
NUM 7
+
(.
+
) . (E(+ | -) .
+
.
Diasumsikan lexim dipisahkan blank, tab, newline, sehingga space akan hilang dengan
membandingkan karakter input dengan deIines regular ws.
delim 7 blank | tab | newline
ws 7
+

Leksim akan diproses dan outputnya akan berupa pasangan token yang sesuai pola dan
atributnya.
Ekspresi regular token nilai atribut
ws - -
iI IF -
then THEN -
else ELSE -
id id pointer ke entri table
num num pointer ke entri table
relop LT
relop LE
relop EQ
~ relop NE
~ relop GT
~ relop GE


Contoh diagram transisi untuk token relop

Diagram transisi untuk keyword dan identiIier



Contoh diagram transisi untuk bilangan non negative dalam Pascal

Diagram transisi untuk spasi



2.2Algoritma $canner
Algoritma membaca program sumber
type Text_Pos = record ,posisi penunjuk karakter,
Row_Numb : word; ,baris ke-, bisa ribuan
baris/program_sumber,
Char_Numb : byte; ,karakter ke-, maksimum 255
karakter/baris,
end;
var Now_Pos : Text_Pos; ,posisi sekarang,
Line : string; ,baris yang sedang diproses,
End_of_line : byte; ,posisi akhir baris yang sedang diproses,
procedure Next_Character(var Ft : text); ,baca karakter berikut pada
program_sumber,
begin
with Now_Pos do ,coba tebak, apa itu perintah with ... do .,
begin
if Char_Numb = End_of_line then
begin
8t_3e; ,menampilkan kembali baris yang telah
dibaca, beserta errornya,
Next_3e(Ft); ,membaca baris berikutnya,
Row_Numb := Row_Numb + 1;
Char_Numb := 1
end
else
Char_Numb := Char_Numb + 1;
character := LineChar_Numb,
end
end;
procedure 8t_3e;
begin
write,Now_Pos.Row_Numb : 3, ` `);
writeln(Line);
8t_Error; ,menampilkan kesalahan-kesalahan yang terjadi pada suatu
baris,
End

procedure Next_3e(Ft : text);
begin
readln(Ft, Line);
End_of_line := length(Line) + 1:
Line := Line + #32; ,karakter spasi,
end;

Algoritma $canner
Procedure GetChar;
Begin
Read(FileInput, Kar);
end;
dimana :
FileInput : text, Kar: character
Procedure Scan
Begin
While Kar=` ` do GetChar ; ,selama ketemu spasi maju terus,
Repeat
Case Kar Jf
`<` : begin
GetChar ;
Case Kar Jf
`=` : 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;
EJF:exit; ,akhir file,
Until False; ,sampai ketemu sebuah token atau akhir file ,
End;
2.3Finite Autormata
Bahasa dapat juga dipandang sebagai entitas-entitas abstrak yang dapat dikenali atau
dibangkitkan oleh mesin komputasi Mesin komputasi yang sesuai untuk kelas bahasa ini adalah
Finite (state) Automata. Finite Automata adalah sebuah model matematika dengan input dan
output diskrit. Untuk menggambarkan perilaku Finite Automata digunakan Finite State Diagram
atau State Transition Diagram

O FSA dideIinisikan sebagai pasangan 5 tupel : (Q, _, o, S, F).
Q : himpunan hingga state
_: himpunan hingga simbol input (alIabet)
o: Iungsi transisi, menggambarkan transisi state FSA akibat pembacaan simbol input.
Fungsi transisi ini biasanya diberikan dalam bentuk tabel.
S Z Q : state AWAL
F Q : himpunan state AKHIR
Bentuk state dari FA



2.3.1 Deterministic Finite $tate Automata

O Penggolongan ini berdasarkan pada pendeIinisian kemampuan berubah state-statenya.
O Untuk deterministic Iinite automata (DFA), dari suatu state ada tepat satu state berikutnya
untuk setiap simbol masukan yang diterima.
O Deterministic Iinite automata mempunyai state berikutnya yang unik untuk setiap
pasangan state-input
O Tabel transisi menyatakan aksi suatu mesin
O Pada DFA, d merupakan sebuah Iungsi yang harus terdeIinisi untuk semua pasangan
state-input yang ada dalam Q X S.
O suatu string x dinyatakan diterima bila d(S,x) berada pada state akhir. Biasanya secara
Iomal dikatakan bila M adalah sebuah bahasa yang disebut L(M) yang merupakan x,
d(S,x) di dalam F}

2.3.2 Nondeterministic Finite $tate Automata

W Pada Non-Deterministic Finite Automata (NFA), dari suatu state bisa terdapat 0, 1 atau
lebih busur keluar (transisi) berlabel simbol input yang sama.
W Pada setiap pasangan state-input, dapat memiliki 0 (nol) atau lebih pilihan untuk state
berikutnya.



2.4Ekspresi Regular dalam Finite Autormata
2.4.1 Konversi NFA ke DFA
W Mulai dari state awal NFA, kemudian mengikuti transisinya untuk membentuk state-state
baru, untuk setiap state yang terbentuk diikuti lagi transisinya sampai tercover semua
W ika state baru yang terbentuk sama cukup ditulis sekali saja
W ika state baru yang terbentuk adalah state O, maka state O tersebut harus tetap
digambarkan sebagai sebuah state
W Semua state pada DFA yang mengandung Iinal state NFA akan menjadi Iinal state

Contoh:


2.4.2 $imulasi DFA
Simulasi DFA dimaksudkan untuk mengenali token.
type Token_Kind = record
tipe : byte;
nilai : byte
end;
var Token : array0..Max_State, of Token_Kind;
Found_Token : Token_Kind; ,token yang ditemukan,
Tok_Pos : Text_Pos; ,posisi token dalam program sumber,
procedure Next_Toke3(var Ft : text); ,digunakan untuk mengenali sebuah token,
var state1, state2 : shortint;
begin
state1 := 0;
Tok_Pos := Now_Pos;
repeat
state2 := Next_State(state1, character);
if state2 < -1 then ,-1 bersesuaian dengan x pada tabel
transisi,
begin
state1 := state2;
Next_Character(Ft); ,baca karakter berikut pada
program_sumber,
,di antaranya menghasilkan nilai baru untuk Now_Pos,
end;
until state2 = -1;
Act_for_Toke3(state1);
end;

procedure Act_for_Toke3(state : shortint);
var Tok_Length : byte;
Err : integer;
begin
Curre3t_Toke3(Tokenstate,.tipe, Tokenstate,.nilai);
Tok_Length := Now_Pos.Char_Numb - Tok_Pos.Char_Numb;
case Tokenstate,.tipe of
0 : Error(`Token tidak dikenal!', Tok_Pos);
27 : Id := copy(Line, Tok_Pos.Char_Num, Tok_Length);
28 : val(copy(Line, Tok_Pos.Char_Num, Tok_Length), IN, Err);
29 : val(copy(Line, Tok_Pos.Char_Num, Tok_Length), RN, Err);
end
end;
catatan :
- copy(string, start, length) mengembalikan substring
- val(stringvalue, numbervariable, errorIlag) :
jika stringvalue 137` maka numbervariable 137 dan errorIlag 0
jika stringvalue string` maka numbervariable 137 dan errorIlag ,0
- Token.tipe t1, 2, 3, ..., 26} dimisalkan bernilai pasti, sehingga tidak perlu penanganan
lebih lanjut

procedure Curre3t_Toke3(tipe, nilai : byte);
begin
Found_Token.tipe := tipe;
Found_Token.nilai := nilai;
end;

You might also like