You are on page 1of 10

Modul Peraktikum MTB

Teknik Kompilasi (T.Informatika)

MODUL PERAKTIKUM TEKNIK KOMPILASI II


PROGRAM SCANNER LANJUT (KOMPLEKS)
*****************************************************

Berikut ini adalah program scanner yang menerima input suatu file kode sumber dalam
bahasa pascal, kemudian menghasilkan suatu file text yang berisi daftar token-token yang
terdapat dalam program.

PROGRAM SCANNER;
USES CRT;
TYPE
TOKENTYPE = ( TNONE,
TIDENTIFIER,
TINTEGER,
TREAL,
TCHARCONSTANT,
TSTRING,
TPLUS,
TMIN,
TMULT,
TDIV,
TASSIGMENT,
TTITIKDUA,
TRANGE,
TKOMA,
TTITIK,
TTITIKKOMA,
TEQUAL,
TINEQUAL,
TLESS,
TLESSEQU,
TGREATER,
TGREATEREQU,
TKURUNGSIKUBUKA,
TKURUNGSIKUTUTUP,
TKURUNGBUKA,
TKURUNGTUTUP,
TKEYAND,
TKEYARRAY,
TKEYBEGIN,
TKEYCASE,
TKEYCONST,
TKEYDIV,
TKEYDO,
TKEYDOWNTO,
TKEYELSE,
TKEYEND,
TKEYFILE,
TKEYFOR,
TKEYFUNCTION,
TKEYGOTO,
TKEYIF,
TKEYIN,
TKEYLABEL,
TKEYMOD,
TKEYNIL,
TKEYNOT,
TKEYOF,
TKEYOR,
TKEYPACKED,
TKEYPROCEDURE,
TKEYPROGRAM,
TKEYRECORD,
TKEYREPEAT,
TKEYSET,
Modul Peraktikum MTB
Teknik Kompilasi (T.Informatika)
TKEYTHEN,
TKEYTO,
TKEYTYPE,
TKEYUNTIL,
TKEYVAR,
TKEYWHILE,
TKEYWITH
);
SCANERRORTYPE = (ERRNONE,
ERRSCANUNEXPCHAR,
ERRSCANFLOAT,
ERRSCANINT,
ERRSCANAPOSTEXP,
ERRSCANUNEXPEOF
);
CONST
ENDFILE = #26;
JMLKEYWORD = 44;
KEYWORD : ARRAY [1..JMLKEYWORD] OF STRING[9] = (
'AND', 'ARRAY','BEGIN', 'BOOLEAN', 'CASE',
'CONST', 'CHAR', 'DIV', 'DO', 'DOWNTO',
'ELSE', 'END', 'FILE', 'FOR',
'FUNCTION','GOTO', 'IF', 'IN',
'INTEGER', 'GOTO', 'IF', 'IN',
'INTEGER', 'LABEL','MOD', 'NIL', 'NOT',
'OF', 'OR', 'PACKED', 'PROCEDURE',
'PROGRAM', 'REAL', 'RECORD', 'REPEAT', 'SET',
'STRING', 'THEN', 'TO', 'TYPE', 'UNTIL',
'VAR', 'WHILE','WITH'
);
EMAX = 38;
EMIN = -38;
JMLSIGDGT = 5;
VALMAX = 16383;
MAXINFO = 128;

VAR
SCANSTR : STRING;
TOKEN : TOKENTYPE;
INUM : LONGINT;
RNUM : REAL;
CC : CHAR;

FILESOURCE,FILERES : STRING;
INFILE,RESFILE : TEXT;
ERRCOUNTER : INTEGER;
LINECOUNTER : INTEGER;
LOKASI : ARRAY [1..MAXINFO] OF STRING;
JINFO : INTEGER;

FUNCTION OPENFILE:BOOLEAN;
VAR
I : INTEGER;
OPEN1,OPEN2 : BOOLEAN;
BEGIN
WRITELN;WRITE('FILE WILL BE PARSED (.PAS) : ');
READLN(FILESOURCE);
I:=POS('.',FILESOURCE);
IF I<>0 THEN FILESOURCE:=COPY(FILESOURCE,1,I-1);

