Apa itu Lexical Analyzer / scanner?
Lexical Analyzer adalah bagian dari compiler bahasa pemrograman yang bertuas untuk menindaklanjuti listng program yang telah dibuat oleh user(programmer), lexycal analyzer ini menghasilkan token-token yang akan dilaporkan kepada parser (analisis sintaks) untuk di'cek kesempurnaan'nya..
Di sini saya akan berbagi contoh membuat lexical analyzer sederhana pada compiler bahasa pemrograman Pascal..
Pertama, kita buat program untuk di cek kebenarannya dan kita beri nama urut.pas
berikut adalah listing program'nya..
Program Urut_Bilangan;
Uses crt;
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);
readln;
End.
Kemudian, kita buat listing kata atau keyword yang bisa dideteksi oleh program scanner yang akan kita buat..
berikut ini adalah keyword'nya, kita buat di notepad dan beri nama keyword.txt
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
Tambah'kan keyword yang lain jika anda rasa keyword di atas kurang lengkap..
Selanjutnya, kita buat program Scanner'nya..
Berikut adalah listing program'nya..
program scanner; { judul program}
uses crt;
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 = char(39) then {mengecek tanda petik (`)}
begin
repeat
begin
kata := kata + karakter;
bacafile;
end;
until karakter = char(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.
Save dan compile semua program'nya, dan simpan semua file yang telah dibuat ke dalam satu folder..
Jalankan Program'nya.. maka program scanner akan menampilkan listing token yang telah dibuat, listing token tersebut akan tersmpan pada file hasil.txt yang otomatis terbuat pada folder tempat menyimpan program scanner tersebut..
sumber code
Sabtu, 19 Oktober 2013
Membuat Program Lexical Analyzer (scanner) pada Pascal
Langganan:
Posting Komentar (Atom)
0 komentar:
Posting Komentar