Modul Peraktikum 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 sumber dalam dalam bahasa bahasa pascal, pascal, kemudian kemudian menghasilka menghasilkan n suatu suatu file text yang yang berisi 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 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', 'CONST', 'CHAR', 'DIV', 'DO', 'ELSE', 'END', 'FILE', 'FOR', 'FUNCTION','GOTO', 'FUNCTION','GOTO ', 'IF', 'IN', 'INTEGER', 'GOTO', 'IF', 'IN', 'INTEGER', 'LABEL','MOD', 'NIL', 'OF', 'OR', 'PACKED', 'PROCEDURE', 'PROGRAM', 'REAL', 'RECORD', 'REPEAT', 'STRING', 'THEN', 'TO', 'TYPE', 'VAR', 'WHILE','WITH' ); EMAX = 38; EMIN = -38; JMLSIGDGT = 5; VALMAX = 16383; MAXINFO = 128; VAR SCANSTR TOKEN INUM RNUM CC
: : : : :
'CASE', 'DOWNTO',
'NOT', 'SET', 'UNTIL',
STRING; TOKENTYPE; LONGINT; REAL; CHAR;
FILESOURCE,FILERES INFILE,RESFILE ERRCOUNTER LINECOUNTER LOKASI JINFO
: : : : : :
STRING; TEXT; INTEGER; INTEGER; ARRAY [1..MAXINFO] OF STRING; 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 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 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
Modul Peraktikum 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 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 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 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 WRITELN(RESFILE, 'INTERNAL NUMBER LOKASI TOKEN'); WRITELN(RESFILE,'---------------------------------'); WHILE (CC<>ENDFILE) DO BEGIN SCAN; WRITEFILE; END; END; CLOSE(RESFILE); END.
Modul Peraktikum 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 identifier pada tabel tabel symbol symbol disini disini semua semua keyword keyword dan delimeter delimeter akan dianggap 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 : bool boolea ean; n; d : boolean; e : real; begin a := 34; b :=10; if d e := 23.56; end.
Modul Peraktikum 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