WRITE('OUTPUT FILE (.TXT) : ');


READLN(FILERES);WRITELN;
I:=POS('.',FILERES);
IF I<>0 THEN FILERES:=COPY(FILERES,1,I-1);

OPENFILE:=TRUE;
ASSIGN(INFILE,FILESOURCE+'.PAS');
RESET(INFILE);
IF IORESULT <> 0 THEN
BEGIN
WRITELN('FILE ',FILESOURCE,'.PAS DOESN''T EXIST...');
Modul Peraktikum MTB
Teknik Kompilasi (T.Informatika)
OPENFILE:=FALSE;
END
ELSE
BEGIN
ASSIGN(RESFILE,FILERES+'.TXT');
REWRITE(RESFILE);
IF IORESULT <> 0 THEN
BEGIN
WRITELN(FILERES,'.TXT CAN''T BE MADE...');
OPENFILE:=FALSE;
END
END;
END;

FUNCTION UPPERCASE(STR:STRING):STRING;
VAR
I : INTEGER;
BEGIN
FOR I := 1 TO LENGTH(STR) DO
STR[I] := UPCASE(STR[I]);
UPPERCASE:=STR;
END;

PROCEDURE INCLINE(VAR LINECOUNTER : INTEGER);


BEGIN

GOTOXY(1,WHEREY);
LINECOUNTER:=LINECOUNTER+1;
WRITE('PROCESSING LINE : ',LINECOUNTER);
END;

PROCEDURE READCHAR;
BEGIN
READ(INFILE,CC);
END;

