Bismillah…
Berawal dari tugas mata kuliah teknik kompilasi, saya searching di internet mencari contoh-contoh program sederhana untuk melakukan analisis leksikal (pembacaan setiap kata/karakter suatu program untuk diterjemahkan ke jenis-jenis token)
Jenis token yang saya gunakan disini ada 4 jenis pokok yaitu :
1. identifier bisa berupa keyword atau variabel
2. Konstanta
3. Operator
4. Delimiter
Source program yang dibaca juga dalam bahasa pascal, disini saya contohkan program untuk mengurutkan angka, listingnya sebagai berikut :
Program Urut_Bilangan;
Uses Wincrt;
Var A, B, C : integer;
Begin {mulai program utama}
Writeln(‘Program Mengurut Bilangan’);
Writeln(‘ ‘);
Writeln;
Write(‘Masukkan Nilai A: ‘);readln(A);
Write(‘Masukkan Nilai B: ‘);readln(B);
Write(‘Masukkan Nilai C: ‘);readln(C);
Writeln;
if (A<= B) and (A<= C) then
if (B<= C) then
Writeln(A,' ',B,' ',C)
else
Writeln(A,' ',C,' ',B)
else if (B<= A) and (B<= C) then
if (A<= C) then
Writeln(B,' ',A,' ',C)
else
Writeln(B,' ',C,' ',A)
else if (C<= A) and (C<= B) then
if (A<= B) then
Writeln(C,' ',A,' ',B)
else
Writeln(C,' ',B,' ',A)
End.
Dari program sumber tersebut, akan kita baca setiap karakter demi karakter, sehingga karakter/kata dalam program tersebut bisa dikelompokkan ke dalam 4 jenis token diatas. Kita ketahui, keyword adalah kata baku yang sudah disediakan oleh bahasa pemrograman, sehingga untuk memudahkan pengelompokan kata tersebut sebagai keyword atau bukan, terlebih dahulu dibuat file teks yang berisi daftar keyword dalam pascal. Saya coba buat file keyword.txt yang isinya :
and
array
begin
case
const
div
do
downto
else
end
file
for
function
goto
if
in
label
mod
nil
not
of
or
packed
procedure
program
record
repeat
set
then
to
type
until
uses
var
while
with
abs
arctan
boolean
char
chr
cos
dispose
eof
eoln
exp
false
get
input
integer
ln
maxint
new
odd
ord
output
pack
page
pred
put
read
readln
real
reset
rewrite
round
sin
sqr
sqrt
succ
text
true
trunc
unpack
write
writeln
wincrt
string
File teks ini nanti akan dicocokkan dengan setiap kata yang ditemukan dalam file sumber, sehingga bisa diidentifikasi kata tsb keyword atau bukan. Bila ada keyword yang belum masuk, silakan tambahkan saja di file teks tersebut.
Contoh program dalam bahasa pascal yang bisa digunakan untuk melakukan analisis leksikal :
program scanner; { judul program}
uses Wincrt;
var
prg_sumber,f_hasil:text;
karakter:Char;
kata,Nm_token:string;
procedure bacafile; { prosedur membaca file sumber }
begin
read(prg_sumber,karakter);
end;
procedure hasil; {prosedur utk menulis hasil setiap token}
begin
append(f_hasil); {menambah hasil scan ke file hasil}
writeln(f_hasil, kata : 15, ' : ', Nm_token);
writeln(kata : 15, ' : ', Nm_token); {mencetak hasil scan ke layar}
end;
function cekkeyword(s:string):string; {fungsi mengecek keyword atau bukan}
var
x : byte;
panjang : integer;
ftext : text;
data : string;
begin
panjang:= length(s); {konversi kata ke huruf kecil}
for x:=1 to panjang do
begin
if s[x] upcase (s[x]) then
s[x] := s[x]
else
s[x]:= chr(ord(s[x])+32);
end;
assign(ftext,’keyword.txt’);
reset(ftext);
while not eof(ftext) do {mencocokkan dgn tabel keyword}
begin
readln(ftext,data);
if s=data then Nm_token:=’Identifier / Keyword’;
end;
close(ftext);
end;
procedure periksa; {prosedur memeriksa setiap karakter file sumber}
begin
while not eof(prg_sumber) do {kerjakan sampai akhir file}
begin
bacafile;
if karakter = ‘{‘ then {mengabaikan/membuang komentar}
begin
repeat
begin
bacafile;
end;
until karakter = ‘}’;
kata:=”;
end;
if karakter = chr(39) then {mengecek tanda petik (‘)}
begin
repeat
begin
kata := kata + karakter;
bacafile;
end;
until karakter = chr(39) ;
kata := kata + karakter;
Nm_token := ‘Konstanta’;
hasil;
kata :=”;
end;
if (karakter in[‘A’..’Z’,’a’..’z’,’_’]) then {mengecek karakter/kata}
begin
repeat
begin
kata := kata + karakter;
bacafile;
end;
until (not(karakter in[‘A’..’Z’,’a’..’z’,’_’]));
Nm_token:=’Identifier / Variabel’;
cekkeyword(kata);
hasil;
kata :=”;
end;
if (karakter in[‘0’..’9′]) then {mengecek angka}
begin
repeat
begin
kata := kata + karakter;
bacafile;
end;
until (not(karakter in[‘0’..’9′]));
Nm_token := ‘Konstanta / Integer’;
hasil;
kata :=”;
end;
if (karakter in[‘+’,’-‘,’*’,’/’,”,’^’]) then
begin
repeat
begin
kata := kata+karakter;
bacafile;
end;
until (not(karakter in[‘+’,’-‘,’*’,’/’,”,’^’]));
Nm_token :=’Operator’;
hasil;
kata:=”;
end;
if (karakter in[‘(‘,’)’,'[‘,’]’,’^’,’:’,’;’,’,’,.]) then
begin
kata:=karakter;
Nm_token :=’Delimiter’;
hasil;
kata:=”;
end;
end;
end;
begin {=program utama=}
clrscr;
assign(prg_sumber,’urut.pas’); {menetapkan file sumber}
reset(prg_sumber); {membaca file sumber}
assign(f_hasil,’hasil.txt’); {menetapkan file hasil}
rewrite(f_hasil); {menghapus isi file hasil}
periksa; {menjalankan prosedur scan}
close(prg_sumber); {menutup file}
close(f_hasil);
readln;
end.
Jika program tersebut dijalankan, hasil analisisnya muncul di layar, dan juga terbentuk file teks yang saya beri nama hasil.txt, isinya sebagai berikut :
Program : Identifier / Keyword
Urut_Bilangan : Identifier / Variabel
; : Delimiter
Uses : Identifier / Keyword
Wincrt : Identifier / Keyword
; : Delimiter
Var : Identifier / Keyword
A : Identifier / Variabel
, : Delimiter
B : Identifier / Variabel
, : Delimiter
C : Identifier / Variabel
: : Delimiter
integer : Identifier / Keyword
; : Delimiter
Begin : Identifier / Keyword
Writeln : Identifier / Keyword
( : Delimiter
‘Program Mengurut Bilangan’ : Konstanta
) : Delimiter
; : Delimiter
Writeln : Identifier / Keyword
( : Delimiter
‘ ‘ : Konstanta
) : Delimiter
; : Delimiter
Writeln : Identifier / Keyword
; : Delimiter
Write : Identifier / Keyword
( : Delimiter
‘Masukkan Nilai A: ‘ : Konstanta
) : Delimiter
; : Delimiter
readln : Identifier / Keyword
( : Delimiter
A : Identifier / Variabel
) : Delimiter
; : Delimiter
Write : Identifier / Keyword
( : Delimiter
‘Masukkan Nilai B: ‘ : Konstanta
) : Delimiter
; : Delimiter
readln : Identifier / Keyword
( : Delimiter
B : Identifier / Variabel
) : Delimiter
; : Delimiter
Write : Identifier / Keyword
( : Delimiter
‘Masukkan Nilai C: ‘ : Konstanta
) : Delimiter
; : Delimiter
readln : Identifier / Keyword
( : Delimiter
C : Identifier / Variabel
) : Delimiter
; : Delimiter
Writeln : Identifier / Keyword
; : Delimiter
if : Identifier / Keyword
( : Delimiter
A : Identifier / Variabel
<= : Operator
) : Delimiter
and : Identifier / Keyword
( : Delimiter
A : Identifier / Variabel
<= : Operator
) : Delimiter
then : Identifier / Keyword
if : Identifier / Keyword
( : Delimiter
B : Identifier / Variabel
<= : Operator
) : Delimiter
then : Identifier / Keyword
Writeln : Identifier / Keyword
( : Delimiter
A : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
B : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
C : Identifier / Variabel
) : Delimiter
else : Identifier / Keyword
Writeln : Identifier / Keyword
( : Delimiter
A : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
C : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
B : Identifier / Variabel
) : Delimiter
else : Identifier / Keyword
if : Identifier / Keyword
( : Delimiter
B : Identifier / Variabel
<= : Operator
) : Delimiter
and : Identifier / Keyword
( : Delimiter
B : Identifier / Variabel
<= : Operator
) : Delimiter
then : Identifier / Keyword
if : Identifier / Keyword
( : Delimiter
A : Identifier / Variabel
<= : Operator
C : Identifier / Variabel
) : Delimiter
then : Identifier / Keyword
Writeln : Identifier / Keyword
( : Delimiter
B : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
A : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
C : Identifier / Variabel
) : Delimiter
else : Identifier / Keyword
Writeln : Identifier / Keyword
( : Delimiter
B : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
C : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
A : Identifier / Variabel
) : Delimiter
else : Identifier / Keyword
if : Identifier / Keyword
( : Delimiter
C : Identifier / Variabel
<= : Operator
) : Delimiter
and : Identifier / Keyword
( : Delimiter
C : Identifier / Variabel
<= : Operator
) : Delimiter
then : Identifier / Keyword
if : Identifier / Keyword
( : Delimiter
A : Identifier / Variabel
<= : Operator
B : Identifier / Variabel
) : Delimiter
then : Identifier / Keyword
Writeln : Identifier / Keyword
( : Delimiter
C : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
A : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
B : Identifier / Variabel
) : Delimiter
else : Identifier / Keyword
Writeln : Identifier / Keyword
( : Delimiter
C : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
B : Identifier / Variabel
, : Delimiter
' ' : Konstanta
, : Delimiter
A : Identifier / Variabel
) : Delimiter
End : Identifier / Keyword
. : Delimiter
Disitu terlihat setiap karakter atau kata di program sumber dikelompokkan ke 4 jenis pokok token dalam analisis leksikal.
Sekian pembahasan singkat saya, ada kekurangan silakan dibetulkan dan koreksi sendiri… terima kasih
Wassalam..
Desember 25, 2009 at 8:45 pm
mas,aku dah coba programnya tapi kok ada error “boolean expression expected” ya? mohon penjelasannya.THX.
Maret 13, 2011 at 9:03 pm
coba ditambah tanda sama dengan ( = )
jadi : if s[x]=upcase (s[x]) then
trus kalo ada eror lagi ganti tanda kutip satunya,,hapus,trus kita ketik sendiri tanda kutip satu ditempat tadi yang kita hapus..
q dh coba..
Februari 16, 2012 at 3:30 pm
qo masih error aja ya mas udh aq ganti semua ….
April 23, 2010 at 10:09 am
Ini Materi Pascal y pak
April 24, 2010 at 8:30 pm
salah satu bagian dr materi teknik kompilasi, bisa dgn bahasa pascal…
April 16, 2011 at 1:55 pm
saya sudah coba programnya dan programnya sukses. terima kasih pak. saya jadi bisa mengerjakan tugas saya
Oktober 30, 2011 at 10:45 pm
sama2, terima kasih dah berkunjung dan selamat belajar….
Desember 4, 2011 at 8:13 pm
mas,, ko error 122: invalid variable reference (cekkeyword(kata);) …
npa yah??
Maret 28, 2012 at 4:54 pm
mas saya mau tanya kalo misalnya cara buat procedure scann sederhana yang bisa baca bilangan bulat sama identifier gimana yaa ?
trus yg bilangan bulat bisa diikuti digit dan identifier bisa diikuti A-z,a-z,0-9.
mohon pencerahannya mas 😀
Maret 28, 2012 at 4:54 pm
tolong dibalas secepatnya mas lagi butuh buat buat tugas nih .. heheh
Mei 30, 2012 at 7:59 am
terima kasih banyak…!
saya sudah mencoba dan berhasil….
oh ya kalu untuk analis simantik kira kira program nya gimana yach?
thanx..
November 18, 2012 at 7:33 pm
kog runtime eror.. file txt nya diapain gan trus d taruh dmna
Maret 30, 2013 at 10:00 pm
masih eror pak
erornya disini ni
kata:=”
April 22, 2013 at 8:13 pm
kok saya masih error ya pak? saya udah coba ngetik sendiri tanda petiknya trs saya udah coba tambah = jadi if s[x]=upcase (s[x]) then.
Juni 16, 2013 at 6:44 pm
pak malah muncul Warning: Function result does not seem to be set, brarti ga ngebalikin nilai dong?
kok itu bisa ya yang lain
Juni 17, 2013 at 12:26 pm
saya sudah coba program nya tapi ada warning Function result does not seem to be set, di line close(ftext); end;
saya ganti ke procedure jg masih gagal, mohon penjelasan nya dong pak
Juni 30, 2013 at 9:42 am
maaf pa, mau nanya, saya nyoba bikin program ini, tapi ada error gini “Warning : function result does not seem to be set” , terus programnya langsung close terus, padahal udah pake readln, dan ga ngerti di bagian file txt nya, itu harus dibikin dulu manual apa langsung otomatis dibikin?
Agustus 2, 2013 at 1:51 pm
Proper forklift maintenance through AZ Metroway will help ensure your used forklift a long lifespan.
The good news is that training is supported by the employment
agencies, and many employers also conduct forklift training on-site.
For instance, incorporating 3- 4 tonnes of attachments to the class 1 carriages simply overburdens the trucks and turn out to be rather disadvantageous than being of any benefits.
November 15, 2013 at 11:30 pm
maaf bisa minta programnya langsung? mau dijadikan bahan acuan mata kuliah teknik kompilasi hehe makasih