(*1:*)MODULE TABLETEST; (*2:*)FROM InOut IMPORT WriteString , ReadString , Write , WriteCard , WriteLn ; (*:2*)(*3:*)FROM TABLEHANDLER IMPORT GETVALUEOFSYMBOL,SETVALUEOFSYMBOL, SEARCHSYMBOLTABLE,TABLEPROC,UNDEFINEDSYMBOLSINTABLE,CREATESYMBOLTABLE, SETERRORHANDLER,ERRORPROC,SYMBOLTABLEERRORCODE,SYMBOLISDEFINED, SYMBOLTABLE,DELETESYMBOLTABLE,SYMBOLSTRINGPTR; (*:3*)(*18:*)FROM FileSystem IMPORT Lookup ,Response, ReadChar , File , Close ;FROM ASCII IMPORT EOL, nul ;(*:18*)CONST(*23:*)BUFSIZE=1000; FILENAMELEN=200;(*:23*)VAR(*4:*)THETABLE:SYMBOLTABLE; SECONDTABLE:SYMBOLTABLE;(*:4*)(*12:*)MYPROC:TABLEPROC; MYERRORPROC:ERRORPROC;UNDEFPROC:ERRORPROC; (*:12*)(*24:*)BUFFER:ARRAY[0..BUFSIZE]OF CHAR; WORKSTRING:ARRAY[0..BUFSIZE]OF CHAR;INPUTFILE: File ; LINENUMBER:CARDINAL;INDEX:CARDINAL;CURRPOS:CARDINAL;LINELEN:CARDINAL; FILESYMBOLTABLE:SYMBOLTABLE;FILENAME:ARRAY[0..FILENAMELEN]OF CHAR; (*:24*)(*29:*)N:CARDINAL;STRAD:SYMBOLSTRINGPTR; (*:29*)(*:1*)(*14:*)PROCEDURE SHOWSYMBOLENTRY(ENTNUM:CARDINAL; STRPTR:SYMBOLSTRINGPTR;ITSDEFINED:BOOLEAN);BEGIN WriteString (STRPTR^); WriteString (' '); WriteCard (ENTNUM,1); WriteString (' '); IF ITSDEFINED THEN WriteString ('defined'); ELSE WriteString ('not defined');END; WriteLn ;END SHOWSYMBOLENTRY; (*:14*)(*15:*)PROCEDURE PRINTUNDEFINEDSYMBOLENTRY(CODE: SYMBOLTABLEERRORCODE;STR:ARRAY OF CHAR);BEGIN WriteString (STR); WriteString (' is undefined'); WriteLn ;END PRINTUNDEFINEDSYMBOLENTRY; (*:15*)(*16:*)PROCEDURE PRINTERROR(CODE:SYMBOLTABLEERRORCODE; STR:ARRAY OF CHAR); BEGIN CASE CODE OF UNDEFINEDSYMBOL: WriteString ('Error on symbol '); WriteString (STR); WriteString (' ----undefined_symbol ')|DUPLICATESYMBOL: WriteString ( 'Error on symbol '); WriteString (STR); WriteString (' ----duplicate_symbol ')|MEMORYEXHAUSTED: WriteString ( ' ----memory_exhausted ')END; WriteLn ;END PRINTERROR; (*:16*)(*25:*)PROCEDURE INPUTLN(VAR F: File ):BOOLEAN; VAR FINALLINELEN:[0..BUFSIZE];CH:CHAR;LINEPRES:BOOLEAN;BEGIN LINELEN:=0; FINALLINELEN:=0;IF(F.eof)THEN LINEPRES:=FALSE ELSE ReadChar (F,CH);; WHILE NOT(CH=EOL)DO IF CH= nul THEN RETURN FALSE END; BUFFER[LINELEN]:=CH;INC(LINELEN); IF BUFFER[LINELEN-1]<>' 'THEN FINALLINELEN:=LINELEN END; IF LINELEN=BUFSIZE THEN WHILE NOT(CH=EOL)DO ReadChar (F,CH);;END;; DEC(LINELEN);RETURN TRUE;END; ReadChar (F,CH);;END; WHILE NOT(CH=EOL)DO ReadChar (F,CH);;END;;LINELEN:=FINALLINELEN; LINEPRES:=TRUE;BUFFER[LINELEN]:= nul ;END;RETURN LINEPRES;END INPUTLN; (*:25*)(*28:*)BEGIN(*13:*)MYERRORPROC:=PRINTERROR; UNDEFPROC:=PRINTUNDEFINEDSYMBOLENTRY;MYPROC:=SHOWSYMBOLENTRY;(*:13*); (*5:*)(*6:*)CREATESYMBOLTABLE(THETABLE,TRUE,MYERRORPROC); CREATESYMBOLTABLE(SECONDTABLE,FALSE,MYERRORPROC);(*:6*); (*7:*)N:=GETVALUEOFSYMBOL(THETABLE,'junk',TRUE,STRAD); N:=GETVALUEOFSYMBOL(THETABLE,'TheForceIsStrongWithThisOne',TRUE,STRAD); N:=GETVALUEOFSYMBOL(THETABLE,'ElectricBugaloo',TRUE,STRAD); N:=GETVALUEOFSYMBOL(THETABLE,'gizzard',TRUE,STRAD); N:=GETVALUEOFSYMBOL(THETABLE,'theearthisflat',TRUE,STRAD); N:=GETVALUEOFSYMBOL(THETABLE,'TheEarthIsFlat',TRUE,STRAD); N:=GETVALUEOFSYMBOL(THETABLE,'whack',TRUE,STRAD); N:=GETVALUEOFSYMBOL(THETABLE,'Shazam',FALSE,STRAD); N:=GETVALUEOFSYMBOL(SECONDTABLE,'WhatMeWorry',FALSE,STRAD); N:=GETVALUEOFSYMBOL(SECONDTABLE,'ribbit',TRUE,STRAD); N:=GETVALUEOFSYMBOL(SECONDTABLE,'Hiawatha',TRUE,STRAD); N:=GETVALUEOFSYMBOL(SECONDTABLE,'tippicanoe',TRUE,STRAD); N:=GETVALUEOFSYMBOL(SECONDTABLE,'Tippicanoe',TRUE,STRAD); N:=GETVALUEOFSYMBOL(SECONDTABLE,'MiDogHasFleez',TRUE,STRAD); N:=GETVALUEOFSYMBOL(SECONDTABLE,'heartburn',TRUE,STRAD); N:=GETVALUEOFSYMBOL(SECONDTABLE,'PieAreSquare',TRUE,STRAD); N:=GETVALUEOFSYMBOL(SECONDTABLE,'CornbreadAreRound',TRUE,STRAD); SETVALUEOFSYMBOL(SECONDTABLE,'hitherefolks',TRUE,STRAD,447);(*:7*); (*8:*) WriteString ('symbols in first table'); WriteLn ; SEARCHSYMBOLTABLE(THETABLE,MYPROC); WriteString ('symbols in second table'); WriteLn ; SEARCHSYMBOLTABLE(SECONDTABLE,MYPROC);(*:8*); (*9:*)SETVALUEOFSYMBOL(SECONDTABLE,'tippicanoe',FALSE,STRAD,222); WriteString ('symbols in second table after modifications'); WriteLn ; SEARCHSYMBOLTABLE(SECONDTABLE,MYPROC);(*:9*); (*10:*)IF UNDEFINEDSYMBOLSINTABLE(THETABLE,UNDEFPROC)THEN WriteString ( 'undefined symbols in first table'); WriteLn ;END; IF UNDEFINEDSYMBOLSINTABLE(SECONDTABLE,UNDEFPROC)THEN WriteString ( 'undefined symbols in second table'); WriteLn ;END;(*:10*); (*11:*)DELETESYMBOLTABLE(THETABLE);DELETESYMBOLTABLE(SECONDTABLE); (*:11*);(*:5*)(*17:*)(*26:*)FILENAME[0]:=' '; WriteString ('input file:'); WriteLn ;; ReadString (FILENAME); WriteLn ; WriteString (FILENAME); WriteLn ;; WriteLn ; Lookup (INPUTFILE,FILENAME,FALSE); IF(INPUTFILE.res<>done)THEN WriteString ('unable to open '); WriteString (FILENAME);END;;(*:26*); CREATESYMBOLTABLE(FILESYMBOLTABLE,TRUE,MYERRORPROC); (*19:*)LINENUMBER:=0;WHILE INPUTLN(INPUTFILE)DO INC(LINENUMBER); (*20:*)CURRPOS:=0; WHILE NOT(CURRPOS=LINELEN)DO(*21:*)WHILE(NOT(CURRPOS=LINELEN))AND(NOT(( CAP(BUFFER[CURRPOS])>='A')AND(CAP(BUFFER[CURRPOS])<='Z')))DO INC(CURRPOS );END;(*:21*);IF NOT(CURRPOS=LINELEN)THEN INDEX:=0; (*22:*)REPEAT WORKSTRING[INDEX]:=BUFFER[CURRPOS];INC(INDEX); INC(CURRPOS); UNTIL(CURRPOS=LINELEN)OR(NOT((CAP(BUFFER[CURRPOS])>='A')AND(CAP(BUFFER[ CURRPOS])<='Z')));(*:22*);WORKSTRING[INDEX]:= nul ; IF NOT SYMBOLISDEFINED(FILESYMBOLTABLE,WORKSTRING)THEN SETVALUEOFSYMBOL( FILESYMBOLTABLE,WORKSTRING,TRUE,STRAD,LINENUMBER)END;END;END;(*:20*); END;(*:19*);(*27:*) Close (INPUTFILE); WriteString ('symbols found in the source file'); WriteLn ; SEARCHSYMBOLTABLE(FILESYMBOLTABLE,MYPROC); DELETESYMBOLTABLE(FILESYMBOLTABLE);(*:27*);(*:17*)END TABLETEST.(*:28*)