PROCEDURE PROSERR(ERR:SCANERRORTYPE);
BEGIN
GOTOXY(25,WHEREY);
WRITE('*ERROR :');
CASE ERR OF
ERRSCANUNEXPCHAR : BEGIN WRITE('UNEXPECTED CHARACTER ', CC);
READCHAR;
END;
ERRSCANAPOSTEXP : WRITE(#39' EXPECTED');
ERRSCANUNEXPEOF : BEGIN WRITE('UNEXPECTED END OF FILE ');
READLN; HALT;
END;
ERRSCANFLOAT : WRITE('FLOATING POINT FORMAT ERROR');
ERRSCANINT : WRITE('INTEGER VALUE ERROR');
END;
READLN;
END;

PROCEDURE WRITEFILE;
VAR
I : INTEGER;
ADAINFO : BOOLEAN;
BEGIN
WRITE(RESFILE,' ');
WRITE(RESFILE,ORD(TOKEN):2);
WRITE(RESFILE,' ');
CASE TOKEN OF
TIDENTIFIER:
BEGIN
ADAINFO := FALSE;
I := 0;
REPEAT
I := I + 1;
IF LOKASI[I] = SCANSTR THEN ADAINFO := TRUE;
UNTIL (ADAINFO) OR (I > JINFO);
Modul Peraktikum MTB
Teknik Kompilasi (T.Informatika)
IF (NOT ADAINFO) AND (JINFO < MAXINFO) THEN
BEGIN
JINFO := JINFO + 1;
LOKASI[JINFO] := SCANSTR;
WRITE(RESFILE,JINFO:4);
END
ELSE
WRITE(RESFILE,I:4);
WRITE(RESFILE,' '+SCANSTR);
END;
TINTEGER:
BEGIN
IF (JINFO<MAXINFO) THEN
BEGIN
JINFO:=JINFO + 1;
LOKASI[JINFO] := SCANSTR;
WRITE(RESFILE,JINFO:4);
END;
WRITE(RESFILE,' ');
WRITE(RESFILE,INUM);
END;
TREAL:
BEGIN
IF (JINFO<MAXINFO) THEN
BEGIN
JINFO := JINFO + 1;
LOKASI[JINFO]:=SCANSTR;
WRITE(RESFILE,JINFO:4);
END;
END;
TCHARCONSTANT, TSTRING:
BEGIN
IF (JINFO < MAXINFO) THEN
BEGIN
JINFO := JINFO + 1;
LOKASI[JINFO] := SCANSTR;
WRITE(RESFILE,JINFO:4);
WRITE(RESFILE,' ');
WRITE(RESFILE,SCANSTR);
END;
END;
ELSE
BEGIN
WRITE(RESFILE,0:4);
WRITE(RESFILE,' ');
WRITE(RESFILE,SCANSTR);
END;
END;
WRITELN(RESFILE,'');
END;

PROCEDURE SCAN;
CONST
SPACE = #32;
TAB = #9;
CR = #13;
LF = #10;
VAR ADATOKEN : BOOLEAN;
I,J,K,E : INTEGER;
KEYTOKEN : TOKENTYPE ABSOLUTE K;
TAMPSTR : STRING;
ERROR : SCANERRORTYPE;
EX,COMMENT : BOOLEAN;

PROCEDURE GETEXP;
VAR PANGKAT,SIGN : INTEGER;
BEGIN
SIGN := 1; PANGKAT := 0;
READCHAR;
IF CC IN ['+','-'] THEN
BEGIN
Modul Peraktikum MTB
Teknik Kompilasi (T.Informatika)
IF CC='-' THEN SIGN := -1;
READCHAR;
END;
IF NOT (CC IN ['0'..'9']) THEN ERROR := ERRSCANFLOAT
ELSE
BEGIN
REPEAT
PANGKAT := 10 * PANGKAT + ORD(CC)-ORD('0');
READCHAR;
UNTIL NOT (CC IN ['0'..'9']);
E := E + PANGKAT * SIGN;
END;
END;

PROCEDURE KONVERTOREAL;
VAR S:INTEGER; D,T:REAL;
BEGIN
IF k + E > EMAX THEN ERROR := ERRSCANFLOAT
ELSE
IF K + E < EMIN THEN RNUM := 0
ELSE
BEGIN
S := ABS(E); T:=1.0; D:=10.0;
REPEAT
WHILE NOT ODD(S) DO
BEGIN S:=S DIV 2; D:=SQR(D); END;
S:=S-1; T:=D*T;
UNTIL S=0;
IF E>=0 THEN RNUM:=RNUM*T ELSE RNUM:=RNUM/T;
END;
END;

BEGIN
ADATOKEN := FALSE;
WHILE (NOT ADATOKEN) DO
BEGIN
ERROR := ERRNONE; COMMENT := FALSE; TOKEN:=TNONE;
WHILE CC IN [CR, LF, TAB, SPACE] DO
BEGIN
IF CC=LF THEN INCLINE(LINECOUNTER);
READCHAR;
END;
IF CC=ENDFILE THEN EXIT;
CASE CC OF
'A'..'Z','A'..'Z':
BEGIN
SCANSTR:=' ';
REPEAT
SCANSTR:=SCANSTR+CC;
READCHAR;
UNTIL NOT (CC IN ['a'..'z','A'..'Z','0'..'9','_']);
TAMPSTR:=UPPERCASE(SCANSTR);
I:=1; J:=JMLKEYWORD;

REPEAT
K:=(I+J) DIV 2;
IF TAMPSTR<=KEYWORD[K] THEN J:=K-1;
IF TAMPSTR<=KEYWORD[K] THEN J:=K-1;
UNTIL I>J;

IF I-J>1 THEN
BEGIN K:=K+ORD(TKURUNGTUTUP); TOKEN := KEYTOKEN; END
ELSE
BEGIN TOKEN := TIDENTIFIER;
SCANSTR:=COPY(SCANSTR,1,10); END;
END;

'0'..'9':
BEGIN
K:=0; INUM:=0; TOKEN:=TINTEGER;
REPEAT
Modul Peraktikum MTB
Teknik Kompilasi (T.Informatika)
INUM:=INUM*10 + ORD(CC) - ORD('0');
K:=K+1;
READCHAR;
UNTIL NOT (CC IN ['0'..'9']);
IF (K>JMLSIGDGT) OR (INUM>VALMAX) THEN
BEGIN
ERROR:=ERRSCANINT; K:=0; INUM:=0; END;
IF CC='.' THEN
BEGIN SCANSTR:='..'; END
ELSE
BEGIN
IF NOT (CC IN ['0'..'9']) THEN
BEGIN
ERROR:=ERRSCANFLOAT;
IF CC IN ['e'..'E'] THEN GETEXP;
END
ELSE
BEGIN
TOKEN:=TREAL; RNUM:=INUM; E:=0;
REPEAT
E:=E-1;
RNUM:=RNUM*10+ORD(CC)-ORD('0');
READCHAR;
UNTIL NOT (CC IN ['0'..'9']);
IF CC IN ['e','E'] THEN GETEXP;
IF (ERROR<>ERRSCANFLOAT) AND (E<>0) THEN
KONVERTOREAL;
END;
END;
END;
'(':
BEGIN
SCANSTR:=CC;
READCHAR;
IF CC<>'*' THEN
TOKEN:=TKURUNGBUKA
ELSE
BEGIN
COMMENT:=TRUE;
READCHAR;
IF CC<>ENDFILE THEN
BEGIN
REPEAT
WHILE NOT (CC IN ['*',ENDFILE]) DO
BEGIN
IF CC=LF THEN
INCLINE(LINECOUNTER);
READCHAR;
END;
IF CC='*' THEN
READCHAR;
IF CC=LF THEN
INCLINE(LINECOUNTER);
UNTIL CC IN [')',ENDFILE];

IF CC=')' THEN
READCHAR
ELSE
ERROR:=ERRSCANUNEXPEOF;
END
ELSE
ERROR:=ERRSCANUNEXPEOF;
END;
END;

'{':
BEGIN
COMMENT:=TRUE;
REPEAT
READCHAR;
Modul Peraktikum MTB
Teknik Kompilasi (T.Informatika)
IF CC=LF THEN INCLINE(LINECOUNTER);
UNTIL CC IN [')', ENDFILE];
IF CC=')' THEN READCHAR ELSE ERROR:=ERRSCANUNEXPEOF;
END;

'''':
BEGIN
SCANSTR:=''; EX:=FALSE;
WHILE NOT EX DO
BEGIN
REPEAT
SCANSTR:=SCANSTR+CC;
READCHAR;
UNTIL (CC IN ['''',LF,ENDFILE]);
IF CC IN [LF, ENDFILE] THEN
BEGIN
EX := TRUE;
IF CC=LF THEN
BEGIN
INCLINE(LINECOUNTER);
ERROR:=ERRSCANAPOSTEXP;
END
ELSE ERROR:=ERRSCANUNEXPEOF;
END
ELSE
BEGIN
SCANSTR:=SCANSTR+CC;
READCHAR;
IF CC<>'''' THEN EX:=TRUE;
END;
END;
IF NOT (ERROR IN [ERRSCANAPOSTEXP,ERRSCANUNEXPEOF]) THEN
BEGIN
DELETE(SCANSTR,LENGTH(SCANSTR),1);
DELETE(SCANSTR,1,1);
IF LENGTH(SCANSTR)>1 THEN TOKEN:=TSTRING
ELSE
BEGIN INUM:=ORD(SCANSTR[1]);
TOKEN:=TCHARCONSTANT; END;
END;
END;
':' :
BEGIN
SCANSTR:=CC;
READCHAR;
IF CC='=' THEN
BEGIN
TOKEN:=TASSIGMENT; SCANSTR:=SCANSTR+CC;
READCHAR;
END
ELSE
IF SCANSTR='..' THEN TOKEN:=TRANGE
ELSE TOKEN:=TTITIKDUA;
END;
'<' :
BEGIN
SCANSTR:=CC;
READCHAR;
IF CC='=' THEN
BEGIN TOKEN:=TLESSEQU; SCANSTR:=SCANSTR+CC;
READCHAR; END
ELSE
IF CC='>' THEN
BEGIN
TOKEN:=TINEQUAL; SCANSTR:=SCANSTR+CC;
READCHAR;
END
ELSE TOKEN:=TLESS;
END;
'>' :
BEGIN
Modul Peraktikum MTB
Teknik Kompilasi (T.Informatika)
SCANSTR:=CC;
READCHAR;
IF CC='=' THEN
BEGIN
TOKEN:=TGREATEREQU; SCANSTR:=SCANSTR+CC;
READCHAR;
END
ELSE TOKEN:=TGREATER;
END;
'.' :
BEGIN
READCHAR;
IF SCANSTR='..' THEN
TOKEN := TRANGE
ELSE
BEGIN
TOKEN := TTITIK;
SCANSTR:='.';
END;
END;

'+','-','*','/',',',';','=',')','[',']' :
BEGIN
SCANSTR:=CC;
CASE CC OF
'+' : TOKEN:=TPLUS;
'-' : TOKEN:=TMIN;
'*' : TOKEN:=TMULT;
'/' : TOKEN:=TDIV;
',' : TOKEN:=TKOMA;
';' : TOKEN:=TTITIKKOMA;
'=' : TOKEN:=TEQUAL;
')' : TOKEN:=TKURUNGTUTUP;
'[' : TOKEN:=TKURUNGSIKUBUKA;
']' : TOKEN:=TKURUNGSIKUTUTUP;
END;
READCHAR;
END;
ELSE ERROR:=ERRSCANUNEXPCHAR;
END;
IF (((NOT COMMENT) AND (ERROR<>ERRSCANUNEXPCHAR))
OR (CC=ENDFILE)) THEN
ADATOKEN:=TRUE;
IF ERROR<>ERRNONE THEN PROSERR(ERROR);
END;
END;

BEGIN
IF OPENFILE THEN
BEGIN
READCHAR;
JINFO := 0;
WRITELN(RESFILE,'INTERNAL NUMBER LOKASI TOKEN');
WRITELN(RESFILE,'---------------------------------');
WHILE (CC<>ENDFILE) DO
BEGIN
SCAN;
WRITEFILE;
END;
END;
CLOSE(RESFILE);
END.
Modul Peraktikum MTB
Teknik Kompilasi (T.Informatika)

Dibawah ini adalah contoh file kode sumber dalam pascal yang dites dengan program
scanner diatas, beserta hasil scanningnya. Lokasi akan menunjukan lokasi identifier pada tabel
symbol disini semua keyword dan delimeter akan dianggap berlokasi nol.

var a : integer;
begin
a := 89;
a := a + 12;
end.

Hasil scanning-nya :

INTERNAL NUMBER LOKASI TOKEN


--------------------------------------------------
1 1 VAR
1 2 A
11 0 :
1 3 INTEGER
15 0 ;
1 4 BEGIN
1 2 A
10 0 :=
2 5 89
15 0 ;
1 2 A
10 0 :=
1 2 A
6 0 +
2 6 12
15 0 ;
1 7 END
14 0 .
0 0 .

Tugas :
Scanninglah file – file source dibawah ini dan tuliskan hasil dari scanningnya seperti contoh.

a.
var a,b : integer;
c : boolean;
d : boolean;
e : real;
begin
a := 34;
b :=10;
if d
e := 23.56;
end.
Modul Peraktikum MTB
Teknik Kompilasi (T.Informatika)
2.
begin
{ a := a + 1 };
end
var a : Boolean;
begin
a := true;
if a
then a := false;
end.

3.
Begin
{

end

4.
var a : integer;
begin
a := 123456;
end;

Selamat Bekerja
******************

Tugas Telah Diterima


Tanggal :
TTD

Dosen Peraktikum

Data Mahasiswa
Nama :
Nim :
Kelas :
TDD

Mahasiswa

You might also like