mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-01-11 23:42:42 +00:00
2. Commit compile deck and listing with patches to allow the compiler to work with B5500 Mark XIII Algol. 3. Commit compile & go deck and output listing for HMSS2.TEST sample program.
3697 lines
328 KiB
Plaintext
3697 lines
328 KiB
Plaintext
10001000
|
|
10002000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10003000
|
|
% % 10004000
|
|
% % 10005000
|
|
% * * % 10006000
|
|
% * P A S C A L C O M P I L E R * % 10007000
|
|
% *********************************** % 10008000
|
|
% % 10009000
|
|
% % 10010000
|
|
% WRITTEN 1975 BY % 10011000
|
|
% DAG F. LANGMYHR, % 10012000
|
|
% HERIOT-WATT UNIVERSITY, % 10013000
|
|
% EDINBURGH. % 10014000
|
|
% % 10015000
|
|
% % 10016000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10017000
|
|
% % 10018000
|
|
% % 10019000
|
|
% PART 1: DECLARATIONS. % 10020000
|
|
% ------------- % 10021000
|
|
% % 10022000
|
|
% % 10023000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10024000
|
|
10025000
|
|
10026000
|
|
BEGIN 10027000
|
|
DEFINE EDITION="2.3"#; 10028000
|
|
INTEGER NUMERRS, % @R+21: NUMBER OF ERRORS IN PROGRAM. 10029000
|
|
SAVEFACTOR, % @R+22: SAVEFACTOR FOR CODE FILE. 10030000
|
|
% >0 COMPILE TO LIBRARY. 10031000
|
|
% =0 COMPILE AND RUN. 10032000
|
|
% <0 COMPILE FOR SYNTAX. 10033000
|
|
CARDCNT; % @R+23: NUMBER OF CARDS READ. 10034000
|
|
FILE CARD "SOURCE" (2,10,150); % SOURCE CODE INPUT FILE 10035000
|
|
FILE LINES 1 (2,17); % PRINT FILE. 10036000
|
|
FILE PASCALGOL DISK SERIAL [20:600] (2,10,150,SAVE 0); % CODE FILE 10037000
|
|
DEFINE LINESPERPAGE=58#, 10038000
|
|
MAXINT=549755813887#; 10039000
|
|
10040000
|
|
%*** COMPILER CONSTANTS *** 10041000
|
|
DEFINE MAXTABLES =50#, %MAX NUMBER OF NAME TABLES. 10042000
|
|
MAXNAMES =997#, %MAX NAMES IN EACH TABLE. 10043000
|
|
MAXLEVEL =15#, %MAX DEPTH OF PROCEDURE DECLARATIONS. 10044000
|
|
MAXCASES =211#, %MAX LABELS IN A CASE-STATEMENT. 10045000
|
|
MAXLABS =100#, %MAX NUMBER OF LABELS. 10046000
|
|
MAXPARAMS =200#, %MAX NUMBER OF PARAMETERS IN WHOLE PROGRAM.10047000
|
|
MAXTYPES =1022#, %MAX NUMBER OF DIFFERENT TYPES. 10048000
|
|
MAXCONSTS =200#, %SIZE OF CONSTANT TABLE. 10049000
|
|
MAXTEMPS =5#, %NUMBER OF EXTRA VARS IN EACH PROCEDURE. 10050000
|
|
MAXWITHSYMS=250#, %MAX NUMBER OF SYMBOLS USED BY WITH-STATMS.10051000
|
|
MAXSYMS =800#, %MAX NUMBER OF SYMBOLS IN ONE EXPRESSION. 10052000
|
|
LISTLENGTH =800#, %MAX LENGTH OF VAR AND PARAM LISTS. 10053000
|
|
MAXEXTFILES=20#, %MAX NUMBER OF EXTERNAL FILES. 10054000
|
|
MAXFILES =20#, %MAX NUMBER OF FILES DECLARED AT ONE TIME. 10055000
|
|
MAXPNTRS =50#; %MAX NUMBER OF UNDECLARED POINTERS. 10056000
|
|
10057000
|
|
%*** NAME TABLES *** 10058000
|
|
ARRAY NAMETAB1,NAMETAB2,NAMETAB3[0:MAXTABLES,0:MAXNAMES]; 10059000
|
|
DEFINE NAMELENGTH =[41:6]#, 10060000
|
|
TYPE =[9:10]#, 10061000
|
|
IDCLASS =[12:3]#, 10062000
|
|
VAR =0#, 10063000
|
|
CONST=1#, 10064000
|
|
FUNC =2#, 10065000
|
|
PROC =3#, 10066000
|
|
TYPES=4#, 10067000
|
|
INFO =[23:11]#, 10068000
|
|
FORMAL =[24:1]#, 10069000
|
|
FORWARDDEF =[25:1]#, 10070000
|
|
EXTERNALFILE=[26:1]#; 10071000
|
|
10072000
|
|
%*** DISPLAY VECTOR *** 10073000
|
|
ARRAY DISPLAY[0:MAXLEVEL]; 10074000
|
|
DEFINE RECTYPE =[9:10]#, 10075000
|
|
FIRSTWITHSYM =[19:10]#, 10076000
|
|
LASTWITHSYM =[29:10]#, 10077000
|
|
NUMPNTRSINWITH=[35:6]#, 10078000
|
|
BRACKETSINWITH=[36:1]#, 10079000
|
|
NAMETAB =[46:7]#; 10080000
|
|
10081000
|
|
%*** TYPE TABLES *** 10082000
|
|
ARRAY TYPETAB1,TYPETAB2,TYPETAB3[0:MAXTYPES]; 10083000
|
|
DEFINE FORM =[3:4]#, 10084000
|
|
NUMERIC =0#, 10085000
|
|
SYMBOLIC=1#, 10086000
|
|
SUBTYPE =2#, 10087000
|
|
MAINTYPE=[33:10]#, 10088000
|
|
CHAR =3#, 10089000
|
|
FLOATING=4#, 10090000
|
|
ALFA =5#, 10091000
|
|
SET =6#, 10092000
|
|
SETTYPE =[33:10]#, 10093000
|
|
POINTERS=7#, 10094000
|
|
POINTTYPE=[33:10]#, 10095000
|
|
ARRAYS =8#, 10096000
|
|
INXTYPE =[33:10]#, 10097000
|
|
ARRTYPE =[43:10]#, 10098000
|
|
RECORD =9#, 10099000
|
|
RECTAB =[33:10]#, 10100000
|
|
FILES =10#, 10101000
|
|
FILETYPE=[33:10]#, 10102000
|
|
TEXTFILE=11#, 10103000
|
|
SIZE =[15:12]#, 10104000
|
|
STRUCT=[23:8]#; 10105000
|
|
INTEGER NUMTYPES; 10106000
|
|
10107000
|
|
%*** PARAMETER TABLE *** 10108000
|
|
ARRAY PARAMTAB[0:MAXPARAMS]; 10109000
|
|
DEFINE PARAMNAME =[9:10]#, 10110000
|
|
PARAMKIND =[13:4]#, 10111000
|
|
PARAMLEVEL=[23:10]#, 10112000
|
|
PARAMTYPE =[33:10]#, 10113000
|
|
PARAMFILE =[34:1]#; 10114000
|
|
INTEGER NUMPARAMS; 10115000
|
|
10116000
|
|
%*** CONSTANT TABLE *** 10117000
|
|
ARRAY CONSTTAB[0:MAXCONSTS]; 10118000
|
|
INTEGER NUMCONSTS; 10119000
|
|
10120000
|
|
%*** LABEL TABLE *** 10121000
|
|
ARRAY LABTAB[0:MAXLABS]; 10122000
|
|
DEFINE LABVAL=[14:15]#, 10123000
|
|
LABDEF=[15:1]#; 10124000
|
|
INTEGER NUMLABS,FIRSTLAB; 10125000
|
|
10126000
|
|
%*** TABLES FOR I/O AND CHARACTER HANDLING *** 10127000
|
|
ARRAY CH[0:0], TEXT[0:1], STRING[0:11]; 10128000
|
|
POINTER CHARPNT,TEXTPNT,TEXTPNT0,STRINGPNT; 10129000
|
|
ARRAY ICARD[0:9], LINE[0:16], XLINE[0:10], ALGOLCARD[0:9]; 10130000
|
|
POINTER CARDPNT,LINEPNT,XLINEPNT,ALGOLPNT; 10131000
|
|
INTEGER CHARCNT,ALGOLCNT,MARGINCNT; 10132000
|
|
ARRAY HEADTEXT[0:10], ERRLINE[0:16]; 10133000
|
|
INTEGER LINECNT,PAGECNT,ERRINX; 10134000
|
|
10135000
|
|
%*** XREF FILE AND TABLE *** 10136000
|
|
FILE XREFFILE DISK SERIAL [20:3000] (2,3,150); 10137000
|
|
ARRAY BLOCKTAB[0:MAXTABLES], XREFLINE[0:16]; 10138000
|
|
INTEGER NUMXREF,NUMBLOCKS; POINTER XREFPNT; 10139000
|
|
% 10140000
|
|
%*** OTHER TABLES *** 10141000
|
|
INTEGER ARRAY VARLIST[0:LISTLENGTH]; % TEMPORARY LIST OF VARIABLES. 10142000
|
|
INTEGER VARINDEX,FIRSTVAR; 10143000
|
|
ARRAY SYMTAB[0:MAXSYMS]; % USED BY "EXPRESSION". 10144000
|
|
INTEGER NUMSYMS; 10145000
|
|
ARRAY WITHTAB[0:MAXWITHSYMS]; % USED BY "WITHSTAT". 10146000
|
|
INTEGER NWITHSYMS; 10147000
|
|
INTEGER ARRAY SYMBOL[0:64]; % USED BY "INSYMBOL". 10148000
|
|
INTEGER ARRAY SYMKIND[0:61]; % USED IN ERROR RECOVERY. 10149000
|
|
ARRAY PNTRTAB1,PNTRTAB2,PNTRTAB3[0:MAXPNTRS];% USED FOR FORWARD POINTERS10150000
|
|
INTEGER NUMPNTRS; 10151000
|
|
ARRAY EXTFILETAB[0:MAXEXTFILES]; % EXTERNAL FILES. 10152000
|
|
INTEGER NUMEXTFILES; 10153000
|
|
ARRAY FILETAB[0:MAXFILES]; % FILES IN USE. 10154000
|
|
INTEGER NUMFILES; 10155000
|
|
BOOLEAN ARRAY ERR[0:119]; % RECORDS ERROR MESSAGES. 10156000
|
|
10157000
|
|
%*** COMPILE TIME OPTIONS *** 10158000
|
|
BOOLEAN LISTOPTION,RESWORDOPTION,CHECKOPTION,DUMPOPTION,XREFOPTION; 10159000
|
|
INTEGER CARDLENGTH; 10160000
|
|
10161000
|
|
%*** INTRINSIC TYPES *** 10162000
|
|
INTEGER INTTYPE,REALTYPE,ALFATYPE,CHARTYPE,BOOLTYPE,NILTYPE,TEXTTYPE, 10163000
|
|
INPUTFILE,OUTPUTFILE,EMPTYSET; 10164000
|
|
BOOLEAN INPUTDECL,OUTPUTDECL; 10165000
|
|
10166000
|
|
%*** TEMPORARY VARIABLES *** 10167000
|
|
INTEGER T1,T2,T3,T4,T5; 10168000
|
|
10169000
|
|
%*** OTHER VARIABLES *** 10170000
|
|
ALPHA USER; % THE USER NUMBER FOUND ON THE USER CARD.10171000
|
|
10172000
|
|
INTEGER CURLEVEL, % CURRENT PROCEDURE LEVEL. 10173000
|
|
TOPLEVEL, % TOP LEVEL IN DISPLAY VECTOR. 10174000
|
|
NUMBEGINS, % NUMBER OF "BEGIN"S IN THE PROGRAM. 10175000
|
|
NUMCASES, % NUMBER OF CASE-STATEMENTS IN PROGRAM. 10176000
|
|
NUMREPS, % NUMBER OF REPEAT-STATEMENTS IN PROGRAM. 10177000
|
|
NUMTEMPS, % NUMBER OF TEMPORARY VARIABLES IN USE. 10178000
|
|
CURFUNC, % INDEX OF FUNCTION CURRENTLY COMPILED. 10179000
|
|
CURSY, % LAST SYMBOL READ BY SCANNER. 10180000
|
|
CURTYPE, % TYPE OF ENTITY LAST COMPILED. 10181000
|
|
CURMODE, % CURRENT EXPRESSION MODE. 10182000
|
|
LASTREC; % LAST RECORD TABLE DEFINED. 10183000
|
|
10184000
|
|
LABEL ENDOFINPUT; 10185000
|
|
10186000
|
|
FORMAT NOERRORS ("NO ERRORS DETECTED."), 10187000
|
|
ERRORS (I5," ERRORS DETECTED"/), 10188000
|
|
ALIST ("$ SET LIST SINGLE"), 10189000
|
|
NOALIST ("$ RESET LIST"), 10190000
|
|
LASTLINE ("; TERMINATE: END OF PASCAL PROGRAM."), 10191000
|
|
TERMMESS ("**** END-OF-INPUT. COMPILATION TERMINATED."); 10192000
|
|
MONITOR EXPOVR:=REALOVERFLOW; 10193000
|
|
10194000
|
|
%*** SCANNER SYMBOLS *** 10195000
|
|
DEFINE IDENTIFIER=1#, INTCONST=2#, REALCONST=3#, ALFACONST=4#, 10196000
|
|
CHARCONST=5#, NOTSY=6#, ASTERISK=7#, SLASH=8#, 10197000
|
|
ANDSY=9#, DIVSY=10#, MODSY=11#, PLUS=12#, 10198000
|
|
MINUS=13#, ORSY=14#, LSSSY=15#, LEQSY=16#, 10199000
|
|
GEQSY=17#, GTRSY=18#, NEQSY=19#, EQLSY=20#, 10200000
|
|
INSY=21#, LPAR=22#, RPAR=23#, LBRACKET=24#, 10201000
|
|
RBRACKET=25#, DOUBLEDOT=26#, COMMA=27#, SEMICOLON=28#, 10202000
|
|
DOT=29#, ARROW=30#, COLON=31#, ASSIGNSY=32#, 10203000
|
|
BEGINSY=33#, ENDSY=34#, IFSY=35#, THENSY=36#, 10204000
|
|
ELSESY=37#, CASESY=38#, OFSY=39#, REPEATSY=40#, 10205000
|
|
UNTILSY=41#, WHILESY=42#, DOSY=43#, FORSY=44#, 10206000
|
|
TOSY=45#, DOWNTOSY=46#, GOTOSY=47#, NILSY=48#, 10207000
|
|
TYPESY=49#, ARRAYSY=50#, RECORDSY=51#, FILESY=52#, 10208000
|
|
SETSY=53#, CONSTSY=54#, VARSY=55#, LABELSY=56#, 10209000
|
|
FUNCSY=57#, PROCSY=58#, WITHSY=59#, PROGRAMSY=60#, 10210000
|
|
PACKEDSY=61#; 10211000
|
|
10212000
|
|
DEFINE INITIAL=0#, MIDDLE=1#, TERMINAL=2#; 10213000
|
|
DEFINE NUMBER=0#, BITPATTERN=1#; 10214000
|
|
$ PAGE 20000000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20001000
|
|
% %20002000
|
|
% %20003000
|
|
% %20004000
|
|
% PART 2: COMPILER UTILITY ROUTINES. %20005000
|
|
% -------------------------- %20006000
|
|
% %20007000
|
|
% %20008000
|
|
% %20009000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20010000
|
|
20011000
|
|
20012000
|
|
PROCEDURE INSYMBOL; FORWARD; 20013000
|
|
PROCEDURE WRITEALGOL; FORWARD; 20014000
|
|
PROCEDURE NEWXREF(NAME1,NAME2,TABLE,DECL); 20015000
|
|
VALUE NAME1, NAME2, TABLE, DECL; 20016000
|
|
REAL NAME1, NAME2; 20017000
|
|
INTEGER TABLE; 20018000
|
|
BOOLEAN DECL; 20019000
|
|
FORWARD; 20020000
|
|
20021000
|
|
DEFINE NDIGITS(N)= 20022000
|
|
IF N{ 9 THEN 1 ELSE 20023000
|
|
IF N{99 THEN 2 ELSE 3 DIGITS#; 20024000
|
|
20025000
|
|
DEFINE HEADING= 20026000
|
|
BEGIN COMMENT *** PRINTS A HEADING ON TOP OF A NEW PAGE. ; 20027000
|
|
PAGECNT:=PAGECNT+1; 20028000
|
|
REPLACE POINTER(HEADTEXT[*])+85 BY PAGECNT FOR NDIGITS(PAGECNT); 20029000
|
|
WRITE(LINES[PAGE]); 20030000
|
|
WRITE(LINES[DBL],11,HEADTEXT[*]); 20031000
|
|
LINECNT:=2; 20032000
|
|
END OF HEADING#; 20033000
|
|
20034000
|
|
20035000
|
|
DEFINE PRINTLINE= %*** PRINTS A SOURCE CODE LINE. 20036000
|
|
BEGIN 20037000
|
|
REPLACE LINEPNT-8 BY CARDCNT FOR 5 DIGITS; 20038000
|
|
IF LINECNT}LINESPERPAGE THEN HEADING; 20039000
|
|
IF RESWORDOPTION THEN 20040000
|
|
BEGIN 20041000
|
|
WRITE(LINES[NO],11,XLINE[*]); 20042000
|
|
WRITE(LINES[NO],11,XLINE[*]); 20043000
|
|
END; 20044000
|
|
WRITE(LINES,17,LINE[*]); 20045000
|
|
LINECNT:=LINECNT+1; 20046000
|
|
END OF PRINTLINE#; 20047000
|
|
20048000
|
|
20049000
|
|
DEFINE NEWCARD= %*** READS A NEW SOURCE CODE CARD. 20050000
|
|
BEGIN 20051000
|
|
IF LISTOPTION THEN PRINTLINE; 20052000
|
|
IF ERRINX>0 THEN PRINTERRORS; 20053000
|
|
READ(CARD,10,ICARD[*]) [ENDOFINPUT]; 20054000
|
|
CARDPNT:=POINTER(ICARD[*]); 20055000
|
|
REPLACE LINEPNT BY CARDPNT FOR 10 WORDS, " " FOR 6 WORDS; 20056000
|
|
REPLACE XLINEPNT BY " " FOR 10 WORDS; 20057000
|
|
CHARCNT:=CARDLENGTH; 20058000
|
|
MARGINCNT:=85; 20059000
|
|
CARDCNT:=CARDCNT+1; 20060000
|
|
END#; 20061000
|
|
20062000
|
|
20063000
|
|
DEFINE GEN(T,N,START)= %*** GENERATE A TEXT "T", CONSISTING OF 20064000
|
|
BEGIN %*** "N" LETTERS, STARTING AT "START". 20065000
|
|
IF ALGOLCNT<N THEN WRITEALGOL; 20066000
|
|
TEXT[0]:=T; 20067000
|
|
REPLACE ALGOLPNT:ALGOLPNT BY TEXTPNT0+START FOR N; 20068000
|
|
ALGOLCNT:=ALGOLCNT-N; 20069000
|
|
END#; 20070000
|
|
20071000
|
|
20072000
|
|
DEFINE GENID(L,NUM,NDIG)= %*** GENERATE AN XALGOL IDENTIFIER. 20073000
|
|
BEGIN 20074000
|
|
IF ALGOLCNT{NDIG THEN WRITEALGOL; 20075000
|
|
CH[0]:=L; 20076000
|
|
REPLACE ALGOLPNT:ALGOLPNT BY CHARPNT FOR 1, NUM FOR NDIG DIGITS; 20077000
|
|
ALGOLCNT:=ALGOLCNT-NDIG-1; 20078000
|
|
END#; 20079000
|
|
20080000
|
|
20081000
|
|
INTEGER NABS,NSIZE; 20082000
|
|
20083000
|
|
DEFINE GENINT(N)= 20084000
|
|
BEGIN 20085000
|
|
NABS:=ABS(N); IF N<0 THEN GEN("-",1,7); 20086000
|
|
NSIZE:=IF NABS{ 9 THEN 1 ELSE 20087000
|
|
IF NABS{ 999 THEN 3 ELSE 20088000
|
|
IF NABS{ 99999 THEN 5 ELSE 20089000
|
|
IF NABS{99999999 THEN 8 ELSE 12; 20090000
|
|
IF ALGOLCNT<NSIZE THEN WRITEALGOL; 20091000
|
|
IF NSIZE=12 THEN 20092000
|
|
REPLACE ALGOLPNT:ALGOLPNT BY (NABS DIV 1000000) FOR 6 DIGITS, 20093000
|
|
ENTIER(NABS MOD 1000000) FOR 6 DIGITS ELSE 20094000
|
|
REPLACE ALGOLPNT:ALGOLPNT BY NABS FOR NSIZE DIGITS; 20095000
|
|
ALGOLCNT:=ALGOLCNT-NSIZE; 20096000
|
|
END OF GENINT#; 20097000
|
|
20098000
|
|
20099000
|
|
PROCEDURE GENREAL(X); 20100000
|
|
VALUE X; REAL X; 20101000
|
|
BEGIN 20102000
|
|
REAL ABSX; 20103000
|
|
INTEGER POWER,V1,V2; 20104000
|
|
20105000
|
|
IF X.[46:5]=0 THEN 20106000
|
|
BEGIN 20107000
|
|
IF ALGOLCNT<9 THEN WRITEALGOL; 20108000
|
|
TEXT[0]:=X; 20109000
|
|
REPLACE ALGOLPNT:ALGOLPNT BY """, TEXTPNT FOR 7, """; 20110000
|
|
ALGOLCNT:=ALGOLCNT-9; 20111000
|
|
END ELSE 20112000
|
|
BEGIN 20113000
|
|
IF ALGOLCNT<22 THEN WRITEALGOL; 20114000
|
|
IF X<0 THEN GEN("(-",2,6); 20115000
|
|
ABSX:=ABS(X); 20116000
|
|
IF ABSX> 0 THEN 20117000
|
|
BEGIN 20118000
|
|
WHILE ABSX}1@7 DO BEGIN ABSX:=ABSX/10; POWER:=POWER+1; END; 20119000
|
|
WHILE ABSX<1@6 DO BEGIN ABSX:=ABSX|10; POWER:=POWER-1; END; 20120000
|
|
V1:=ENTIER(ABSX); 20121000
|
|
V2:=ENTIER((ABSX-V1)|1000000); 20122000
|
|
REPLACE ALGOLPNT:ALGOLPNT BY V1 FOR 7 DIGITS, ".", 20123000
|
|
V2 FOR 6 DIGITS, "@"; 20124000
|
|
ALGOLCNT:=ALGOLCNT-15; 20125000
|
|
IF POWER<0 THEN GEN("-",1,7); 20126000
|
|
POWER:=ABS(POWER); 20127000
|
|
REPLACE ALGOLPNT:ALGOLPNT BY POWER FOR 2 DIGITS; 20128000
|
|
ALGOLCNT:=ALGOLCNT-2; 20129000
|
|
END ELSE GEN("0",1,7); 20130000
|
|
IF X<0 THEN GEN(")",1,7); 20131000
|
|
END; 20132000
|
|
END OF GENREAL; 20133000
|
|
20134000
|
|
20135000
|
|
INTEGER TYPEINDEX; 20136000
|
|
20137000
|
|
DEFINE NEWTYPE= 20138000
|
|
BEGIN 20139000
|
|
IF NUMTYPES}MAXTYPES THEN BEGIN ERROR(45);NUMTYPES:=MAXTYPES-20 END;20140000
|
|
TYPEINDEX:=NUMTYPES:=NUMTYPES+1; 20141000
|
|
END #; 20142000
|
|
20143000
|
|
20144000
|
|
PROCEDURE WRITEALGOL; %*** WRITES A COMPLETED XALGOL CARD TO 20145000
|
|
BEGIN %*** THE FILE. 20146000
|
|
REPLACE POINTER(ALGOLCARD[9]) BY CARDCNT FOR 8 DIGITS; 20147000
|
|
WRITE(PASCALGOL,10,ALGOLCARD[*]); 20148000
|
|
IF DUMPOPTION THEN WRITE(LINES,10,ALGOLCARD[*]); 20149000
|
|
ALGOLPNT:=POINTER(ALGOLCARD[*]); ALGOLCNT:=71; 20150000
|
|
REPLACE ALGOLPNT BY " " FOR 9 WORDS; 20151000
|
|
END OF WRITEALGOL; 20152000
|
|
20153000
|
|
20154000
|
|
DEFINE MARGIN(LETTER,NUM)= 20155000
|
|
BEGIN COMMENT *** PLACES INFORMATION IN THE MARGIN. ; 20156000
|
|
IF MARGINCNT{118 THEN 20157000
|
|
BEGIN TEXT[0]:=LETTER; 20158000
|
|
REPLACE LINEPNT+MARGINCNT BY TEXTPNT+5 FOR 2, 20159000
|
|
NUM FOR NDIGITS(NUM); 20160000
|
|
MARGINCNT:=MARGINCNT+6; 20161000
|
|
END; 20162000
|
|
END OF MARGIN#; 20163000
|
|
20164000
|
|
20165000
|
|
PROCEDURE SKIP(SYMBOL); %*** SKIP SYMBOLS TO RECOVER FROM ERROR 20166000
|
|
VALUE SYMBOL; INTEGER SYMBOL; %*** CONDITION. 20167000
|
|
BEGIN 20168000
|
|
WHILE CURSY!SYMBOL AND SYMKIND[CURSY]=MIDDLE DO 20169000
|
|
IF CURSY=RECORDSY THEN 20170000
|
|
BEGIN DO BEGIN INSYMBOL; 20171000
|
|
SKIP(99); 20172000
|
|
END UNTIL CURSY!SEMICOLON AND CURSY!CASESY; 20173000
|
|
END ELSE INSYMBOL; 20174000
|
|
END OF SKIP; 20175000
|
|
20176000
|
|
20177000
|
|
PROCEDURE ERROR(ERRNUM); 20178000
|
|
VALUE ERRNUM; INTEGER ERRNUM; 20179000
|
|
BEGIN COMMENT *** ARRANGE ERROR INDICATOR. ; 20180000
|
|
NUMERRS:=NUMERRS+1; 20181000
|
|
ERR[ERRNUM]:=TRUE; 20182000
|
|
ERRINX:=MAX(ERRINX,CARDLENGTH-2-CHARCNT); 20183000
|
|
IF ERRINX{115 THEN 20184000
|
|
BEGIN REPLACE POINTER(ERRLINE[1])+ERRINX BY "|", 20185000
|
|
ERRNUM FOR NDIGITS(ERRNUM); 20186000
|
|
ERRINX:=ERRINX+(IF ERRNUM{ 9 THEN 2 ELSE 20187000
|
|
IF ERRNUM{99 THEN 3 ELSE 4); 20188000
|
|
END END OF ERROR; 20189000
|
|
20190000
|
|
20191000
|
|
PROCEDURE PRINTERRORS; 20192000
|
|
BEGIN COMMENT *** PRINT ERROR INDICATORS. ; 20193000
|
|
IF NOT LISTOPTION THEN PRINTLINE; 20194000
|
|
WRITE(LINES,17,ERRLINE[*]); 20195000
|
|
LINECNT:=LINECNT+1; 20196000
|
|
REPLACE POINTER(ERRLINE[1]) BY " " FOR 16 WORDS; 20197000
|
|
ERRINX:=0; 20198000
|
|
END OF PRINT ERRORS; 20199000
|
|
20200000
|
|
20201000
|
|
DEFINE HASH(N) = (N).[35:36] MOD MAXNAMES#; 20202000
|
|
20203000
|
|
INTEGER THISLEVEL,THISTAB,THISINDEX; 20204000
|
|
ALPHA THISID,TNAME; 20205000
|
|
BOOLEAN FOUND; 20206000
|
|
20207000
|
|
DEFINE SEARCHTAB(TAB)= %*** SEARCH NAME TABLE "TAB" FOR THE 20208000
|
|
BEGIN %*** IDENTIFIER JUST READ. 20209000
|
|
THISINDEX:=HASH(CURNAME1); 20210000
|
|
TNAME:=NAMETAB1[TAB,THISINDEX]; 20211000
|
|
WHILE (IF TNAME=CURNAME1 THEN NAMETAB2[TAB,THISINDEX]!CURNAME2 20212000
|
|
ELSE TNAME!0) DO 20213000
|
|
BEGIN 20214000
|
|
THISINDEX:=IF THISINDEX=0 THEN MAXNAMES ELSE THISINDEX-1; 20215000
|
|
TNAME:=NAMETAB1[TAB,THISINDEX]; 20216000
|
|
END; 20217000
|
|
FOUND:=TNAME!0; 20218000
|
|
IF XREFOPTION THEN 20219000
|
|
IF FOUND THEN NEWXREF(CURNAME1,CURNAME2,TAB,FALSE); % 20220000
|
|
END OF SEARCHTAB#; 20221000
|
|
20222000
|
|
DEFINE SEARCH= %*** SEARCH ALL TABLES CURRENTLY IN USE. 20223000
|
|
BEGIN 20224000
|
|
THISLEVEL:=TOPLEVEL+1; 20225000
|
|
DO BEGIN 20226000
|
|
THISLEVEL:=THISLEVEL-1; 20227000
|
|
THISTAB:=IF THISLEVEL{CURLEVEL THEN THISLEVEL 20228000
|
|
ELSE DISPLAY[THISLEVEL].NAMETAB; 20229000
|
|
SEARCHTAB(THISTAB); 20230000
|
|
END UNTIL FOUND OR THISLEVEL=0; 20231000
|
|
THISID:=NAMETAB3[THISTAB,THISINDEX]; 20232000
|
|
END OF SEARCH #; 20233000
|
|
20234000
|
|
20235000
|
|
DEFINE NEWNAME(NAME1,NAME2,TAB) = 20236000
|
|
BEGIN %*** ENTER A NEW NAME INTO THE NAME TABLE "TAB". 20237000
|
|
THISINDEX:=HASH(NAME1); 20238000
|
|
TNAME:=NAMETAB1[TAB,THISINDEX]; 20239000
|
|
WHILE(IF TNAME=NAME1 THEN NAMETAB2[TAB,THISINDEX]!NAME2 20240000
|
|
ELSE TNAME!0) DO 20241000
|
|
BEGIN 20242000
|
|
THISINDEX:=IF THISINDEX=0 THEN MAXNAMES ELSE THISINDEX-1; 20243000
|
|
TNAME:=NAMETAB1[TAB,THISINDEX]; 20244000
|
|
END; 20245000
|
|
IF TNAME!0 THEN ERROR(2); 20246000
|
|
NAMETAB1[TAB,THISINDEX]:=NAME1; 20247000
|
|
NAMETAB2[TAB,THISINDEX]:=NAME2; 20248000
|
|
IF XREFOPTION THEN NEWXREF(NAME1,NAME2,TAB,TRUE); 20249000
|
|
END OF NEWNAME #; 20250000
|
|
20251000
|
|
20300000
|
|
PROCEDURE INITIALIZE; %*** INITIALIZATION *** 20301000
|
|
BEGIN %********************** 20302000
|
|
INTEGER T1,T3; 20303000
|
|
ALPHA A; 20304000
|
|
FILL SYMKIND[*] WITH 28(MIDDLE),TERMINAL,4(MIDDLE),INITIAL,TERMINAL,20305000
|
|
INITIAL,MIDDLE,TERMINAL,INITIAL,MIDDLE,INITIAL,TERMINAL,INITIAL, 20306000
|
|
MIDDLE,INITIAL,2(MIDDLE),INITIAL,MIDDLE,INITIAL,4(MIDDLE), 20307000
|
|
7(INITIAL),MIDDLE; 20308000
|
|
20309000
|
|
FILL SYMBOL[*] WITH 10(0),0,ARROW,0,COLON,GTRSY,GEQSY,PLUS,9(0), 20310000
|
|
DOT,LBRACKET,ANDSY,LPAR,LSSSY,ARROW,0,9(0),0,ASTERISK,MINUS, 20311000
|
|
RPAR,SEMICOLON,LEQSY,0,SLASH,8(0),COMMA,0,NEQSY,EQLSY,RBRACKET, 20312000
|
|
0,DOUBLEDOT; 20313000
|
|
20314000
|
|
LINEPNT :=POINTER(LINE[1]); 20315000
|
|
XLINEPNT:=POINTER(XLINE[1]); 20316000
|
|
REPLACE LINEPNT-8 BY " => ", " " FOR 16 WORDS; 20317000
|
|
REPLACE XLINEPNT-8 BY " " FOR 11 WORDS; 20318000
|
|
REPLACE POINTER(ERRLINE[*]) BY "**** ", " " FOR 16 WORDS; 20319000
|
|
ALGOLPNT:=POINTER(ALGOLCARD[*]); ALGOLCNT:=71; 20320000
|
|
REPLACE ALGOLPNT BY " " FOR 9 WORDS; 20321000
|
|
CHARPNT:=POINTER(CH[*])+7; 20322000
|
|
TEXTPNT:=POINTER(TEXT[*])+1; TEXTPNT0:=TEXTPNT-1; 20323000
|
|
REPLACE TEXTPNT BY " " FOR 15; 20324000
|
|
STRINGPNT:=POINTER(STRING[*]); 20325000
|
|
REPLACE POINTER(HEADTEXT[*]) BY " " FOR 10 WORDS, "PAGE "; 20326000
|
|
REPLACE POINTER(HEADTEXT[*]) BY "PASCAL(", EDITION, ")/B-5700"; 20327000
|
|
TEXT[0]:=TIME(5); 20328000
|
|
REPLACE POINTER(HEADTEXT[*])+45 BY TEXTPNT+3 FOR 2, "/", 20329000
|
|
TEXTPNT+1 FOR 2, "/", TEXTPNT+5 FOR 2; 20330000
|
|
T1:=TIME(1)/3600; 20331000
|
|
REPLACE POINTER(HEADTEXT[*])+57 BY (T1 DIV 60) FOR 2 DIGITS, ":", 20332000
|
|
ENTIER(T1 MOD 60) FOR 2 DIGITS; 20333000
|
|
HEADING; 20334000
|
|
20335000
|
|
%*** INITIALIZE INTRINSIC TYPES, CONSTANTS ETC. *** 20336000
|
|
20337000
|
|
INTTYPE:=T3:=1; %*** "INTEGER" *** 20338000
|
|
T1:=NUMERIC; T1.SIZE:=1; T1.STRUCT:=0; 20339000
|
|
TYPETAB1[1]:=T1; TYPETAB2[1]:=-MAXINT; TYPETAB3[1]:=MAXINT; 20340000
|
|
NEWNAME("7INTEGE","R",0); T3.IDCLASS:=TYPES; 20341000
|
|
NAMETAB3[0,THISINDEX]:=T3; 20342000
|
|
REALTYPE:=T3:=2; %*** "REAL" *** 20343000
|
|
T1.FORM:=FLOATING; TYPETAB1[2]:=T1; 20344000
|
|
NEWNAME("400REAL",0,0); T3.IDCLASS:=TYPES; 20345000
|
|
NAMETAB3[0,THISINDEX]:=T3; 20346000
|
|
ALFATYPE:=T3:=3; %*** "ALFA" *** 20347000
|
|
T1.FORM:=ALFA; TYPETAB1[3]:=T1; 20348000
|
|
NEWNAME("400ALFA",0,0); T3.IDCLASS:=TYPES; 20349000
|
|
NAMETAB3[0,THISINDEX]:=T3; 20350000
|
|
BOOLTYPE:=T3:=4; %*** "BOOLEAN" *** 20351000
|
|
T1.FORM:=SYMBOLIC; TYPETAB1[4]:=T1; TYPETAB3[4]:=1; 20352000
|
|
NEWNAME("7BOOLEA","N",0); T3.IDCLASS:=TYPES; 20353000
|
|
NAMETAB3[0,THISINDEX]:=T3; 20354000
|
|
CHARTYPE:=T3:=5; %*** "CHAR" *** 20355000
|
|
T1.FORM:=CHAR; TYPETAB1[5]:=T1; TYPETAB3[5]:=63; 20356000
|
|
NEWNAME("400CHAR",0,0); T3.IDCLASS:=TYPES; 20357000
|
|
NAMETAB3[0,THISINDEX]:=T3; 20358000
|
|
T3:=BOOLTYPE; T3.IDCLASS:=CONST; %*** "FALSE" *** 20359000
|
|
NEWNAME("50FALSE",0,0); NAMETAB3[0,THISINDEX]:=T3; 20360000
|
|
T3.INFO:=1; %*** "TRUE" *** 20361000
|
|
NEWNAME("400TRUE",0,0); NAMETAB3[0,THISINDEX]:=T3; 20362000
|
|
NUMTYPES:=5; 20363000
|
|
NILTYPE:=-1; %*** TYPE OF "NIL" *** 20364000
|
|
EMPTYSET:=-2; %*** TYPE OF [] *** 20365000
|
|
NEWNAME("6MAXINT",0,0); T3:=INTTYPE; %*** "MAXINT" *** 20366000
|
|
T3.IDCLASS:=CONST; T3.INFO:=1024; 20367000
|
|
NAMETAB3[0,THISINDEX]:=T3; 20368000
|
|
NUMCONSTS:=1; CONSTTAB[1]:=MAXINT; 20369000
|
|
20370000
|
|
T3:=0; T3.IDCLASS:=PROC; %*** PROCEDURES *** 20371000
|
|
FOR A:="3000GET", "3000NEW", "400PACK", "400PAGE", "3000PUT", 20372000
|
|
"400READ", "6READLN", "50RESET", "6UNPACK", "50WRITE" DO 20373000
|
|
BEGIN 20374000
|
|
NEWNAME(A,0,0); NAMETAB3[0,THISINDEX]:=T3; 20375000
|
|
END; 20376000
|
|
NEWNAME("7DISPOS","E",0); NAMETAB3[0,THISINDEX]:=T3; 20377000
|
|
NEWNAME("7REWRIT","E",0); NAMETAB3[0,THISINDEX]:=T3; 20378000
|
|
NEWNAME("7WRITEL","N",0); NAMETAB3[0,THISINDEX]:=T3; 20379000
|
|
20380000
|
|
T3.IDCLASS:=FUNC; %*** FUNCTIONS *** 20381000
|
|
FOR A:="3000ABS", "6ARCTAN", "3000CHR", "3000COS", "3000EOF", 20382000
|
|
"400EOLN", "3000EXP", "20000LN", "3000ODD", "400PRED", 20383000
|
|
"400SUCC", "50ROUND", "3000SIN", "3000SQR", "400SQRT", 20384000
|
|
"50TRUNC", "6CONCAT", "400TIME", "400DATE", "6IOTIME", 20385000
|
|
"400USER", "3000ORD" 20386000
|
|
DO BEGIN 20387000
|
|
NEWNAME(A,0,0); NAMETAB3[0,THISINDEX]:=T3; 20388000
|
|
END; 20389000
|
|
NEWNAME("7ELAPSE","D",0); NAMETAB3[0,THISINDEX]:=T3; 20390000
|
|
NEWNAME("7WEEKDA","Y",0); NAMETAB3[0,THISINDEX]:=T3; 20391000
|
|
20392000
|
|
TEXTTYPE:=T3:=NUMTYPES:=NUMTYPES+1; %*** "TEXT" *** 20393000
|
|
T1 := TEXTFILE; T1.STRUCT := 1; TYPETAB1[TEXTTYPE] := T1; % 20394000
|
|
T3.IDCLASS := TYPES; % 20395000
|
|
NEWNAME("400TEXT",0,0); NAMETAB3[0,THISINDEX]:=T3; 20396000
|
|
T3:=TEXTTYPE; T3.IDCLASS:=VAR; %*** "INPUT" *** 20397000
|
|
T3.EXTERNALFILE:=1; 20398000
|
|
NEWNAME("50INPUT",0,0); INPUTFILE:=THISINDEX; 20399000
|
|
NAMETAB3[0,THISINDEX]:=T3; 20400000
|
|
NEWNAME("6OUTPUT",0,0); %*** "OUTPUT" *** 20401000
|
|
NAMETAB3[0,THISINDEX]:=T3; OUTPUTFILE:=THISINDEX; 20402000
|
|
END OF INTIALIZED; 20403000
|
|
20404000
|
|
20500000
|
|
20501000
|
|
%*** XREF ROUTINES *** 20502000
|
|
%********************** 20503000
|
|
20504000
|
|
DEFINE XREFCARD=[16:17]#, 20505000
|
|
XREFBLOCK=[26:10]#; 20506000
|
|
REAL A0,B0,A1,B1,LASTA0,LASTA1; 20507000
|
|
INTEGER NL,LASTBLOCK,A2,AX; 20508000
|
|
20509000
|
|
PROCEDURE NEWXREF(NAME1,NAME2,TABLE,DECL); 20510000
|
|
VALUE NAME1,NAME2,TABLE,DECL; 20511000
|
|
REAL NAME1,NAME2; 20512000
|
|
INTEGER TABLE; 20513000
|
|
BOOLEAN DECL; 20514000
|
|
BEGIN 20515000
|
|
NL:=NAME1.NAMELENGTH; 20516000
|
|
IF NL<7 THEN NAME1:=0&NAME1[41:41:6]&NAME1[35:6|NL-1:6|NL] 20517000
|
|
ELSE NAME2:=0&NAME2[35:6|(NL-6)-1:6|(NL-6)]; 20518000
|
|
AX:=CARDCNT; AX.XREFBLOCK:=BLOCKTAB[TABLE]; 20519000
|
|
IF DECL THEN AX:=AX-100000000000; 20520000
|
|
WRITE(XREFFILE,*,NAME1,NAME2,AX); 20521000
|
|
END OF NEWXREF; 20522000
|
|
20523000
|
|
PROCEDURE XREFMAX(A); 20524000
|
|
ARRAY A[0]; 20525000
|
|
BEGIN 20526000
|
|
A[0]:="AZZZZZZ"; A[1]:="ZZZZZZ"; A[2]:=9999999999; 20527000
|
|
END OF XREFMAX; 20528000
|
|
20529000
|
|
20530000
|
|
BOOLEAN PROCEDURE XREFCOMPARE(A,B); 20531000
|
|
ARRAY A,B[0]; 20532000
|
|
BEGIN 20533000
|
|
A0:=A[0]; B0:=B[0]; A1:=A[1]; B1:=B[1]; 20534000
|
|
XREFCOMPARE:= 20535000
|
|
IF A0.[35:36]!B0.[35:36] THEN A0.[35:36]<B0.[35:36] ELSE 20536000
|
|
IF A1!B1 THEN A1<B1 ELSE 20537000
|
|
IF A0!B0 THEN A0.NAMELENGTH<B0.NAMELENGTH ELSE 20538000
|
|
A[2] LEQ B[2]; 20539000
|
|
END OF XREFCOMPARE; 20540000
|
|
20541000
|
|
20542000
|
|
PROCEDURE PRINTXREF(FINIS,A); 20543000
|
|
VALUE FINIS; BOOLEAN FINIS; 20544000
|
|
ARRAY A[0]; 20545000
|
|
BEGIN 20546000
|
|
IF FINIS THEN 20547000
|
|
BEGIN 20548000
|
|
WRITE(LINES,17,XREFLINE[*]); 20549000
|
|
CLOSE(LINES); 20550000
|
|
CLOSE(XREFFILE); 20551000
|
|
END 20552000
|
|
ELSE 20553000
|
|
BEGIN 20554000
|
|
A0:=A[0]; A1:=A[1]; A2:=A[2]; 20555000
|
|
IF A0=LASTA0 AND A1=LASTA1 AND A2.XREFBLOCK=LASTBLOCK THEN 20556000
|
|
BEGIN 20557000
|
|
IF NUMXREF=15 THEN 20558000
|
|
BEGIN 20559000
|
|
WRITE(LINES,17,XREFLINE[*]); LINECNT:=LINECNT+1; 20560000
|
|
IF LINECNT>LINESPERPAGE THEN HEADING; 20561000
|
|
XREFPNT:=POINTER(XREFLINE[*]); NUMXREF:=0; 20562000
|
|
REPLACE XREFPNT BY " " FOR 17 WORDS; XREFPNT:=XREFPNT+24; 20563000
|
|
END; 20564000
|
|
REPLACE XREFPNT BY A2.XREFCARD FOR 5 DIGITS; 20565000
|
|
XREFPNT:=XREFPNT+7; NUMXREF:=NUMXREF+1; 20566000
|
|
END ELSE 20567000
|
|
IF A2<0 THEN 20568000
|
|
BEGIN 20569000
|
|
A2:=A2+100000000000; 20570000
|
|
WRITE(LINES,17,XREFLINE[*]); LINECNT:=LINECNT+1; 20571000
|
|
IF LINECNT>LINESPERPAGE THEN HEADING; 20572000
|
|
XREFPNT:=POINTER(XREFLINE[*]); NUMXREF:=0; 20573000
|
|
REPLACE XREFPNT BY " " FOR 17 WORDS; 20574000
|
|
TEXT[0]:=A0.[35:36]; LASTA0:=A0; 20575000
|
|
REPLACE XREFPNT BY TEXTPNT+1 FOR A0.NAMELENGTH; 20576000
|
|
TEXT[0]:=LASTA1:=A1; 20577000
|
|
IF A0.NAMELENGTH>6 THEN 20578000
|
|
REPLACE XREFPNT+6 BY TEXTPNT+1 FOR A0.NAMELENGTH-6; 20579000
|
|
REPLACE XREFPNT+17 BY A2.XREFCARD FOR 5 DIGITS; 20580000
|
|
XREFPNT:=XREFPNT+24; LASTBLOCK:=A2.XREFBLOCK; 20581000
|
|
END; 20582000
|
|
END; 20583000
|
|
END OF PRINTXREF; 20584000
|
|
20585000
|
|
20800000
|
|
20801000
|
|
INTEGER TT1,TT2,F1,F2,LT,RT; 20802000
|
|
20803000
|
|
DEFINE CHECKTYPES(LEFTTYPE,RIGHTTYPE)= 20804000
|
|
BEGIN 20805000
|
|
IF LEFTTYPE>0 AND RIGHTTYPE>0 THEN 20806000
|
|
IF LEFTTYPE!RIGHTTYPE THEN 20807000
|
|
BEGIN 20808000
|
|
LT:=LEFTTYPE; RT:=RIGHTTYPE; 20809000
|
|
TT1:=TYPETAB1[LT]; TT2:=TYPETAB1[RT]; 20810000
|
|
F1:=TT1.FORM; F2:=TT2.FORM; 20811000
|
|
IF LT!REALTYPE OR F2!NUMERIC THEN 20812000
|
|
IF(F1!SET AND LT!EMPTYSET)OR(F2!SET AND RT!EMPTYSET)THEN 20813000
|
|
IF(F1!POINTERS AND LT!NILTYPE)OR(F2!POINTERS AND RT!NILTYPE)THEN 20814000
|
|
BEGIN 20815000
|
|
IF F1=SET AND F2=SET THEN 20816000
|
|
BEGIN 20817000
|
|
LT:=TT1.SETTYPE; RT:=TT2.SETTYPE; 20818000
|
|
TT1:=TYPETAB1[LT]; TT2:=TYPETAB1[RT]; 20819000
|
|
F1:=TT1.FORM; F2:=TT2.FORM; 20820000
|
|
END; 20821000
|
|
IF F1=POINTERS AND F2=POINTERS THEN 20822000
|
|
BEGIN 20823000
|
|
LT:=TT1.POINTTYPE; RT:=TT2.POINTTYPE; 20824000
|
|
TT1:=TYPETAB1[LT]; TT2:=TYPETAB1[RT]; 20825000
|
|
F1:=TT1.FORM; F2:=TT2.FORM; 20826000
|
|
END; 20827000
|
|
WHILE F1=SUBTYPE DO 20828000
|
|
BEGIN LT:=TT1.MAINTYPE; TT1:=TYPETAB1[LT]; F1:=TT1.FORM END; 20829000
|
|
WHILE F2=SUBTYPE DO 20830000
|
|
BEGIN RT:=TT2.MAINTYPE; TT2:=TYPETAB1[RT]; F2:=TT2.FORM END; 20831000
|
|
IF LT>0 AND RT>0 THEN 20832000
|
|
IF LT!RT THEN 20833000
|
|
IF F1!NUMERIC OR F2!NUMERIC THEN 20834000
|
|
IF F1!CHAR OR F2!CHAR THEN ERROR(17); 20835000
|
|
END; 20836000
|
|
END; 20837000
|
|
END OF CHECKTYPES#; 20838000
|
|
20839000
|
|
20840000
|
|
INTEGER FILENAME; 20841000
|
|
BOOLEAN LPARFOUND; 20842000
|
|
20843000
|
|
DEFINE FILEPARAM(DEFAULTFILE)=%*** CHECKS THE FIRST PARAMETER TO SEE 20844000
|
|
BEGIN %*** IF IT IS A FILE. 20845000
|
|
INSYMBOL; FILENAME:=CURTYPE:=0; 20846000
|
|
LPARFOUND:=CURSY=LPAR; 20847000
|
|
IF LPARFOUND THEN 20848000
|
|
BEGIN 20849000
|
|
INSYMBOL; 20850000
|
|
IF CURSY=IDENTIFIER THEN 20851000
|
|
BEGIN 20852000
|
|
SEARCH; 20853000
|
|
IF FOUND THEN 20854000
|
|
BEGIN 20855000
|
|
IF THISID.IDCLASS=VAR THEN 20856000
|
|
BEGIN 20857000
|
|
CURTYPE:=THISID.TYPE; 20858000
|
|
IF TYPETAB1[CURTYPE].FORM}FILES THEN 20859000
|
|
BEGIN 20860000
|
|
FILENAME:=1000|THISLEVEL+THISINDEX; 20861000
|
|
INSYMBOL; 20862000
|
|
END END END END; 20863000
|
|
IF SYMKIND[CURSY]=TERMINAL THEN ERROR(46); 20864000
|
|
END; 20865000
|
|
IF FILENAME=0 THEN FILENAME:=DEFAULTFILE; 20866000
|
|
IF (FILENAME=INPUTFILE AND NOT INPUTDECL) OR 20867000
|
|
(FILENAME=OUTPUTFILE AND NOT OUTPUTDECL) THEN ERROR(96); 20868000
|
|
END OF FILEPARAM#; 20869000
|
|
20870000
|
|
20871000
|
|
INTEGER TFORM; 20872000
|
|
BOOLEAN SIGNED,NEGATIVE; 20873000
|
|
20874000
|
|
DEFINE CONSTANT(CVAL,CTYPE)= %*** <CONSTANT> *** 20875000
|
|
BEGIN %****************** 20876000
|
|
IF CURSY=MINUS OR CURSY=PLUS THEN 20877000
|
|
BEGIN SIGNED:=TRUE; NEGATIVE:=CURSY=MINUS; 20878000
|
|
INSYMBOL; 20879000
|
|
END ELSE SIGNED:=NEGATIVE:=FALSE; 20880000
|
|
IF CURSY=INTCONST THEN 20881000
|
|
BEGIN CTYPE:=INTTYPE; 20882000
|
|
CVAL:=IF NEGATIVE THEN -CURVAL ELSE CURVAL; 20883000
|
|
END ELSE 20884000
|
|
IF CURSY=CHARCONST THEN 20885000
|
|
BEGIN IF SIGNED THEN ERROR(29); 20886000
|
|
CTYPE:=CHARTYPE; CVAL:=CURVAL; 20887000
|
|
END ELSE 20888000
|
|
IF CURSY=REALCONST THEN 20889000
|
|
BEGIN CTYPE:=REALTYPE; 20890000
|
|
CVAL:=IF NEGATIVE THEN -CURVAL ELSE CURVAL; 20891000
|
|
END ELSE 20892000
|
|
IF CURSY=ALFACONST THEN 20893000
|
|
BEGIN IF SIGNED THEN ERROR(29); 20894000
|
|
IF CURLENGTH>7 THEN ERROR(41); 20895000
|
|
CTYPE:=ALFATYPE; CVAL:=CURVAL; 20896000
|
|
END ELSE 20897000
|
|
IF CURSY=IDENTIFIER THEN 20898000
|
|
BEGIN 20899000
|
|
SEARCH; 20900000
|
|
IF FOUND THEN 20901000
|
|
BEGIN 20902000
|
|
IF THISID.IDCLASS=CONST AND NOT BOOLEAN(THISID.FORMAL) THEN 20903000
|
|
BEGIN 20904000
|
|
IF TYPETAB1[THISID.TYPE].FORM{ALFA THEN 20905000
|
|
BEGIN 20906000
|
|
CVAL:=THISID.INFO; 20907000
|
|
IF CVAL>1023 THEN CVAL:=CONSTTAB[CVAL-1023]; 20908000
|
|
CTYPE:=THISID.TYPE; 20909000
|
|
IF SIGNED THEN 20910000
|
|
BEGIN 20911000
|
|
TFORM:=TYPETAB1[THISID.TYPE].FORM; 20912000
|
|
IF TFORM!NUMERIC AND TFORM!FLOATING THEN ERROR(29) ELSE 20913000
|
|
IF NEGATIVE THEN CVAL:=-CVAL; 20914000
|
|
END; 20915000
|
|
END ELSE BEGIN ERROR(48); CVAL:=CTYPE:=0 END; 20916000
|
|
END ELSE BEGIN ERROR(32); CVAL:=CTYPE:=0 END; 20917000
|
|
END ELSE BEGIN ERROR(1); CVAL:=CTYPE:=0 END; 20918000
|
|
END ELSE BEGIN ERROR(32); CVAL:=CTYPE:=0 END; 20919000
|
|
INSYMBOL; 20920000
|
|
END OF CONSTANT#; 20921000
|
|
$ PAGE 30000000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30001000
|
|
% %30002000
|
|
% %30003000
|
|
% %30004000
|
|
% PART 3: THE SCANNER. %30005000
|
|
% ------------ %30006000
|
|
% %30007000
|
|
% %30008000
|
|
% %30009000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30010000
|
|
30011000
|
|
% INTERNAL INTERNAL SYMBOL 30012000
|
|
% SYMBOL NUMBER NAME KIND 30013000
|
|
% 30014000
|
|
% IDENTIFIER 1 IDENTIFIER MIDDLE 30015000
|
|
% 122 2 INTCONST MIDDLE 30016000
|
|
% 2.5 3 REALCONST MIDDLE 30017000
|
|
% "ABCD" 4 ALFACONST MIDDLE 30018000
|
|
% "C" 5 CHARCONST MIDDLE 30019000
|
|
% NOT 6 NOTSY MIDDLE 30020000
|
|
% * 7 ASTERISK MIDDLE 30021000
|
|
% / 8 SLASH MIDDLE 30022000
|
|
% & AND 9 ANDSY MIDDLE 30023000
|
|
% DIV 10 DIVSY MIDDLE 30024000
|
|
% MOD 11 MODSY MIDDLE 30025000
|
|
% + 12 PLUS MIDDLE 30026000
|
|
% - 13 MINUS MIDDLE 30027000
|
|
% OR 14 ORSY MIDDLE 30028000
|
|
% < LSS 15 LSSSY MIDDLE 30029000
|
|
% <= LEQ { 16 LEQSY MIDDLE 30030000
|
|
% >= GEQ } 17 GEQSY MIDDLE 30031000
|
|
% > GTR 18 GTRSY MIDDLE 30032000
|
|
% <> NEQ ! 19 NEQSY MIDDLE 30033000
|
|
% = EQL 30 EQLSY MIDDLE 30034000
|
|
% IN 21 INSY MIDDLE 30035000
|
|
% ( 22 LPAR MIDDLE 30036000
|
|
% ) 23 RPAR MIDDLE 30037000
|
|
% [ 24 LBRACKET MIDDLE 30038000
|
|
% ] 25 RBRACKET MIDDLE 30039000
|
|
% .. 26 DOUBLEDOT MIDDLE 30040000
|
|
% , 27 COMMA MIDDLE 30041000
|
|
% ; 28 SEMICOLON TERMINAL 30042000
|
|
% . 29 DOT MIDDLE 30043000
|
|
% ~ @ 30 ARROW MIDDLE 30044000
|
|
% : 31 COLON MIDDLE 30045000
|
|
% := 32 ASSIGNSY MIDDLE 30046000
|
|
% BEGIN 33 BEGINSY INITIAL 30047000
|
|
% END 34 ENDSY TERMINAL 30048000
|
|
% IF 35 IFSY INITIAL 30049000
|
|
% THEN 36 THENSY MIDDLE 30050000
|
|
% ELSE 37 ELSESY TERMINAL 30051000
|
|
% CASE 38 CASESY INITIAL 30052000
|
|
% OF 39 OFSY MIDDLE 30053000
|
|
% REPEAT 40 REPEATSY INITIAL 30054000
|
|
% UNTIL 41 UNTILSY TERMINAL 30055000
|
|
% WHILE 42 WHILESY INITIAL 30056000
|
|
% DO 43 DOSY MIDDLE 30057000
|
|
% FOR 44 FORSY INITIAL 30058000
|
|
% TO 45 TOSY MIDDLE 30059000
|
|
% DOWNTO 46 DOWNTOSY MIDDLE 30060000
|
|
% GOTO 47 GOTOSY INITIAL 30061000
|
|
% NIL 48 NILSY MIDDLE 30062000
|
|
% TYPE 49 TYPESY INITIAL 30063000
|
|
% ARRAY 50 ARRAYSY MIDDLE 30064000
|
|
% RECORD 51 RECORDSY MIDDLE 30065000
|
|
% FILE 52 FILESY MIDDLE 30066000
|
|
% SET 53 SETSY MIDDLE 30067000
|
|
% CONST 54 CONSTSY INITIAL 30068000
|
|
% VAR 55 VARSY INITIAL 30069000
|
|
% LABEL 56 LABELSY INITIAL 30070000
|
|
% FUNCTION 57 FUNCSY INITIAL 30071000
|
|
% PROCEDURE 58 PROCSY INITIAL 30072000
|
|
% WITH 59 WITHSY INITIAL 30073000
|
|
% PROGRAM 60 PROGRAMSY INITIAL 30074000
|
|
% PACKED 61 PACKEDSY MIDDLE 30075000
|
|
30076000
|
|
30077000
|
|
DEFINE BLANK=48#, EQUAL=61#, QUOTES=63#, DOLLAR=42#, 30078000
|
|
LETTER(C)=(17{C AND C{25)OR(33{C AND C{41)OR(50{C AND C{57)#, 30079000
|
|
ALFANUM(C)=(LETTER(C) OR C{9)#; 30080000
|
|
30081000
|
|
REAL CURVAL; 30082000
|
|
ALPHA CURNAME1,CURNAME2,C,CX; 30083000
|
|
INTEGER CURLENGTH,LASTCHARPOS; 30084000
|
|
BOOLEAN FINIS; 30085000
|
|
30086000
|
|
DEFINE NEXTCHAR= 30087000
|
|
BEGIN COMMENT *** READ NEXT CHARACTER. ***; 30088000
|
|
IF CHARCNT=0 THEN C:=BLANK ELSE 30089000
|
|
BEGIN 30090000
|
|
REPLACE CHARPNT BY CARDPNT:CARDPNT FOR 1; 30091000
|
|
C:=CH[0]; CHARCNT:=CHARCNT-1; 30092000
|
|
END END #; 30093000
|
|
30094000
|
|
30095000
|
|
30096000
|
|
PROCEDURE INSYMBOL; 30097000
|
|
BEGIN COMMENT *** READS THE NEXT SYMBOL. ***; 30098000
|
|
INTEGER SCALE,EXP; 30099000
|
|
BOOLEAN NEGEXP; 30100000
|
|
LABEL START,OVERFLOW; 30101000
|
|
30102000
|
|
START: 30103000
|
|
IF C=BLANK THEN 30104000
|
|
BEGIN SCAN CARDPNT:CARDPNT FOR CHARCNT:CHARCNT WHILE =" "; 30105000
|
|
IF CHARCNT=0 THEN BEGIN NEWCARD; GO TO START END; 30106000
|
|
NEXTCHAR; 30107000
|
|
END; 30108000
|
|
IF LETTER(C) THEN 30109000
|
|
BEGIN 30110000
|
|
CURLENGTH:=1; CURNAME1:=C; CURNAME2:=0; 30111000
|
|
NEXTCHAR; 30112000
|
|
WHILE ALFANUM(C) AND CURLENGTH<6 DO 30113000
|
|
BEGIN CURNAME1:=C&CURNAME1[35:29:30]; 30114000
|
|
CURLENGTH:=CURLENGTH+1; NEXTCHAR; 30115000
|
|
END; 30116000
|
|
IF CURLENGTH=6 THEN 30117000
|
|
BEGIN 30118000
|
|
WHILE ALFANUM(C) AND CURLENGTH<12 DO 30119000
|
|
BEGIN CURNAME2:=C&CURNAME2[35:29:30]; 30120000
|
|
CURLENGTH:=CURLENGTH+1; NEXTCHAR; 30121000
|
|
END; 30122000
|
|
WHILE ALFANUM(C) DO NEXTCHAR; 30123000
|
|
END; 30124000
|
|
CURNAME1.NAMELENGTH:=CURLENGTH; 30125000
|
|
CASE CURLENGTH OF 30126000
|
|
BEGIN ; 30127000
|
|
CURSY:=IDENTIFIER; 30128000
|
|
CURSY:=IF CURNAME1="20000IF" THEN IFSY ELSE 30129000
|
|
IF CURNAME1="20000DO" THEN DOSY ELSE 30130000
|
|
IF CURNAME1="20000TO" THEN TOSY ELSE 30131000
|
|
IF CURNAME1="20000OR" THEN ORSY ELSE 30132000
|
|
IF CURNAME1="20000OF" THEN OFSY ELSE 30133000
|
|
IF CURNAME1="20000IN" THEN INSY ELSE IDENTIFIER; 30134000
|
|
CURSY:=IF CURNAME1="3000END" THEN ENDSY ELSE 30135000
|
|
IF CURNAME1="3000FOR" THEN FORSY ELSE 30136000
|
|
IF CURNAME1="3000DIV" THEN DIVSY ELSE 30137000
|
|
IF CURNAME1="3000MOD" THEN MODSY ELSE 30138000
|
|
IF CURNAME1="3000NIL" THEN NILSY ELSE 30139000
|
|
IF CURNAME1="3000AND" THEN ANDSY ELSE 30140000
|
|
IF CURNAME1="3000NOT" THEN NOTSY ELSE 30141000
|
|
IF CURNAME1="3000VAR" THEN VARSY ELSE 30142000
|
|
IF CURNAME1="3000SET" THEN SETSY ELSE 30143000
|
|
IF CURNAME1="3000LSS" THEN LSSSY ELSE 30144000
|
|
IF CURNAME1="3000LEQ" THEN LEQSY ELSE 30145000
|
|
IF CURNAME1="3000GEQ" THEN GEQSY ELSE 30146000
|
|
IF CURNAME1="3000GTR" THEN GTRSY ELSE 30147000
|
|
IF CURNAME1="3000NEQ" THEN NEQSY ELSE 30148000
|
|
IF CURNAME1="3000EQL" THEN EQLSY ELSE IDENTIFIER; 30149000
|
|
CURSY:=IF CURNAME1="400THEN" THEN THENSY ELSE 30150000
|
|
IF CURNAME1="400ELSE" THEN ELSESY ELSE 30151000
|
|
IF CURNAME1="400WITH" THEN WITHSY ELSE 30152000
|
|
IF CURNAME1="400CASE" THEN CASESY ELSE 30153000
|
|
IF CURNAME1="400GOTO" THEN GOTOSY ELSE 30154000
|
|
IF CURNAME1="400TYPE" THEN TYPESY ELSE 30155000
|
|
IF CURNAME1="400FILE" THEN FILESY ELSE IDENTIFIER; 30156000
|
|
CURSY:=IF CURNAME1="50BEGIN" THEN BEGINSY ELSE 30157000
|
|
IF CURNAME1="50WHILE" THEN WHILESY ELSE 30158000
|
|
IF CURNAME1="50UNTIL" THEN UNTILSY ELSE 30159000
|
|
IF CURNAME1="50ARRAY" THEN ARRAYSY ELSE 30160000
|
|
IF CURNAME1="50CONST" THEN CONSTSY ELSE 30161000
|
|
IF CURNAME1="50LABEL" THEN LABELSY ELSE IDENTIFIER; 30162000
|
|
CURSY:=IF CURNAME1="6REPEAT" THEN REPEATSY ELSE 30163000
|
|
IF CURNAME1="6DOWNTO" THEN DOWNTOSY ELSE 30164000
|
|
IF CURNAME1="6RECORD" THEN RECORDSY ELSE 30165000
|
|
IF CURNAME1="6PACKED" THEN PACKEDSY ELSE IDENTIFIER; 30166000
|
|
CURSY:=IF CURNAME1="7PROGRA" AND CURNAME2="M" THEN PROGRAMSY 30167000
|
|
ELSE IDENTIFIER; 30168000
|
|
CURSY:=IF CURNAME1="8FUNCTI" AND CURNAME2="ON" THEN FUNCSY 30169000
|
|
ELSE IDENTIFIER; 30170000
|
|
CURSY:=IF CURNAME1="9PROCED" AND CURNAME2="URE" THEN PROCSY 30171000
|
|
ELSE IDENTIFIER; 30172000
|
|
CURSY:=IDENTIFIER; % 10 CHARACTERS. 30173000
|
|
CURSY:=IDENTIFIER; % 11 CHARACTERS. 30174000
|
|
CURSY:=IDENTIFIER; % 12 CHARACTERS. 30175000
|
|
END OF CASE; 30176000
|
|
IF RESWORDOPTION AND CURSY!IDENTIFIER THEN 30177000
|
|
BEGIN T1:=CARDLENGTH-CHARCNT-CURLENGTH; 30178000
|
|
IF CHARCNT=0 THEN CARDPNT:=CARDPNT+1 ELSE T1:=T1-1; 30179000
|
|
REPLACE XLINEPNT+T1 BY CARDPNT-(CURLENGTH+1) 30180000
|
|
FOR CURLENGTH; 30181000
|
|
END; 30182000
|
|
END OF LETTER ELSE 30183000
|
|
IF C{9 THEN 30184000
|
|
BEGIN 30185000
|
|
CURVAL:=C; CURSY:=INTCONST; 30186000
|
|
NEXTCHAR; 30187000
|
|
WHILE C{9 DO BEGIN CURVAL:=10|CURVAL+C; NEXTCHAR END; 30188000
|
|
IF C="." THEN 30189000
|
|
BEGIN 30190000
|
|
NEXTCHAR; 30191000
|
|
IF C{9 THEN 30192000
|
|
BEGIN CURSY:=REALCONST; 30193000
|
|
DO BEGIN CURVAL:=10|CURVAL+C; 30194000
|
|
SCALE:=SCALE-1; NEXTCHAR; 30195000
|
|
END UNTIL C>9; 30196000
|
|
END ELSE IF C="." THEN C:=64 % SPECIAL MARK FOR ".." 30197000
|
|
ELSE ERROR(4); 30198000
|
|
END; 30199000
|
|
IF C="E" THEN 30200000
|
|
BEGIN 30201000
|
|
CURSY:=REALCONST; NEXTCHAR; 30202000
|
|
IF C="+" OR C="-" THEN BEGIN NEGEXP:=C="-"; NEXTCHAR END; 30203000
|
|
IF C{9 THEN 30204000
|
|
BEGIN EXP:=C; NEXTCHAR; 30205000
|
|
WHILE C{9 DO BEGIN EXP:=10|EXP+C; NEXTCHAR END; 30206000
|
|
IF NEGEXP THEN EXP:=-EXP; 30207000
|
|
END ELSE ERROR(4); 30208000
|
|
SCALE:=SCALE+EXP; 30209000
|
|
END; 30210000
|
|
IF CURSY=REALCONST THEN 30211000
|
|
BEGIN 30212000
|
|
REALOVERFLOW:=OVERFLOW; 30213000
|
|
CURVAL:=CURVAL|10*SCALE; 30214000
|
|
REALOVERFLOW:=0; 30215000
|
|
END ELSE 30216000
|
|
IF CURVAL>MAXINT THEN 30217000
|
|
BEGIN 30218000
|
|
OVERFLOW: ERROR(14); CURVAL:=0; REALOVERFLOW:=0; 30219000
|
|
END; 30220000
|
|
END OF DIGIT ELSE 30221000
|
|
IF C=QUOTES THEN 30222000
|
|
BEGIN 30223000
|
|
CURSY:=ALFACONST; CURLENGTH:=0; NEXTCHAR; 30224000
|
|
FINIS:=FALSE; 30225000
|
|
DO BEGIN 30226000
|
|
IF C=QUOTES THEN BEGIN NEXTCHAR; FINIS:=C!QUOTES END ELSE 30227000
|
|
IF CHARCNT=0 THEN BEGIN ERROR(6); FINIS:=TRUE END; 30228000
|
|
IF NOT FINIS THEN 30229000
|
|
BEGIN 30230000
|
|
REPLACE STRINGPNT+CURLENGTH BY CHARPNT FOR 1; 30231000
|
|
CURLENGTH:=CURLENGTH+1; 30232000
|
|
NEXTCHAR; 30233000
|
|
END END UNTIL FINIS; 30234000
|
|
IF CURLENGTH=0 THEN ERROR(4) ELSE 30235000
|
|
IF CURLENGTH=1 THEN 30236000
|
|
BEGIN CURSY:=CHARCONST; 30237000
|
|
REPLACE CHARPNT BY STRINGPNT FOR 1; CURVAL:=CH[0]; 30238000
|
|
END ELSE 30239000
|
|
IF CURLENGTH{7 THEN 30240000
|
|
BEGIN TEXT[0]:=" "; 30241000
|
|
REPLACE TEXTPNT BY STRINGPNT FOR CURLENGTH; 30242000
|
|
CURVAL:=TEXT[0]; 30243000
|
|
END; 30244000
|
|
END OF STRINGS ELSE 30245000
|
|
BEGIN 30246000
|
|
CURSY:=SYMBOL[C]; NEXTCHAR; 30247000
|
|
IF CURSY=COLON AND C=EQUAL THEN 30248000
|
|
BEGIN CURSY:=ASSIGNSY; NEXTCHAR END ELSE 30249000
|
|
IF CURSY=DOT AND C="." THEN 30250000
|
|
BEGIN CURSY:=DOUBLEDOT; NEXTCHAR END ELSE 30251000
|
|
IF CURSY=LSSSY AND C=EQUAL THEN 30252000
|
|
BEGIN CURSY:=LEQSY; NEXTCHAR END ELSE 30253000
|
|
IF CURSY=LSSSY AND C=">" THEN 30254000
|
|
BEGIN CURSY:=NEQSY; NEXTCHAR END ELSE 30255000
|
|
IF CURSY=GTRSY AND C=EQUAL THEN 30256000
|
|
BEGIN CURSY:=GEQSY; NEXTCHAR END ELSE 30257000
|
|
IF CURSY=LPAR AND C="*" THEN 30258000
|
|
BEGIN % *** COMMENT *** 30259000
|
|
NEXTCHAR; 30260000
|
|
IF C=DOLLAR THEN % DOLLAR INDICATES COMPILER OPTIONS. 30261000
|
|
DO BEGIN 30262000
|
|
NEXTCHAR; CX:=C; NEXTCHAR; 30263000
|
|
IF CX="L" THEN IF C=1 THEN HEADING 30264000
|
|
ELSE LISTOPTION:=C="+" ELSE 30265000
|
|
IF CX="R" THEN RESWORDOPTION:=C="+" ELSE 30266000
|
|
IF CX="C" THEN CHECKOPTION:=C="+" ELSE 30267000
|
|
IF CX="D" THEN DUMPOPTION:=C="+" ELSE 30268000
|
|
IF CX="X" THEN XREFOPTION:=C="+" ELSE 30269000
|
|
IF CX="A" THEN 30270000
|
|
IF C="+" THEN WRITE(PASCALGOL,ALIST) 30271000
|
|
ELSE WRITE(PASCALGOL,NOALIST) ELSE 30272000
|
|
IF CX="T" THEN 30273000
|
|
BEGIN LASTCHARPOS := CHARCNT - CARDLENGTH; 30274000
|
|
CARDLENGTH:=10|C; 30275000
|
|
NEXTCHAR; CARDLENGTH:=CARDLENGTH+C; 30276000
|
|
IF CARDLENGTH{9 OR CARDLENGTH>80 THEN 30277000
|
|
BEGIN ERROR(14); CARDLENGTH:=72 END; 30278000
|
|
CHARCNT:=MAX(0,LASTCHARPOS+CARDLENGTH-1); 30279000
|
|
END; 30280000
|
|
NEXTCHAR; 30281000
|
|
END UNTIL C!","; 30282000
|
|
FINIS:=FALSE; 30283000
|
|
DO BEGIN 30284000
|
|
IF C!"*" THEN 30285000
|
|
SCAN CARDPNT:CARDPNT FOR CHARCNT:CHARCNT UNTIL ="*"; 30286000
|
|
IF CHARCNT=0 THEN NEWCARD ELSE 30287000
|
|
BEGIN NEXTCHAR; 30288000
|
|
WHILE C="*" DO NEXTCHAR; 30289000
|
|
FINIS:=C=")"; 30290000
|
|
END END UNTIL FINIS; 30291000
|
|
NEXTCHAR; 30292000
|
|
GO TO START; 30293000
|
|
END OF COMMENT; 30294000
|
|
END; 30295000
|
|
END OF INSYMBOL; 30296000
|
|
$ PAGE 40000000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40001000
|
|
% %40002000
|
|
% %40003000
|
|
% %40004000
|
|
% PART 4: EXPRESSION PARSER. %40005000
|
|
% ------------------ %40006000
|
|
% %40007000
|
|
% %40008000
|
|
% %40009000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40010000
|
|
40011000
|
|
40012000
|
|
PROCEDURE EXPRESSION; FORWARD; 40013000
|
|
PROCEDURE CONCAT; FORWARD; 40014000
|
|
40015000
|
|
ALPHA TEMPSYM; 40016000
|
|
REAL SX; 40017000
|
|
INTEGER EXPRLEVEL,TX; 40018000
|
|
40019000
|
|
DEFINE PUTTEXT(T)= 40020000
|
|
BEGIN 40021000
|
|
IF NUMSYMS=MAXSYMS THEN 40022000
|
|
BEGIN ERROR(71); 40023000
|
|
NUMSYMS:=1; 40024000
|
|
END ELSE NUMSYMS:=NUMSYMS+1; 40025000
|
|
SYMTAB[NUMSYMS]:=T; 40026000
|
|
END OF PUTTEXT #; 40027000
|
|
40028000
|
|
DEFINE PUTSYM(S)= 40029000
|
|
BEGIN 40030000
|
|
TEMPSYM:=(S)&1[41:5:6]; 40031000
|
|
PUTTEXT(TEMPSYM); 40032000
|
|
END OF PUTSYM #; 40033000
|
|
40034000
|
|
DEFINE PUTCONST(VAL)= 40035000
|
|
BEGIN 40036000
|
|
PUTTEXT("2000000"); 40037000
|
|
PUTTEXT(VAL); 40038000
|
|
END OF PUTCONST #; 40039000
|
|
40040000
|
|
DEFINE PUTDUMMY= 40041000
|
|
BEGIN 40042000
|
|
PUTTEXT("3000000"); 40043000
|
|
END OF PUTDUMMY #; 40044000
|
|
40045000
|
|
DEFINE PUTID(L,NUM,NUMDIG)= 40046000
|
|
BEGIN 40047000
|
|
TEXT[0]:=" " & L [35:5:6]; 40048000
|
|
REPLACE TEXTPNT+2 BY NUM FOR NUMDIG DIGITS; 40049000
|
|
PUTTEXT(TEXT[0]); 40050000
|
|
END OF PUTID#; 40051000
|
|
40052000
|
|
DEFINE WRITEEXPR= 40053000
|
|
BEGIN 40054000
|
|
FOR T1:=1 STEP 1 UNTIL NUMSYMS DO 40055000
|
|
BEGIN 40056000
|
|
SX:=SYMTAB[T1]; TX:=SX.[41:6]; 40057000
|
|
IF TX=0 THEN GEN(SX,7,2) ELSE 40058000
|
|
IF TX=3 THEN ELSE 40059000
|
|
IF TX=1 THEN GEN(SX,1,7) ELSE 40060000
|
|
BEGIN 40061000
|
|
T1:=T1+1; SX:=SYMTAB[T1]; 40062000
|
|
IF SX.[44:6]=0 THEN GENINT(SX) ELSE GENREAL(SX); 40063000
|
|
END END; 40064000
|
|
NUMSYMS:=0; 40065000
|
|
END OF WRITEEXPR#; 40066000
|
|
40067000
|
|
40068000
|
|
DEFINE CHECKEXPR(LLIM,ULIM)= 40069000
|
|
BEGIN 40070000
|
|
PUTTEXT("CHECK("); 40071000
|
|
EXPRESSION; 40072000
|
|
PUTSYM(","); PUTCONST(LLIM); 40073000
|
|
PUTSYM(","); PUTCONST(ULIM); 40074000
|
|
PUTSYM(","); PUTCONST(CARDCNT); 40075000
|
|
PUTSYM(")"); 40076000
|
|
END OF CHECKEXPR#; 40077000
|
|
40078000
|
|
40079000
|
|
BOOLEAN SIMPLEVARIABLE,INSIDEBRACKETS; 40080000
|
|
INTEGER NUMPOINTERS; 40081000
|
|
40082000
|
|
PROCEDURE VARIABLE; 40083000
|
|
BEGIN 40084000
|
|
INTEGER STARTSYM,LLIM,ULIM; 40085000
|
|
REAL T; 40086000
|
|
BOOLEAN INBRACKET,INRECORD; 40087000
|
|
LABEL ADDADDR; 40088000
|
|
40089000
|
|
STARTSYM:=NUMSYMS+1; 40090000
|
|
IF THISLEVEL>CURLEVEL THEN % VARIABLE IN FIELD LIST OF 40091000
|
|
BEGIN % RECORD USED IN WITH-STATEMENT. 40092000
|
|
T:=DISPLAY[THISLEVEL]; 40093000
|
|
T4:=T.FIRSTWITHSYM; T5:=T.LASTWITHSYM; 40094000
|
|
FOR T3:=T4 STEP 1 UNTIL T5 DO PUTTEXT(WITHTAB[T3]); 40095000
|
|
INRECORD:=TRUE; 40096000
|
|
INBRACKET:=BOOLEAN(T.BRACKETSINWITH); 40097000
|
|
NUMPOINTERS:=NUMPOINTERS+T.NUMPNTRSINWITH; 40098000
|
|
SIMPLEVARIABLE:=FALSE; 40099000
|
|
CURTYPE:=T.RECTYPE; T:=TYPETAB1[CURTYPE]; 40100000
|
|
GO TO ADDADDR; 40101000
|
|
END; 40102000
|
|
IF THISLEVEL>1 AND THISLEVEL<CURLEVEL THEN ERROR(5); 40103000
|
|
CURTYPE:=THISID.TYPE; SIMPLEVARIABLE:=TRUE; 40104000
|
|
PUTID("V",1000|THISLEVEL+THISINDEX,5); 40105000
|
|
INSYMBOL; 40106000
|
|
IF CURSY=LBRACKET OR CURSY=DOT OR CURSY=ARROW THEN 40107000
|
|
BEGIN 40108000
|
|
SIMPLEVARIABLE:=FALSE; 40109000
|
|
DO BEGIN 40110000
|
|
IF CURSY=LBRACKET THEN 40111000
|
|
BEGIN 40112000
|
|
IF NOT(INBRACKET OR INRECORD) THEN 40113000
|
|
BEGIN PUTSYM("["); INBRACKET:=TRUE END; 40114000
|
|
DO BEGIN 40115000
|
|
T:=TYPETAB1[CURTYPE]; 40116000
|
|
LLIM:=TYPETAB2[CURTYPE]; ULIM:=TYPETAB3[CURTYPE]; 40117000
|
|
IF T.FORM!ARRAYS THEN ERROR(12); 40118000
|
|
IF INRECORD THEN PUTTEXT(" +("); 40119000
|
|
INSYMBOL; 40120000
|
|
IF CHECKOPTION THEN CHECKEXPR(LLIM,ULIM) ELSE EXPRESSION; 40121000
|
|
CHECKTYPES(T.INXTYPE,CURTYPE); 40122000
|
|
CURTYPE:=T.ARRTYPE; 40123000
|
|
IF INRECORD THEN 40124000
|
|
BEGIN 40125000
|
|
IF LLIM<0 THEN BEGIN PUTSYM("+"); PUTCONST(-LLIM) END ELSE40126000
|
|
IF LLIM>0 THEN BEGIN PUTSYM("-"); PUTCONST( LLIM) END; 40127000
|
|
PUTSYM(")"); 40128000
|
|
IF TYPETAB1[CURTYPE].SIZE>1 THEN 40129000
|
|
BEGIN PUTSYM("|"); PUTCONST(TYPETAB1[CURTYPE].SIZE) END; 40130000
|
|
END ELSE IF TYPETAB1[CURTYPE].STRUCT>0 THEN PUTSYM(","); 40131000
|
|
END UNTIL CURSY!COMMA; 40132000
|
|
IF CURSY!RBRACKET THEN 40133000
|
|
BEGIN ERROR(59); SKIP(RBRACKET); 40134000
|
|
IF CURSY=RBRACKET THEN INSYMBOL; 40135000
|
|
END ELSE INSYMBOL; 40136000
|
|
END OF BRACKETS ELSE 40137000
|
|
IF CURSY=DOT THEN 40138000
|
|
BEGIN 40139000
|
|
IF NOT(INBRACKET OR INRECORD) THEN 40140000
|
|
BEGIN PUTSYM("["); INBRACKET:=TRUE END; 40141000
|
|
T:=TYPETAB1[CURTYPE]; 40142000
|
|
IF T.FORM!RECORD THEN ERROR(12); 40143000
|
|
INSYMBOL; 40144000
|
|
IF CURSY=IDENTIFIER THEN 40145000
|
|
BEGIN 40146000
|
|
SEARCHTAB(T.RECTAB); 40147000
|
|
IF FOUND THEN 40148000
|
|
BEGIN 40149000
|
|
THISID:=NAMETAB3[T.RECTAB,THISINDEX]; 40150000
|
|
ADDADDR: PUTSYM("+"); 40151000
|
|
PUTCONST(THISID.INFO); CURTYPE:=THISID.TYPE; 40152000
|
|
END ELSE BEGIN ERROR(1); CURTYPE:=0 END; 40153000
|
|
END ELSE BEGIN ERROR(9); CURTYPE:=0 END; 40154000
|
|
INRECORD:=TRUE; 40155000
|
|
INSYMBOL; 40156000
|
|
END OF DOT ELSE 40157000
|
|
BEGIN % CURSY=ARROW 40158000
|
|
T:=TYPETAB1[CURTYPE]; 40159000
|
|
IF T.FORM=FILES THEN 40160000
|
|
BEGIN 40161000
|
|
CURTYPE:=T.FILETYPE; 40162000
|
|
IF TYPETAB1[CURTYPE].STRUCT=0 THEN PUTTEXT(" [0]"); 40163000
|
|
END ELSE 40164000
|
|
IF T.FORM=TEXTFILE THEN 40165000
|
|
BEGIN 40166000
|
|
SYMTAB[NUMSYMS]:=SYMTAB[NUMSYMS] & "I" [35:5:6]; 40167000
|
|
PUTSYM("."); PUTTEXT("LASTCH"); 40168000
|
|
CURTYPE:=CHARTYPE; 40169000
|
|
END ELSE 40170000
|
|
IF T.FORM=POINTERS THEN 40171000
|
|
BEGIN 40172000
|
|
IF INBRACKET THEN PUTSYM("]"); 40173000
|
|
INBRACKET:=FALSE; 40174000
|
|
IF NUMSYMS+2{MAXSYMS THEN 40175000
|
|
BEGIN 40176000
|
|
FOR T1:=NUMSYMS STEP -1 UNTIL STARTSYM DO 40177000
|
|
SYMTAB[T1+2]:=SYMTAB[T1]; 40178000
|
|
SYMTAB[STARTSYM]:=" MEM["; 40179000
|
|
SYMTAB[STARTSYM+1]:=" (T:="; 40180000
|
|
NUMSYMS:=NUMSYMS+2; NUMPOINTERS:=NUMPOINTERS+1; 40181000
|
|
INRECORD:=TRUE; 40182000
|
|
END ELSE ERROR(63); 40183000
|
|
CURTYPE:=T.POINTTYPE; 40184000
|
|
END ELSE BEGIN ERROR(12); CURTYPE:=0 END; 40185000
|
|
INSYMBOL; 40186000
|
|
END OF ARROW; 40187000
|
|
END UNTIL CURSY!LBRACKET AND CURSY!DOT AND CURSY!ARROW; 40188000
|
|
IF TYPETAB1[CURTYPE].STRUCT=0 THEN 40189000
|
|
BEGIN 40190000
|
|
IF INBRACKET THEN PUTSYM("]"); 40191000
|
|
WHILE NUMPOINTERS>0 DO 40192000
|
|
BEGIN PUTTEXT("-1)DIV"); PUTTEXT(" 1022,"); 40193000
|
|
PUTTEXT(" T MOD"); PUTTEXT(" 1022]"); 40194000
|
|
NUMPOINTERS:=NUMPOINTERS-1; 40195000
|
|
END; 40196000
|
|
END; 40197000
|
|
END; 40198000
|
|
INSIDEBRACKETS:=INBRACKET; 40199000
|
|
CURMODE:=NUMBER; 40200000
|
|
END OF VARIABLE; 40201000
|
|
40202000
|
|
40203000
|
|
PROCEDURE PASSPARAMS; 40204000
|
|
BEGIN 40205000
|
|
INTEGER NPARS,PARAM,PTYPE,P,FIRSTSYM; 40206000
|
|
BOOLEAN FORMALPROC,CHECK; 40207000
|
|
LABEL EXIT; 40208000
|
|
40209000
|
|
PUTID("V",1000|THISLEVEL+THISINDEX,5); 40210000
|
|
P:=THISID.INFO; 40211000
|
|
FORMALPROC:=BOOLEAN(THISID.FORMAL); 40212000
|
|
NPARS:=PARAMTAB[P]; P:=P+1; 40213000
|
|
IF FORMALPROC THEN NPARS:=9999; 40214000
|
|
INSYMBOL; 40215000
|
|
IF CURSY=LPAR THEN 40216000
|
|
BEGIN 40217000
|
|
PUTSYM("("); 40218000
|
|
DO BEGIN 40219000
|
|
INSYMBOL; 40220000
|
|
IF NPARS=0 THEN BEGIN ERROR(3); SKIP(RPAR); GO TO EXIT END; 40221000
|
|
PARAM:=PARAMTAB[P]; P:=P+1; 40222000
|
|
PTYPE:=PARAM.PARAMTYPE; 40223000
|
|
IF PARAM.PARAMKIND=CONST THEN 40224000
|
|
BEGIN 40225000
|
|
CHECK:=CHECKOPTION AND TYPETAB1[PTYPE].FORM LEQ CHAR; 40226000
|
|
IF CHECK THEN PUTTEXT("CHECK("); 40227000
|
|
PUTDUMMY; FIRSTSYM:=NUMSYMS; 40228000
|
|
EXPRLEVEL:=EXPRLEVEL+1; 40229000
|
|
EXPRESSION; EXPRLEVEL:=EXPRLEVEL-1; 40230000
|
|
IF CURMODE=BITPATTERN THEN 40231000
|
|
BEGIN SYMTAB[FIRSTSYM]:=" REAL("; PUTSYM(")"); END; 40232000
|
|
IF CHECK THEN 40233000
|
|
BEGIN 40234000
|
|
PUTSYM(","); PUTCONST(TYPETAB2[PTYPE]); 40235000
|
|
PUTSYM(","); PUTCONST(TYPETAB3[PTYPE]); 40236000
|
|
PUTSYM(","); PUTCONST(CARDCNT); PUTSYM(")"); 40237000
|
|
END; 40238000
|
|
END ELSE 40239000
|
|
IF PARAM.PARAMKIND=VAR THEN 40240000
|
|
BEGIN 40241000
|
|
IF CURSY=IDENTIFIER THEN 40242000
|
|
BEGIN 40243000
|
|
SEARCH; 40244000
|
|
IF FOUND THEN 40245000
|
|
BEGIN 40246000
|
|
IF THISID.IDCLASS=VAR OR 40247000
|
|
THISID.IDCLASS=CONST AND BOOLEAN(THISID.FORMAL) THEN 40248000
|
|
BEGIN 40249000
|
|
IF PARAM.PARAMFILE=1 THEN 40250000
|
|
BEGIN 40251000
|
|
CURTYPE:=THISID.TYPE; 40252000
|
|
PUTID("V",1000|THISLEVEL+THISINDEX,5); PUTSYM(","); 40253000
|
|
PUTID("F",1000|THISLEVEL+THISINDEX,5); PUTSYM(","); 40254000
|
|
PUTID("I",1000|THISLEVEL+THISINDEX,5); 40255000
|
|
INSYMBOL; 40256000
|
|
END ELSE 40257000
|
|
BEGIN 40258000
|
|
VARIABLE; 40259000
|
|
IF TYPETAB1[CURTYPE].STRUCT>0 THEN 40260000
|
|
IF NOT SIMPLEVARIABLE THEN ERROR(92); 40261000
|
|
END; 40262000
|
|
END ELSE BEGIN ERROR(8); CURTYPE:=0 END; 40263000
|
|
END ELSE BEGIN ERROR(1); CURTYPE:=0 END; 40264000
|
|
END ELSE BEGIN ERROR(9); CURTYPE:=0 END; 40265000
|
|
END ELSE 40266000
|
|
BEGIN 40267000
|
|
IF CURSY=IDENTIFIER THEN 40268000
|
|
BEGIN 40269000
|
|
SEARCH; 40270000
|
|
IF FOUND THEN 40271000
|
|
BEGIN 40272000
|
|
IF THISID.IDCLASS!PARAM.PARAMKIND THEN ERROR(91); 40273000
|
|
PUTID("V",1000|THISLEVEL+THISINDEX,5); 40274000
|
|
CURTYPE:=IF THISID.IDCLASS=FUNC THEN THISID.TYPE ELSE 0; 40275000
|
|
INSYMBOL; 40276000
|
|
END ELSE BEGIN ERROR(1); CURTYPE:=0 END; 40277000
|
|
END ELSE BEGIN ERROR(9); CURTYPE:=0 END; 40278000
|
|
END; 40279000
|
|
CHECKTYPES(PTYPE,CURTYPE); 40280000
|
|
NPARS:=NPARS-1; 40281000
|
|
IF CURSY=COMMA THEN PUTSYM(","); 40282000
|
|
END UNTIL CURSY!COMMA; 40283000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(89); SKIP(RPAR) END; 40284000
|
|
EXIT: PUTSYM(")"); 40285000
|
|
IF CURSY=RPAR THEN INSYMBOL; 40286000
|
|
END; 40287000
|
|
IF NPARS>0 AND NOT FORMALPROC THEN ERROR(3); 40288000
|
|
CURMODE:=NUMBER; 40289000
|
|
END OF PASSPARAMS; 40290000
|
|
40291000
|
|
40292000
|
|
PROCEDURE FACTOR; %*** FACTOR *** 40293000
|
|
BEGIN %************** 40294000
|
|
INTEGER STARTSYM,STYPE,T; 40295000
|
|
BOOLEAN FIRST; 40296000
|
|
REAL VAL; 40297000
|
|
40298000
|
|
DEFINE PARAMETER= %*** CHECK THAT THE FUNCTION HAS 1 PARAM. 40299000
|
|
BEGIN 40300000
|
|
INSYMBOL; 40301000
|
|
IF CURSY=LPAR THEN 40302000
|
|
BEGIN 40303000
|
|
PUTSYM("("); INSYMBOL; EXPRESSION; 40304000
|
|
IF TYPETAB1[CURTYPE].FORM=NUMERIC THEN CURTYPE:=INTTYPE; 40305000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(3); SKIP(RPAR) END; 40306000
|
|
PUTSYM(")"); IF CURSY=RPAR THEN INSYMBOL; 40307000
|
|
END ELSE ERROR(3); 40308000
|
|
END OF PARAMETER#; 40309000
|
|
40310000
|
|
CURMODE:=NUMBER; 40311000
|
|
IF CURSY=IDENTIFIER THEN 40312000
|
|
BEGIN 40313000
|
|
SEARCH; 40314000
|
|
IF FOUND THEN 40315000
|
|
BEGIN 40316000
|
|
IF THISID.IDCLASS=VAR OR 40317000
|
|
THISID.IDCLASS=CONST AND BOOLEAN(THISID.FORMAL) 40318000
|
|
THEN VARIABLE ELSE 40319000
|
|
IF THISID.IDCLASS=CONST THEN 40320000
|
|
BEGIN 40321000
|
|
IF THISID.INFO{1023 THEN PUTCONST(THISID.INFO) 40322000
|
|
ELSE PUTCONST(CONSTTAB[THISID.INFO-1023]);40323000
|
|
CURTYPE:=THISID.TYPE; CURMODE:=NUMBER; 40324000
|
|
INSYMBOL; 40325000
|
|
END ELSE 40326000
|
|
IF THISID.IDCLASS=FUNC THEN 40327000
|
|
BEGIN 40328000
|
|
IF THISTAB=0 THEN %*** INTRINSIC FUNCTION *** 40329000
|
|
BEGIN 40330000
|
|
INTEGER DUMMY; 40350000
|
|
IF CURNAME1="3000ABS" THEN % "ABS" 40351000
|
|
BEGIN 40352000
|
|
PUTTEXT(" ABS"); PARAMETER; 40353000
|
|
IF CURTYPE!REALTYPE AND CURTYPE!INTTYPE THEN ERROR(67); 40354000
|
|
END ELSE 40355000
|
|
IF CURNAME1="3000CHR" THEN % "CHR" 40356000
|
|
BEGIN 40357000
|
|
INSYMBOL; 40358000
|
|
IF CURSY=LPAR THEN 40359000
|
|
BEGIN INSYMBOL; CHECKEXPR(0,63); 40360000
|
|
IF TYPETAB1[CURTYPE].FORM!NUMERIC THEN ERROR(67); 40361000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 40362000
|
|
IF CURSY=RPAR THEN INSYMBOL; 40363000
|
|
END ELSE ERROR(58); 40364000
|
|
CURTYPE:=CHARTYPE; 40365000
|
|
END ELSE 40366000
|
|
IF CURNAME1="3000EOF" OR % "EOF"/"EOLN" 40367000
|
|
CURNAME1="400EOLN" THEN 40368000
|
|
BEGIN 40369000
|
|
FIRST:=CURNAME1="3000EOF"; 40370000
|
|
FILEPARAM(INPUTFILE); 40371000
|
|
PUTID("I",FILENAME,5); 40372000
|
|
PUTTEXT(IF FIRST THEN " .EOF" ELSE " .EOLN"); 40373000
|
|
IF LPARFOUND THEN 40374000
|
|
BEGIN 40375000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 40376000
|
|
IF CURSY=RPAR THEN INSYMBOL; 40377000
|
|
END; 40378000
|
|
CURTYPE:=BOOLTYPE; 40379000
|
|
END ELSE 40380000
|
|
IF CURNAME1="3000ODD" THEN % "ODD" 40381000
|
|
BEGIN 40382000
|
|
PUTTEXT(" ODD"); PARAMETER; 40383000
|
|
IF CURTYPE!INTTYPE THEN ERROR(67); 40384000
|
|
CURTYPE:=BOOLTYPE; CURMODE:=BITPATTERN; 40385000
|
|
END ELSE 40386000
|
|
IF CURNAME1="3000ORD" THEN % "ORD" 40387000
|
|
BEGIN 40388000
|
|
PUTSYM("("); INSYMBOL; 40389000
|
|
IF CURSY=LPAR THEN 40390000
|
|
BEGIN 40391000
|
|
INSYMBOL; EXPRESSION; 40392000
|
|
IF TYPETAB1[CURTYPE].FORM>CHAR THEN ERROR(67); 40393000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 40394000
|
|
INSYMBOL; 40395000
|
|
END ELSE ERROR(58); 40396000
|
|
CURTYPE:=INTTYPE; PUTSYM(")"); 40397000
|
|
END ELSE 40398000
|
|
IF CURNAME1="400PRED" OR % "PRED"/"SUCC" 40399000
|
|
CURNAME1="400SUCC" THEN 40400000
|
|
BEGIN 40401000
|
|
FIRST:=CURNAME1="400PRED"; 40402000
|
|
PUTTEXT("CHECK("); INSYMBOL; 40403000
|
|
IF CURSY=LPAR THEN 40404000
|
|
BEGIN 40405000
|
|
INSYMBOL; EXPRESSION; 40406000
|
|
PUTSYM(IF FIRST THEN "-" ELSE "+"); PUTSYM("1"); 40407000
|
|
IF TYPETAB1[CURTYPE].FORM>CHAR THEN ERROR(67); 40408000
|
|
PUTSYM(","); PUTCONST(TYPETAB2[CURTYPE]); 40409000
|
|
PUTSYM(","); PUTCONST(TYPETAB3[CURTYPE]); 40410000
|
|
PUTSYM(","); PUTCONST(CARDCNT); 40411000
|
|
PUTSYM(")"); 40412000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 40413000
|
|
IF CURSY=RPAR THEN INSYMBOL; 40414000
|
|
END ELSE BEGIN ERROR(58); CURTYPE:=0 END; 40415000
|
|
END ELSE 40416000
|
|
IF CURNAME1="50ROUND" THEN % "ROUND" 40417000
|
|
BEGIN 40418000
|
|
PUTTEXT(" ROUND"); PARAMETER; 40419000
|
|
IF CURTYPE!REALTYPE THEN ERROR(67); 40420000
|
|
NUMSYMS:=NUMSYMS-1; PUTSYM(","); 40421000
|
|
PUTCONST(CARDCNT); PUTSYM(")"); 40422000
|
|
CURTYPE:=INTTYPE; 40423000
|
|
END ELSE 40424000
|
|
IF CURNAME1="3000SQR" THEN % "SQR" 40425000
|
|
BEGIN 40426000
|
|
PUTTEXT(" SQR"); PARAMETER; 40427000
|
|
NUMSYMS:=NUMSYMS-1; PUTSYM(","); 40428000
|
|
PUTCONST(CARDCNT); PUTSYM(")"); 40429000
|
|
IF CURTYPE!REALTYPE AND CURTYPE!INTTYPE THEN ERROR(67); 40430000
|
|
END ELSE 40431000
|
|
IF CURNAME1="50TRUNC" THEN % "TRUNC" 40432000
|
|
BEGIN 40433000
|
|
PUTTEXT(" TRUNC"); PARAMETER; 40434000
|
|
NUMSYMS:=NUMSYMS-1; PUTSYM(","); 40435000
|
|
PUTCONST(CARDCNT); PUTSYM(")"); 40436000
|
|
IF CURTYPE!REALTYPE THEN ERROR(67); 40437000
|
|
CURTYPE:=INTTYPE; 40438000
|
|
END ELSE 40439000
|
|
IF CURNAME1="6CONCAT" THEN % "CONCAT" 40440000
|
|
CONCAT ELSE 40441000
|
|
IF CURNAME1="400TIME" THEN % "TIME" 40442000
|
|
BEGIN 40443000
|
|
PUTTEXT("(TIME("); PUTTEXT("1)/60)"); 40444000
|
|
CURTYPE:=REALTYPE; INSYMBOL 40445000
|
|
END ELSE 40446000
|
|
IF CURNAME1="400DATE" THEN % "DATE" 40447000
|
|
BEGIN 40448000
|
|
PUTTEXT("CURDAT"); 40449000
|
|
CURTYPE:=ALFATYPE; INSYMBOL; 40450000
|
|
END ELSE 40451000
|
|
IF CURNAME1="7ELAPSE" AND CURNAME2="D" THEN % "ELAPSED" 40452000
|
|
BEGIN 40453000
|
|
PUTTEXT("(TIME("); PUTTEXT("2)/60)"); 40454000
|
|
CURTYPE:=REALTYPE; INSYMBOL; 40455000
|
|
END ELSE 40456000
|
|
IF CURNAME1="6IOTIME" THEN % "IOTIME" 40457000
|
|
BEGIN 40458000
|
|
PUTTEXT("(TIME("); PUTTEXT("3)/60)"); 40459000
|
|
CURTYPE:=REALTYPE; INSYMBOL; 40460000
|
|
END ELSE 40461000
|
|
IF CURNAME1="7WEEKDA" AND CURNAME2="Y" THEN % "WEEKDAY" 40462000
|
|
BEGIN 40463000
|
|
PUTTEXT("WEEKDA"); 40464000
|
|
CURTYPE:=ALFATYPE; INSYMBOL; 40465000
|
|
END ELSE IF CURNAME1="400USER" THEN % "USER" 40466000
|
|
BEGIN 40467000
|
|
PUTTEXT(" TIME"); PUTTEXT(" (-1)"); 40468000
|
|
CURTYPE:=ALFATYPE; INSYMBOL; 40469000
|
|
END ELSE % "SIN","COS" ETC.40470000
|
|
BEGIN 40471000
|
|
PUTTEXT(IF CURNAME1="3000SIN" THEN " SIN" ELSE 40472000
|
|
IF CURNAME1="3000COS" THEN " COS" ELSE 40473000
|
|
IF CURNAME1="6ARCTAN" THEN "ARCTAN" ELSE 40474000
|
|
IF CURNAME1="400SQRT" THEN " SQRT" ELSE 40475000
|
|
IF CURNAME1="3000EXP" THEN " EXP" ELSE 40476000
|
|
" LN"); 40477000
|
|
PARAMETER; 40478000
|
|
IF CURTYPE!REALTYPE AND CURTYPE!INTTYPE THEN ERROR(67); 40479000
|
|
CURTYPE:=REALTYPE; 40480000
|
|
END; 40481000
|
|
END OF INTRINSIC FUNCTIONS ELSE 40482000
|
|
BEGIN 40483000
|
|
T:=THISID.TYPE; 40484000
|
|
PASSPARAMS; 40485000
|
|
CURTYPE:=T; 40486000
|
|
END; 40487000
|
|
END OF FUNCTIONS ELSE 40488000
|
|
IF THISID.IDCLASS=PROC THEN 40489000
|
|
BEGIN 40490000
|
|
ERROR(68); PASSPARAMS; 40491000
|
|
CURTYPE:=0; 40492000
|
|
END ELSE BEGIN ERROR(69); CURTYPE:=0; INSYMBOL END; 40493000
|
|
END ELSE BEGIN ERROR(1); CURTYPE:=0; INSYMBOL END; 40494000
|
|
END OF IDENTIFIER ELSE 40495000
|
|
IF CURSY{CHARCONST THEN 40496000
|
|
BEGIN 40497000
|
|
CONSTANT(VAL,CURTYPE); PUTCONST(VAL); 40498000
|
|
END ELSE 40499000
|
|
IF CURSY=NOTSY THEN 40500000
|
|
BEGIN 40501000
|
|
PUTTEXT(" NOT "); PUTDUMMY; STARTSYM:=NUMSYMS; 40502000
|
|
INSYMBOL; FACTOR; 40503000
|
|
IF CURTYPE>0 THEN 40504000
|
|
IF CURTYPE!BOOLTYPE THEN BEGIN ERROR(17); CURTYPE:=0 END; 40505000
|
|
IF CURMODE=NUMBER THEN 40506000
|
|
BEGIN SYMTAB[STARTSYM]:=" B("; PUTSYM(")"); 40507000
|
|
CURMODE:=BITPATTERN; 40508000
|
|
END; 40509000
|
|
END ELSE 40510000
|
|
IF CURSY=NILSY THEN 40511000
|
|
BEGIN 40512000
|
|
PUTCONST(0); CURTYPE:=NILTYPE; 40513000
|
|
INSYMBOL; 40514000
|
|
END ELSE 40515000
|
|
IF CURSY=LPAR THEN 40516000
|
|
BEGIN 40517000
|
|
PUTSYM("("); 40518000
|
|
INSYMBOL; EXPRESSION; 40519000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 40520000
|
|
PUTSYM(")"); 40521000
|
|
INSYMBOL; 40522000
|
|
END ELSE 40523000
|
|
IF CURSY=LBRACKET THEN %*** SET CONSTANT *** 40524000
|
|
BEGIN 40525000
|
|
INSYMBOL; 40526000
|
|
IF CURSY=RBRACKET THEN 40527000
|
|
BEGIN 40528000
|
|
PUTCONST(0); CURTYPE:=EMPTYSET; CURMODE:=NUMBER; 40529000
|
|
INSYMBOL; 40530000
|
|
END ELSE 40531000
|
|
BEGIN 40532000
|
|
FIRST:=TRUE; 40533000
|
|
DO BEGIN 40534000
|
|
IF FIRST THEN FIRST:=FALSE ELSE INSYMBOL; 40535000
|
|
PUTTEXT(" BIT("); STARTSYM:=NUMSYMS; 40536000
|
|
EXPRESSION; 40537000
|
|
IF STYPE=0 THEN 40538000
|
|
BEGIN STYPE:=CURTYPE; 40539000
|
|
IF TYPETAB1[CURTYPE].FORM>CHAR THEN ERROR(72); 40540000
|
|
END ELSE CHECKTYPES(STYPE,CURTYPE); 40541000
|
|
IF CURSY=DOUBLEDOT THEN 40542000
|
|
BEGIN 40543000
|
|
PUTSYM(","); SYMTAB[STARTSYM]:=" BITS("; 40544000
|
|
INSYMBOL; EXPRESSION; 40545000
|
|
IF STYPE=0 THEN 40546000
|
|
BEGIN STYPE:=CURTYPE; 40547000
|
|
IF TYPETAB1[CURTYPE].FORM>CHAR THEN ERROR(72); 40548000
|
|
END ELSE CHECKTYPES(STYPE,CURTYPE); 40549000
|
|
END; 40550000
|
|
PUTSYM(","); PUTCONST(CARDCNT); PUTSYM(")"); 40551000
|
|
IF CURSY=COMMA THEN PUTTEXT(" OR"); 40552000
|
|
END UNTIL CURSY!COMMA; 40553000
|
|
IF CURSY!RBRACKET THEN 40554000
|
|
BEGIN ERROR(59); SKIP(RBRACKET); 40555000
|
|
IF CURSY=RBRACKET THEN INSYMBOL; 40556000
|
|
END ELSE INSYMBOL; 40557000
|
|
NEWTYPE; T1:=SET; T1.SIZE:=1; T1.STRUCT:=0; 40558000
|
|
T1.SETTYPE:=STYPE; TYPETAB1[TYPEINDEX]:=T1; 40559000
|
|
CURTYPE:=TYPEINDEX; 40560000
|
|
CURMODE:=BITPATTERN; 40561000
|
|
END; 40562000
|
|
END OF SET CONSTANT ELSE BEGIN ERROR(99); INSYMBOL END; 40563000
|
|
END OF FACTOR; 40564000
|
|
40565000
|
|
40566000
|
|
PROCEDURE TERM; %*** TERM *** 40567000
|
|
BEGIN %************ 40568000
|
|
INTEGER STARTSYM,MODE,TYPE1,MULOPTR,F; 40569000
|
|
PUTDUMMY; STARTSYM:=NUMSYMS; 40570000
|
|
FACTOR; 40571000
|
|
MODE:=CURMODE; 40572000
|
|
WHILE CURSY}ASTERISK AND CURSY{MODSY DO % "*","/","DIV","MOD","AND"40573000
|
|
BEGIN 40574000
|
|
TYPE1:=CURTYPE; MULOPTR:=CURSY; 40575000
|
|
F:=TYPETAB1[TYPE1].FORM; 40576000
|
|
IF F=NUMERIC OR F=FLOATING THEN 40577000
|
|
BEGIN 40578000
|
|
MODE:=NUMBER; 40579000
|
|
IF CURSY=ASTERISK THEN PUTSYM("|") ELSE 40580000
|
|
IF CURSY=SLASH THEN PUTSYM("/") ELSE 40581000
|
|
IF CURSY=ANDSY THEN ERROR(64) ELSE 40582000
|
|
BEGIN 40583000
|
|
IF F=FLOATING THEN ERROR(64); 40584000
|
|
IF CURSY=DIVSY THEN PUTTEXT(" DIV") ELSE PUTTEXT(" MOD"); 40585000
|
|
END END ELSE 40586000
|
|
IF CURTYPE=BOOLTYPE OR F=SET THEN 40587000
|
|
BEGIN 40588000
|
|
MODE:=BITPATTERN; 40589000
|
|
IF CURMODE!MODE THEN 40590000
|
|
BEGIN SYMTAB[STARTSYM]:=" B("; PUTSYM(")") END; 40591000
|
|
PUTTEXT(" AND "); 40592000
|
|
IF CURSY!(IF F=SET THEN ASTERISK ELSE ANDSY) THEN ERROR(64); 40593000
|
|
END ELSE ERROR(64); 40594000
|
|
PUTDUMMY; STARTSYM:=NUMSYMS; 40595000
|
|
INSYMBOL; FACTOR; 40596000
|
|
IF CURTYPE>0 AND TYPE1>0 THEN 40597000
|
|
BEGIN 40598000
|
|
IF CURTYPE!TYPE1 THEN 40599000
|
|
BEGIN 40600000
|
|
IF TYPETAB1[TYPE1].FORM!NUMERIC OR CURTYPE!REALTYPE THEN 40601000
|
|
CHECKTYPES(TYPE1,CURTYPE); 40602000
|
|
IF TYPE1=REALTYPE THEN CURTYPE:=REALTYPE; 40603000
|
|
END; 40604000
|
|
IF CURTYPE=REALTYPE AND MULOPTR}DIVSY THEN ERROR(65); 40605000
|
|
END; 40606000
|
|
IF MULOPTR=SLASH THEN CURTYPE:=REALTYPE; 40607000
|
|
IF CURTYPE=0 THEN CURTYPE:=TYPE1; 40608000
|
|
END OF WHILE LOOP; 40609000
|
|
IF MODE=BITPATTERN AND CURMODE!MODE THEN 40610000
|
|
BEGIN SYMTAB[STARTSYM]:=" B("; PUTSYM(")") END; 40611000
|
|
CURMODE:=MODE; 40612000
|
|
END OF TERM; 40613000
|
|
40614000
|
|
40615000
|
|
PROCEDURE SIMPLEEXPRESSION; %*** SIMPLE EXPRESSION *** 40616000
|
|
BEGIN %************************* 40617000
|
|
INTEGER STARTSYM,MODE,TYPE1,F; 40618000
|
|
BOOLEAN SIGNED; 40619000
|
|
40620000
|
|
PUTDUMMY; STARTSYM:=NUMSYMS; 40621000
|
|
IF CURSY=PLUS OR CURSY=MINUS THEN 40622000
|
|
BEGIN SIGNED:=TRUE; 40623000
|
|
PUTSYM(IF CURSY=PLUS THEN"+" ELSE "-"); 40624000
|
|
INSYMBOL; 40625000
|
|
END; 40626000
|
|
TERM; 40627000
|
|
MODE:=CURMODE; 40628000
|
|
IF SIGNED THEN 40629000
|
|
BEGIN F:=TYPETAB1[CURTYPE].FORM; 40630000
|
|
IF F!NUMERIC AND F!FLOATING THEN ERROR(29); 40631000
|
|
END; 40632000
|
|
WHILE CURSY}PLUS AND CURSY{ORSY DO % "+","-","OR" 40633000
|
|
BEGIN 40634000
|
|
TYPE1:=CURTYPE; F:=TYPETAB1[TYPE1].FORM; 40635000
|
|
IF F=NUMERIC OR F=FLOATING THEN 40636000
|
|
BEGIN MODE:=NUMBER; 40637000
|
|
IF CURSY=PLUS THEN PUTSYM("+") ELSE 40638000
|
|
IF CURSY=MINUS THEN PUTSYM("-") ELSE ERROR(64); 40639000
|
|
END ELSE 40640000
|
|
IF CURTYPE=BOOLTYPE THEN 40641000
|
|
BEGIN 40642000
|
|
MODE:=BITPATTERN; 40643000
|
|
IF CURMODE!MODE THEN 40644000
|
|
BEGIN SYMTAB[STARTSYM]:=" B("; PUTSYM(")") END; 40645000
|
|
IF CURSY=ORSY THEN PUTTEXT(" OR") ELSE ERROR(64); 40646000
|
|
END ELSE 40647000
|
|
IF F=SET THEN 40648000
|
|
BEGIN 40649000
|
|
MODE:=BITPATTERN; 40650000
|
|
IF CURMODE!MODE THEN 40651000
|
|
BEGIN SYMTAB[STARTSYM]:=" B("; PUTSYM(")"); END; 40652000
|
|
IF CURSY=PLUS THEN PUTTEXT(" OR") ELSE 40653000
|
|
IF CURSY=MINUS THEN BEGIN PUTTEXT(" AND");PUTTEXT(" NOT ")END40654000
|
|
ELSE ERROR(64); 40655000
|
|
END ELSE ERROR(64); 40656000
|
|
INSYMBOL; 40657000
|
|
PUTDUMMY; STARTSYM:=NUMSYMS; 40658000
|
|
TERM; 40659000
|
|
IF CURTYPE>0 AND TYPE1>0 THEN 40660000
|
|
BEGIN 40661000
|
|
IF CURTYPE!TYPE1 THEN 40662000
|
|
BEGIN 40663000
|
|
IF TYPETAB1[TYPE1].FORM!NUMERIC OR CURTYPE!REALTYPE THEN 40664000
|
|
CHECKTYPES(TYPE1,CURTYPE); 40665000
|
|
IF TYPE1=REALTYPE THEN CURTYPE:=REALTYPE; 40666000
|
|
END END; 40667000
|
|
IF CURTYPE=0 THEN CURTYPE:=TYPE1; 40668000
|
|
END OF WHILE LOOP; 40669000
|
|
IF MODE=BITPATTERN AND CURMODE!BITPATTERN THEN 40670000
|
|
BEGIN SYMTAB[STARTSYM]:=" B("; PUTSYM(")") END; 40671000
|
|
CURMODE:=MODE; 40672000
|
|
END OF SIMPLEEXPRESSION; 40673000
|
|
40674000
|
|
40675000
|
|
PROCEDURE EXPRESSION; %*** EXPRESSION *** 40676000
|
|
BEGIN %****************** 40677000
|
|
INTEGER STARTSYM,FIRSTSYM,TYPE1,RELOPTR,F; 40678000
|
|
BOOLEAN CALLGEN; 40679000
|
|
40680000
|
|
EXPRLEVEL:=EXPRLEVEL+1; 40681000
|
|
IF EXPRLEVEL = 1 THEN 40682000
|
|
BEGIN 40683000
|
|
PUTDUMMY; 40684000
|
|
FIRSTSYM := NUMSYMS; 40685000
|
|
END; 40686000
|
|
PUTDUMMY; STARTSYM:=NUMSYMS; 40687000
|
|
PUTDUMMY; 40688000
|
|
SIMPLEEXPRESSION; 40689000
|
|
IF CURSY}LSSSY AND CURSY{INSY THEN % "<","{","}",">","=","!","IN"40690000
|
|
BEGIN 40691000
|
|
TYPE1:=CURTYPE; F:=TYPETAB1[TYPE1].FORM; 40692000
|
|
RELOPTR:=CURSY; 40693000
|
|
IF F{ALFA THEN 40694000
|
|
BEGIN 40695000
|
|
IF CURMODE=BITPATTERN THEN 40696000
|
|
BEGIN SYMTAB[STARTSYM]:=" REAL("; PUTSYM(")") END; 40697000
|
|
IF CURSY=LSSSY THEN PUTSYM("<") ELSE 40698000
|
|
IF CURSY=LEQSY THEN PUTSYM("{") ELSE 40699000
|
|
IF CURSY=GEQSY THEN PUTSYM("}") ELSE 40700000
|
|
IF CURSY=GTRSY THEN PUTSYM(">") ELSE 40701000
|
|
IF CURSY=EQLSY THEN PUTSYM("=") ELSE 40702000
|
|
IF CURSY=NEQSY THEN PUTSYM("!") ELSE 40703000
|
|
BEGIN 40704000
|
|
IF F}FLOATING THEN ERROR(64); 40705000
|
|
SYMTAB[STARTSYM]:="INTST("; PUTSYM(","); CALLGEN:=TRUE; 40706000
|
|
END; 40707000
|
|
END ELSE 40708000
|
|
IF F=SET THEN 40709000
|
|
BEGIN 40710000
|
|
IF CURMODE=BITPATTERN THEN 40711000
|
|
BEGIN SYMTAB[STARTSYM+1]:=" REAL("; PUTSYM(")") END; 40712000
|
|
IF CURSY=EQLSY OR CURSY=NEQSY THEN 40713000
|
|
BEGIN PUTSYM(IF CURSY=EQLSY THEN "=" ELSE "!"); 40714000
|
|
END ELSE 40715000
|
|
BEGIN 40716000
|
|
IF CURSY=LEQSY THEN SYMTAB[STARTSYM]:="INCL1(" ELSE 40717000
|
|
IF CURSY=GEQSY THEN SYMTAB[STARTSYM]:="INCL2(" ELSE ERROR(64);40718000
|
|
PUTSYM(","); CALLGEN:=TRUE; 40719000
|
|
END END ELSE 40720000
|
|
IF F=POINTERS THEN 40721000
|
|
BEGIN 40722000
|
|
IF CURSY=EQLSY THEN PUTSYM("=") ELSE 40723000
|
|
IF CURSY=NEQSY THEN PUTSYM("!") ELSE ERROR(64); 40724000
|
|
END ELSE ERROR(64); 40725000
|
|
INSYMBOL; 40726000
|
|
PUTDUMMY; STARTSYM:=NUMSYMS; 40727000
|
|
SIMPLEEXPRESSION; 40728000
|
|
IF CURTYPE>0 AND TYPE1>0 THEN 40729000
|
|
IF CURTYPE!TYPE1 THEN 40730000
|
|
IF RELOPTR!INSY THEN 40731000
|
|
BEGIN 40732000
|
|
IF TYPETAB1[TYPE1].FORM!NUMERIC OR CURTYPE!REALTYPE THEN 40733000
|
|
CHECKTYPES(TYPE1,CURTYPE); 40734000
|
|
END ELSE 40735000
|
|
IF TYPETAB1[CURTYPE].FORM!SET THEN ERROR(66) 40736000
|
|
ELSE CHECKTYPES(TYPE1,TYPETAB1[CURTYPE].SETTYPE); 40737000
|
|
IF CURMODE=BITPATTERN THEN 40738000
|
|
BEGIN SYMTAB[STARTSYM]:=" REAL("; PUTSYM(")") END; 40739000
|
|
IF CALLGEN THEN PUTSYM(")"); 40740000
|
|
CURTYPE:=BOOLTYPE; CURMODE:=BITPATTERN; 40741000
|
|
END; 40742000
|
|
EXPRLEVEL:=EXPRLEVEL-1; 40743000
|
|
IF EXPRLEVEL=0 THEN 40744000
|
|
BEGIN 40745000
|
|
IF CURMODE=BITPATTERN THEN 40746000
|
|
BEGIN 40747000
|
|
SYMTAB[FIRSTSYM] := " REAL("; 40748000
|
|
PUTSYM(")"); 40749000
|
|
END; 40750000
|
|
WRITEEXPR; 40751000
|
|
END; 40752000
|
|
END OF EXPRESSION; 40753000
|
|
40754000
|
|
40755000
|
|
DEFINE BOOLEXPR= 40756000
|
|
BEGIN 40757000
|
|
PUTDUMMY; EXPRLEVEL:=1; EXPRESSION; 40758000
|
|
IF CURTYPE>0 THEN IF CURTYPE!BOOLTYPE THEN ERROR(17); 40759000
|
|
IF CURMODE!BITPATTERN THEN 40760000
|
|
BEGIN SYMTAB[1]:=" B("; PUTSYM(")") END; 40761000
|
|
EXPRLEVEL:=0; WRITEEXPR; 40762000
|
|
END OF BOOLEAN#; 40763000
|
|
$ PAGE 50000000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%50001000
|
|
% %50002000
|
|
% %50003000
|
|
% %50004000
|
|
% PART 5: INTRINSIC ROUTINES. %50005000
|
|
% ------------------- %50006000
|
|
% %50007000
|
|
% %50008000
|
|
% %50009000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%50010000
|
|
50011000
|
|
50012000
|
|
PROCEDURE CONCAT; %*** "CONCAT" *** 50013000
|
|
BEGIN %**************** 50014000
|
|
DEFINE INTEXPR= 50015000
|
|
BEGIN INSYMBOL; EXPRESSION; 50016000
|
|
IF CURTYPE>0 THEN 50017000
|
|
IF TYPETAB1[CURTYPE].FORM!NUMERIC THEN ERROR(17); 50018000
|
|
END #; 50019000
|
|
50020000
|
|
PUTTEXT("CONCAT"); PUTSYM("("); 50021000
|
|
INSYMBOL; 50022000
|
|
IF CURSY=LPAR THEN 50023000
|
|
BEGIN 50024000
|
|
INSYMBOL; EXPRESSION; 50025000
|
|
IF CURTYPE>0 THEN 50026000
|
|
IF TYPETAB1[CURTYPE].FORM>ALFA THEN ERROR(17); 50027000
|
|
IF CURSY=COMMA THEN 50028000
|
|
BEGIN 50029000
|
|
PUTSYM(","); INSYMBOL; EXPRESSION; 50030000
|
|
IF CURTYPE>0 THEN 50031000
|
|
IF TYPETAB1[CURTYPE].FORM>ALFA THEN ERROR(17); 50032000
|
|
IF CURSY=COMMA THEN 50033000
|
|
BEGIN 50034000
|
|
PUTSYM(","); INTEXPR; 50035000
|
|
IF CURSY=COMMA THEN 50036000
|
|
BEGIN 50037000
|
|
PUTSYM(","); INTEXPR; 50038000
|
|
IF CURSY=COMMA THEN 50039000
|
|
BEGIN 50040000
|
|
PUTSYM(","); INTEXPR; 50041000
|
|
PUTSYM(","); PUTCONST(CARDCNT); 50042000
|
|
PUTSYM(")"); 50043000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(3); SKIP(RPAR) END; 50044000
|
|
END ELSE BEGIN ERROR(3); SKIP(RPAR) END; 50045000
|
|
END ELSE BEGIN ERROR(3); SKIP(RPAR) END; 50046000
|
|
END ELSE BEGIN ERROR(3); SKIP(RPAR) END; 50047000
|
|
END ELSE BEGIN ERROR(3); SKIP(RPAR) END; 50048000
|
|
END ELSE BEGIN ERROR(3); SKIP(RPAR) END; 50049000
|
|
CURTYPE:=REALTYPE; 50050000
|
|
IF CURSY=RPAR THEN INSYMBOL; 50051000
|
|
END OF CONCAT; 50052000
|
|
50053000
|
|
50054000
|
|
PROCEDURE PREAD(CHANGELINE); 50055000
|
|
VALUE CHANGELINE; BOOLEAN CHANGELINE; 50056000
|
|
BEGIN 50057000
|
|
INTEGER FILEID,F; 50058000
|
|
BOOLEAN CHECK; 50059000
|
|
GEN(" BEGIN",7,2); 50060000
|
|
FILEPARAM(INPUTFILE); FILEID:=FILENAME; 50061000
|
|
IF TYPETAB1[CURTYPE].FORM=FILES THEN ERROR(85); 50062000
|
|
IF SYMKIND[CURSY]!TERMINAL THEN 50063000
|
|
BEGIN 50064000
|
|
IF CURSY NEQ RPAR THEN 50065000
|
|
DO BEGIN 50066000
|
|
WHILE CURSY=COMMA DO INSYMBOL; 50067000
|
|
IF CURSY=IDENTIFIER THEN 50068000
|
|
BEGIN 50069000
|
|
SEARCH; 50070000
|
|
IF FOUND THEN 50071000
|
|
BEGIN 50072000
|
|
IF THISID.IDCLASS=VAR OR 50073000
|
|
THISID.IDCLASS=CONST AND BOOLEAN(THISID.FORMAL) THEN 50074000
|
|
BEGIN 50075000
|
|
VARIABLE; F:=TYPETAB1[CURTYPE].FORM; 50076000
|
|
IF F=NUMERIC OR F=FLOATING OR F=CHAR THEN 50077000
|
|
BEGIN 50078000
|
|
CHECK:=CHECKOPTION AND F!FLOATING; 50079000
|
|
WRITEEXPR; GEN(":=",2,6); 50080000
|
|
IF CHECK THEN GEN("CHECK(",6,2); 50081000
|
|
GEN("PREAD(",6,2); GENID("F",FILEID,5); GEN(",",1,7); 50082000
|
|
GENID("V",FILEID,5); GEN(",",1,7); 50083000
|
|
GENID("I",FILEID,5); GEN(",",1,7); 50084000
|
|
IF F=NUMERIC THEN GENINT(2) ELSE 50085000
|
|
IF F=FLOATING THEN GENINT(3) ELSE GENINT(1); 50086000
|
|
GEN(",",1,7); GENINT(CARDCNT); GEN(")",1,7); 50087000
|
|
IF CHECK THEN 50088000
|
|
BEGIN 50089000
|
|
GEN(",",1,7); GENINT(TYPETAB2[CURTYPE]); GEN(",",1,7); 50090000
|
|
GENINT(TYPETAB3[CURTYPE]); GEN(",",1,7); 50091000
|
|
GENINT(CARDCNT); GEN(")",1,7); 50092000
|
|
END; 50093000
|
|
END ELSE BEGIN ERROR(82); INSYMBOL END; 50094000
|
|
END ELSE BEGIN ERROR(8); INSYMBOL END; 50095000
|
|
END ELSE BEGIN ERROR(1); INSYMBOL END; 50096000
|
|
END ELSE ERROR(9); 50097000
|
|
GEN(";",1,7); 50098000
|
|
END UNTIL CURSY!COMMA; 50099000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 50100000
|
|
IF CURSY=RPAR THEN INSYMBOL; 50101000
|
|
END; 50102000
|
|
IF CHANGELINE THEN 50103000
|
|
BEGIN 50104000
|
|
GEN("RLINE(",6,2); GENID("F",FILEID,5); GEN(",",1,7); 50105000
|
|
GENID("V",FILEID,5); GEN(",",1,7); 50106000
|
|
GENID("I",FILEID,5); GEN(")",1,7); 50107000
|
|
END; 50108000
|
|
GEN("END",4,5); 50109000
|
|
END OF PREAD; 50110000
|
|
50111000
|
|
50112000
|
|
PROCEDURE PWRITE(LINEFEED); 50113000
|
|
VALUE LINEFEED; BOOLEAN LINEFEED; 50114000
|
|
BEGIN 50115000
|
|
INTEGER FILEID,F,I,LASTSY; 50116000
|
|
POINTER P; 50117000
|
|
GEN(" BEGIN",7,2); 50118000
|
|
FILEPARAM(OUTPUTFILE); FILEID:=FILENAME; 50119000
|
|
IF TYPETAB1[CURTYPE].FORM=FILES THEN ERROR(85); 50120000
|
|
IF SYMKIND[CURSY]!TERMINAL THEN 50121000
|
|
BEGIN 50122000
|
|
IF CURSY NEQ RPAR THEN 50123000
|
|
DO BEGIN 50124000
|
|
WHILE CURSY=COMMA DO INSYMBOL; 50125000
|
|
IF CURSY=ALFACONST AND CURLENGTH>7 THEN 50126000
|
|
BEGIN 50127000
|
|
GEN("WALFA(",6,2); GENID("F",FILEID,5); GEN(",",1,7); 50128000
|
|
GENID("V",FILEID,5); GEN(",",1,7); 50129000
|
|
GENID("I",FILEID,5); GEN(",",1,7); 50130000
|
|
P:=STRINGPNT; 50131000
|
|
FOR I:=1 STEP 7 UNTIL 80 DO 50132000
|
|
IF I{CURLENGTH THEN 50133000
|
|
BEGIN 50134000
|
|
IF ALGOLCNT<10 THEN WRITEALGOL; 50135000
|
|
REPLACE ALGOLPNT:ALGOLPNT BY """, P:P FOR 7, """, ","; 50136000
|
|
ALGOLCNT:=ALGOLCNT-10; 50137000
|
|
END ELSE GEN("0,",2,6); 50138000
|
|
GENINT(CURLENGTH); GEN(",",1,7); 50139000
|
|
GENINT(CARDCNT); GEN(")",1,7); 50140000
|
|
INSYMBOL; 50141000
|
|
END OF ALFACONST ELSE 50142000
|
|
BEGIN 50143000
|
|
GEN("PWRITE(",7,1); GENID("F",FILEID,5); GEN(",",1,7); 50144000
|
|
GENID("V",FILEID,5); GEN(",",1,7); 50145000
|
|
GENID("I",FILEID,5); GEN(",",1,7); 50146000
|
|
LASTSY:=CURSY; 50147000
|
|
EXPRESSION; F:=TYPETAB1[CURTYPE].FORM; 50148000
|
|
GEN(",",1,7); 50149000
|
|
IF F=NUMERIC OR F=FLOATING OR F=CHAR OR F=ALFA OR 50150000
|
|
CURTYPE=BOOLTYPE THEN 50151000
|
|
BEGIN 50152000
|
|
IF F=NUMERIC THEN GENINT(1) ELSE 50153000
|
|
IF F=FLOATING THEN GENINT(2) ELSE 50154000
|
|
IF F=ALFA THEN GENINT(5) ELSE 50155000
|
|
IF F=CHAR THEN GENINT(4) ELSE GENINT(3); 50156000
|
|
GEN(",",1,7); 50157000
|
|
IF CURSY=COLON THEN 50158000
|
|
BEGIN 50159000
|
|
INSYMBOL; EXPRESSION; 50160000
|
|
IF TYPETAB1[CURTYPE].FORM NEQ NUMERIC THEN ERROR(17); 50161000
|
|
GEN(",",1,7); 50162000
|
|
IF CURSY=COLON THEN 50163000
|
|
BEGIN 50164000
|
|
IF F!FLOATING THEN ERROR(4); 50165000
|
|
INSYMBOL; EXPRESSION; 50166000
|
|
IF TYPETAB1[CURTYPE].FORM NEQ NUMERIC THEN ERROR(17); 50167000
|
|
GEN(",",1,7); 50168000
|
|
END ELSE GEN("-1,",3,5); 50169000
|
|
END ELSE 50170000
|
|
BEGIN 50171000
|
|
IF F=FLOATING THEN GENINT(16) ELSE 50172000
|
|
IF F=ALFA AND LASTSY=ALFACONST THEN GENINT(CURLENGTH) ELSE50173000
|
|
IF F=ALFA THEN GENINT(7) ELSE 50174000
|
|
IF F=CHAR THEN GENINT(1) ELSE GENINT(10); 50175000
|
|
GEN(",-1,",4,4); 50176000
|
|
END; 50177000
|
|
END ELSE ERROR(17); 50178000
|
|
GENINT(CARDCNT); GEN(")",1,7); 50179000
|
|
END OF EXPRESSION; 50180000
|
|
GEN(";",1,7); 50181000
|
|
END UNTIL CURSY!COMMA; 50182000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 50183000
|
|
IF CURSY=RPAR THEN INSYMBOL; 50184000
|
|
END; 50185000
|
|
FILENAME:=FILEID; 50186000
|
|
IF LINEFEED THEN 50187000
|
|
BEGIN 50188000
|
|
INTEGER DUMMY; 50189000
|
|
GEN("WLINE(",6,2); GENID("F",FILENAME,5); GEN(",",1,7); 50190000
|
|
GENID("V",FILENAME,5); GEN(",",1,7); 50191000
|
|
GENID("I",FILENAME,5); GEN(")",1,7); 50192000
|
|
END; 50193000
|
|
GEN("END",4,5); 50194000
|
|
END OF PWRITE; 50195000
|
|
50196000
|
|
50197000
|
|
PROCEDURE FILEHANDLING(PROCNUM); %*** FILE HANDLING PROCEDURES: 50198000
|
|
VALUE PROCNUM; INTEGER PROCNUM; %*** 50199000
|
|
BEGIN %*** 1) PUT 50200000
|
|
INTEGER F; %*** 2) GET 50201000
|
|
CASE PROCNUM OF %*** 3) RESET 50202000
|
|
BEGIN ; %*** 4) REWRITE 50203000
|
|
GEN("PUT",3,5); %*** 5) PAGE 50204000
|
|
GEN("GET",3,5); % 50205000
|
|
GEN("RESET",5,3); % 50206000
|
|
GEN("REWRITE",7,1); % 50207000
|
|
GEN("PAGE",4,4); % 50208000
|
|
END; % 50209000
|
|
GEN("(",1,7); FILEPARAM(0); % 50210000
|
|
IF FILENAME=0 THEN ERROR(78); % 50211000
|
|
F:=TYPETAB1[CURTYPE].FORM; 50212000
|
|
IF F=FILES AND PROCNUM=5 THEN ERROR(80); 50213000
|
|
GENID("F",FILENAME,5); GEN(",",1,7); 50214000
|
|
GENID("V",FILENAME,5); GEN(",",1,7); 50215000
|
|
GENID("I",FILENAME,5); GEN(",",1,7); 50216000
|
|
GENINT(CARDCNT); GEN(")",1,7); 50217000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 50218000
|
|
IF CURSY=RPAR THEN INSYMBOL; 50219000
|
|
END OF FILEHANDLING; 50220000
|
|
50221000
|
|
50222000
|
|
PROCEDURE PACK; 50223000
|
|
BEGIN 50224000
|
|
INTEGER IT,T; 50225000
|
|
GEN("PACK(",5,3); 50226000
|
|
INSYMBOL; 50227000
|
|
IF CURSY=LPAR THEN 50228000
|
|
BEGIN 50229000
|
|
INSYMBOL; 50230000
|
|
IF CURSY=IDENTIFIER THEN 50231000
|
|
BEGIN 50232000
|
|
SEARCH; 50233000
|
|
IF FOUND THEN 50234000
|
|
BEGIN 50235000
|
|
IF THISID.IDCLASS=VAR THEN 50236000
|
|
BEGIN 50237000
|
|
T:=TYPETAB1[THISID.TYPE]; 50238000
|
|
IF T.FORM=ARRAYS THEN 50239000
|
|
BEGIN 50240000
|
|
IT:=T.INXTYPE; 50241000
|
|
IF TYPETAB1[T.ARRTYPE].FORM!CHAR THEN ERROR(88); 50242000
|
|
GENID("V",1000|THISLEVEL+THISINDEX,5); 50243000
|
|
IF THISLEVEL>1 AND THISLEVEL!CURLEVEL THEN ERROR(5); 50244000
|
|
GEN(",",1,7); GENINT(TYPETAB2[THISID.TYPE]); 50245000
|
|
GEN(",",1,7); GENINT(TYPETAB3[THISID.TYPE]); 50246000
|
|
END ELSE ERROR(88); 50247000
|
|
END ELSE ERROR(88); 50248000
|
|
END ELSE ERROR(1); 50249000
|
|
END ELSE ERROR(9); 50250000
|
|
INSYMBOL; 50251000
|
|
IF CURSY=COMMA THEN 50252000
|
|
BEGIN 50253000
|
|
GEN(",",1,7); 50254000
|
|
INSYMBOL; EXPRESSION; CHECKTYPES(IT,CURTYPE); 50255000
|
|
IF CURSY=COMMA THEN 50256000
|
|
BEGIN 50257000
|
|
GEN(",",1,7); 50258000
|
|
INSYMBOL; 50259000
|
|
IF CURSY=IDENTIFIER THEN 50260000
|
|
BEGIN 50261000
|
|
SEARCH; 50262000
|
|
IF FOUND THEN 50263000
|
|
BEGIN 50264000
|
|
IF THISID.IDCLASS=VAR OR 50265000
|
|
THISID.IDCLASS=CONST AND BOOLEAN(THISID.FORMAL) THEN 50266000
|
|
BEGIN 50267000
|
|
VARIABLE; WRITEEXPR; 50268000
|
|
IF CURTYPE>0 THEN 50269000
|
|
IF TYPETAB1[CURTYPE].FORM!ALFA THEN ERROR(12); 50270000
|
|
END ELSE ERROR(8); 50271000
|
|
END ELSE ERROR(1); 50272000
|
|
END ELSE ERROR(9); 50273000
|
|
END ELSE BEGIN ERROR(89); SKIP(RPAR) END; 50274000
|
|
END ELSE BEGIN ERROR(89); SKIP(RPAR) END; 50275000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 50276000
|
|
IF CURSY=RPAR THEN INSYMBOL; 50277000
|
|
END ELSE BEGIN ERROR(3); INSYMBOL END; 50278000
|
|
GEN(",",1,7); GENINT(CARDCNT); GEN(")",1,7); 50279000
|
|
END OF PACK; 50280000
|
|
50281000
|
|
50282000
|
|
PROCEDURE UNPACK; 50283000
|
|
BEGIN 50284000
|
|
INTEGER IT,T; 50285000
|
|
GEN("UNPACK(",7,1); INSYMBOL; 50286000
|
|
IF CURSY=LPAR THEN 50287000
|
|
BEGIN 50288000
|
|
INSYMBOL; EXPRESSION; 50289000
|
|
IF CURTYPE>0 THEN IF TYPETAB1[CURTYPE].FORM!ALFA THEN ERROR(17); 50290000
|
|
IF CURSY=COMMA THEN 50291000
|
|
BEGIN 50292000
|
|
GEN(",",1,7); INSYMBOL; 50293000
|
|
IF CURSY=IDENTIFIER THEN 50294000
|
|
BEGIN 50295000
|
|
SEARCH; 50296000
|
|
IF FOUND THEN 50297000
|
|
BEGIN 50298000
|
|
IF THISID.IDCLASS=VAR THEN 50299000
|
|
BEGIN 50300000
|
|
T:=TYPETAB1[THISID.TYPE]; 50301000
|
|
IF T.FORM=ARRAYS THEN 50302000
|
|
BEGIN 50303000
|
|
IT:=T.INXTYPE; 50304000
|
|
IF TYPETAB1[T.ARRTYPE].FORM!CHAR THEN ERROR(88); 50305000
|
|
IF THISLEVEL>1 AND THISLEVEL!CURLEVEL THEN ERROR(5); 50306000
|
|
GENID("V",1000|THISLEVEL+THISINDEX,5); 50307000
|
|
GEN(",",1,7); GENINT(TYPETAB2[THISID.TYPE]); 50308000
|
|
GEN(",",1,7); GENINT(TYPETAB3[THISID.TYPE]); 50309000
|
|
END ELSE ERROR(88); 50310000
|
|
END ELSE ERROR(88); 50311000
|
|
END ELSE ERROR(1); 50312000
|
|
END ELSE ERROR(9); 50313000
|
|
INSYMBOL; 50314000
|
|
IF CURSY=COMMA THEN 50315000
|
|
BEGIN 50316000
|
|
GEN(",",1,7); 50317000
|
|
INSYMBOL; EXPRESSION; CHECKTYPES(IT,CURTYPE); 50318000
|
|
END ELSE BEGIN ERROR(89); SKIP(RPAR) END; 50319000
|
|
END ELSE BEGIN ERROR(89); SKIP(RPAR) END; 50320000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(89); SKIP(RPAR) END; 50321000
|
|
IF CURSY=RPAR THEN INSYMBOL; 50322000
|
|
END ELSE BEGIN ERROR(3); INSYMBOL END; 50323000
|
|
GEN(",",1,7); GENINT(CARDCNT); GEN(")",1,7); 50324000
|
|
END OF UNPACK; 50325000
|
|
50326000
|
|
50327000
|
|
PROCEDURE NEWDISP; %*** "NEW","DISPOSE" 50328000
|
|
BEGIN 50329000
|
|
INTEGER T1; 50330000
|
|
IF CURNAME1="3000NEW" THEN GEN("NEW(",4,4) ELSE 50331000
|
|
BEGIN GEN("DISPOSE",7,1); GEN("(",1,7) END; 50332000
|
|
INSYMBOL; 50333000
|
|
IF CURSY=LPAR THEN 50334000
|
|
BEGIN 50335000
|
|
INSYMBOL; 50336000
|
|
IF CURSY=IDENTIFIER THEN 50337000
|
|
BEGIN 50338000
|
|
SEARCH; 50339000
|
|
IF FOUND THEN 50340000
|
|
BEGIN 50341000
|
|
VARIABLE; 50342000
|
|
IF CURTYPE>0 THEN IF TYPETAB1[CURTYPE].FORM=POINTERS THEN 50343000
|
|
BEGIN 50344000
|
|
WRITEEXPR; GEN(",",1,7); 50345000
|
|
T1:=TYPETAB1[CURTYPE].POINTTYPE; 50346000
|
|
T1:=TYPETAB1[T1].SIZE; 50347000
|
|
IF T1>1023 THEN ERROR(86); 50348000
|
|
GENINT(T1); GEN(")",1,7); 50349000
|
|
END ELSE ERROR(81); 50350000
|
|
END ELSE BEGIN ERROR(1); INSYMBOL END; 50351000
|
|
END ELSE ERROR(9); 50352000
|
|
WHILE CURSY=COMMA DO 50353000
|
|
BEGIN INSYMBOL; 50354000
|
|
IF CURSY NEQ IDENTIFIER THEN ERROR(9); 50355000
|
|
IF CURSY NEQ RPAR THEN INSYMBOL; 50356000
|
|
END; 50357000
|
|
END ELSE BEGIN ERROR(58); SKIP(RPAR) END; 50358000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 50359000
|
|
IF CURSY=RPAR THEN INSYMBOL; 50360000
|
|
END OF NEWDISP; 50361000
|
|
$ PAGE 60000000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%60001000
|
|
% %60002000
|
|
% %60003000
|
|
% %60004000
|
|
% PART 6: THE STATEMENT PARSER. %60005000
|
|
% --------------------- %60006000
|
|
% %60007000
|
|
% %60008000
|
|
% %60009000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%60010000
|
|
60011000
|
|
60012000
|
|
60013000
|
|
PROCEDURE STATEMENT; FORWARD; 60014000
|
|
60015000
|
|
PROCEDURE ASSIGNMENT; 60016000
|
|
BEGIN 60017000
|
|
INTEGER LEFTTYPE; 60018000
|
|
LABEL ASSIGN,EXIT; 60019000
|
|
IF FOUND THEN 60050000
|
|
BEGIN 60051000
|
|
IF THISID.IDCLASS=VAR OR 60052000
|
|
THISID.IDCLASS=CONST AND BOOLEAN(THISID.FORMAL) THEN 60053000
|
|
BEGIN 60054000
|
|
VARIABLE; LEFTTYPE:=CURTYPE; 60055000
|
|
ASSIGN: IF CURSY!ASSIGNSY THEN 60056000
|
|
BEGIN ERROR(28); SKIP(ASSIGNSY); 60057000
|
|
IF SYMKIND[CURSY]=TERMINAL THEN GO TO EXIT; 60058000
|
|
END; 60059000
|
|
INSYMBOL; 60060000
|
|
IF TYPETAB1[LEFTTYPE].STRUCT>0 THEN 60061000
|
|
BEGIN 60062000
|
|
ERROR(95); 60063000
|
|
END ELSE 60080000
|
|
BEGIN 60081000
|
|
WRITEEXPR; GEN(":=",2,6); 60082000
|
|
IF CHECKOPTION AND TYPETAB1[LEFTTYPE].FORM{CHAR THEN 60083000
|
|
CHECKEXPR(TYPETAB2[LEFTTYPE],TYPETAB3[LEFTTYPE]) ELSE 60084000
|
|
EXPRESSION; 60085000
|
|
WRITEEXPR; 60086000
|
|
CHECKTYPES(LEFTTYPE,CURTYPE); 60087000
|
|
END; 60088000
|
|
END ELSE 60089000
|
|
BEGIN % FUNCTION ASSIGNMENT. 60090000
|
|
IF THISLEVEL!CURLEVEL-1 OR THISINDEX!CURFUNC THEN ERROR(5); 60091000
|
|
GENID("V",1000|THISLEVEL+THISINDEX,5); LEFTTYPE:=THISID.TYPE; 60092000
|
|
INSYMBOL; GO TO ASSIGN; 60093000
|
|
END; 60094000
|
|
END ELSE 60095000
|
|
BEGIN 60096000
|
|
SKIP(ASSIGNSY); 60097000
|
|
IF CURSY=ASSIGNSY THEN GO TO ASSIGN; 60098000
|
|
END; 60099000
|
|
EXIT: 60100000
|
|
END OF ASSIGNMENT; 60101000
|
|
60102000
|
|
60103000
|
|
PROCEDURE COMPSTAT; 60104000
|
|
BEGIN 60105000
|
|
INTEGER BEGINNUM; 60106000
|
|
LABEL STATM; 60107000
|
|
60108000
|
|
BEGINNUM:=NUMBEGINS:=NUMBEGINS+1; MARGIN(" B",BEGINNUM); 60109000
|
|
GEN("BEGIN",6,3); 60110000
|
|
DO BEGIN 60111000
|
|
IF CURSY=SEMICOLON OR CURSY=BEGINSY THEN INSYMBOL; 60112000
|
|
STATM: STATEMENT; 60113000
|
|
GEN(";",1,7); 60114000
|
|
IF CURSY=ELSESY THEN BEGIN ERROR(20); INSYMBOL; GO STATM END; 60115000
|
|
IF SYMKIND[CURSY]=INITIAL THEN BEGIN ERROR(21); GO STATM END; 60116000
|
|
END UNTIL CURSY!SEMICOLON; 60117000
|
|
IF CURSY!ENDSY THEN 60118000
|
|
BEGIN ERROR(24); SKIP(ENDSY); 60119000
|
|
IF CURSY!ENDSY THEN BEGIN INSYMBOL; GO TO STATM END; 60120000
|
|
END; 60121000
|
|
GEN(" END",5,4); MARGIN(" E",BEGINNUM); 60122000
|
|
INSYMBOL; 60123000
|
|
END OF COMPSTAT; 60124000
|
|
60125000
|
|
60126000
|
|
PROCEDURE IFSTAT; 60127000
|
|
BEGIN 60128000
|
|
LABEL EXIT; 60129000
|
|
GEN("IF",3,6); 60130000
|
|
INSYMBOL; BOOLEXPR; 60131000
|
|
IF CURSY!THENSY THEN 60132000
|
|
BEGIN IF CURTYPE>0 THEN ERROR(27); 60133000
|
|
SKIP(THENSY); 60134000
|
|
IF CURSY!THENSY THEN 60135000
|
|
BEGIN IF CURTYPE=0 THEN ERROR(27); 60136000
|
|
IF SYMKIND[CURSY]=TERMINAL THEN GO TO EXIT; 60137000
|
|
END; END; 60138000
|
|
GEN(" THEN",6,3); 60139000
|
|
INSYMBOL; STATEMENT; 60140000
|
|
IF CURSY=ELSESY THEN 60141000
|
|
BEGIN GEN(" ELSE",6,3); INSYMBOL; STATEMENT END; 60142000
|
|
EXIT: 60143000
|
|
END OF IFSTAT; 60144000
|
|
60145000
|
|
60146000
|
|
PROCEDURE CASESTAT; 60147000
|
|
BEGIN 60148000
|
|
DEFINE CASEHASH(N)=(N).[38:39] MOD MAXCASES#; 60149000
|
|
INTEGER ARRAY CASETAB[0:MAXCASES]; 60150000
|
|
INTEGER CASENUM,CASETYPE,NCASELABS,TEMPVARNUM,CONVAL,CONTYPE,C,T; 60151000
|
|
BOOLEAN ZEROLAB,FIRST; 60152000
|
|
60153000
|
|
CASENUM:=NUMCASES:=NUMCASES+1; MARGIN("CB",CASENUM); 60154000
|
|
TEMPVARNUM:=NUMTEMPS:=NUMTEMPS+1; 60155000
|
|
IF TEMPVARNUM>MAXTEMPS THEN ERROR(16); 60156000
|
|
GEN("BEGIN",6,3); GENID("T",TEMPVARNUM,2); GEN(":=",2,6); 60157000
|
|
INSYMBOL; EXPRESSION; 60158000
|
|
GEN(";",1,7); CASETYPE:=CURTYPE; 60159000
|
|
IF TYPETAB1[CASETYPE].FORM}FLOATING THEN 60160000
|
|
BEGIN ERROR(17); CASETYPE:=0 END; 60161000
|
|
IF CURSY!OFSY THEN 60162000
|
|
BEGIN IF CASETYPE>0 THEN ERROR(18); 60163000
|
|
SKIP(OFSY); 60164000
|
|
IF CURSY=OFSY THEN INSYMBOL ELSE 60165000
|
|
IF CASETYPE=0 THEN ERROR(18); 60166000
|
|
END ELSE INSYMBOL; 60167000
|
|
DO BEGIN 60168000
|
|
WHILE CURSY=SEMICOLON DO INSYMBOL; 60169000
|
|
FIRST:=TRUE; 60170000
|
|
IF CURSY!ENDSY THEN 60171000
|
|
BEGIN 60172000
|
|
GEN("IF",3,6); 60173000
|
|
DO BEGIN 60174000
|
|
IF FIRST THEN FIRST:=FALSE ELSE INSYMBOL; 60175000
|
|
CONSTANT(CONVAL,CONTYPE); 60176000
|
|
IF CONTYPE>0 THEN 60177000
|
|
BEGIN 60178000
|
|
IF CASETYPE=0 THEN CASETYPE:=CONTYPE ELSE 60179000
|
|
CHECKTYPES(CASETYPE,CONTYPE); 60180000
|
|
GENID("T",TEMPVARNUM,2); GEN("=",1,7); GENINT(CONVAL); 60181000
|
|
NCASELABS:=NCASELABS+1; 60182000
|
|
IF NCASELABS<MAXCASES THEN 60183000
|
|
BEGIN 60184000
|
|
IF CONVAL=0 THEN 60185000
|
|
IF ZEROLAB THEN ERROR(31) ELSE ZEROLAB:=TRUE ELSE 60186000
|
|
BEGIN 60187000
|
|
T:=CASEHASH(CONVAL); 60188000
|
|
FOR C:=CASETAB[T] WHILE C!CONVAL AND C!0 DO 60189000
|
|
T:=IF T=0 THEN MAXCASES ELSE T-1; 60190000
|
|
IF C!0 THEN ERROR(31) ELSE CASETAB[T]:=CONVAL; 60191000
|
|
END; 60192000
|
|
END ELSE IF NCASELABS=MAXCASES THEN ERROR(30); 60193000
|
|
IF CURSY=COMMA THEN GEN(" OR",4,5); 60194000
|
|
END; 60195000
|
|
END UNTIL CURSY!COMMA; 60196000
|
|
GEN(" THEN",6,3); 60197000
|
|
IF CURSY!COLON THEN BEGIN ERROR(26); SKIP(COLON) END; 60198000
|
|
IF CURSY=COLON THEN INSYMBOL; 60199000
|
|
STATEMENT; 60200000
|
|
IF CURSY!SEMICOLON AND CURSY!ENDSY THEN 60201000
|
|
BEGIN ERROR(21); SKIP(SEMICOLON) END; 60202000
|
|
END; 60203000
|
|
IF CURSY=SEMICOLON THEN GEN(" ELSE",6,3); 60204000
|
|
END UNTIL CURSY!SEMICOLON; 60205000
|
|
IF CURSY!ENDSY THEN BEGIN ERROR(24); SKIP(ENDSY) END; 60206000
|
|
GEN(" END",5,4); MARGIN("CE",CASENUM); 60207000
|
|
NUMTEMPS:=NUMTEMPS-1; 60208000
|
|
INSYMBOL; 60209000
|
|
END OF CASESTAT; 60210000
|
|
60211000
|
|
60212000
|
|
PROCEDURE WHILESTAT; 60213000
|
|
BEGIN 60214000
|
|
LABEL STATM,EXIT; 60215000
|
|
GEN("WHILE",6,3); 60216000
|
|
INSYMBOL; BOOLEXPR; 60217000
|
|
IF CURSY!DOSY THEN 60218000
|
|
BEGIN IF CURTYPE>0 THEN ERROR(19); 60219000
|
|
SKIP(DOSY); 60220000
|
|
IF CURSY!DOSY THEN 60221000
|
|
BEGIN IF CURTYPE=0 THEN ERROR(19); 60222000
|
|
GO TO IF SYMKIND[CURSY]=INITIAL THEN STATM ELSE EXIT; 60223000
|
|
END; END; 60224000
|
|
GEN(" DO",4,5); 60225000
|
|
INSYMBOL; 60226000
|
|
STATM: STATEMENT; 60227000
|
|
EXIT: 60228000
|
|
END OF WHILESTAT; 60229000
|
|
60230000
|
|
60231000
|
|
PROCEDURE REPEATSTAT; 60232000
|
|
BEGIN 60233000
|
|
INTEGER REPNUM; 60234000
|
|
LABEL NEWTRY; 60235000
|
|
60236000
|
|
REPNUM:=NUMREPS:=NUMREPS+1; 60237000
|
|
MARGIN(" R",REPNUM); 60238000
|
|
GEN("DO",3,6); GEN("BEGIN",6,3); 60239000
|
|
DO BEGIN 60240000
|
|
INSYMBOL; 60241000
|
|
NEWTRY: STATEMENT; 60242000
|
|
GEN(";",1,7); 60243000
|
|
IF CURSY=ELSESY THEN BEGIN ERROR(20);INSYMBOL; GO NEWTRY END; 60244000
|
|
IF SYMKIND[CURSY]=INITIAL THEN BEGIN ERROR(21); GO NEWTRY END; 60245000
|
|
END UNTIL CURSY!SEMICOLON; 60246000
|
|
IF CURSY!UNTILSY THEN 60247000
|
|
BEGIN 60248000
|
|
ERROR(22); 60249000
|
|
WHILE CURSY!UNTILSY AND SYMKIND[CURSY]!INITIAL DO 60250000
|
|
BEGIN INSYMBOL; SKIP(UNTILSY) END; 60251000
|
|
IF CURSY!UNTILSY THEN GO TO NEWTRY; 60252000
|
|
END; 60253000
|
|
GEN(" END",5,4); GEN("UNTIL",6,3); MARGIN(" U",REPNUM); 60254000
|
|
INSYMBOL; BOOLEXPR; 60255000
|
|
END OF REPEATSTAT; 60256000
|
|
60257000
|
|
60258000
|
|
PROCEDURE FORSTAT; 60259000
|
|
BEGIN 60260000
|
|
INTEGER VARTYPE,VARNUM,LLIM,ULIM; 60261000
|
|
BOOLEAN DOWN; 60262000
|
|
LABEL STATM; 60263000
|
|
60264000
|
|
GEN("BEGIN",6,3); 60265000
|
|
INSYMBOL; 60266000
|
|
IF CURSY=IDENTIFIER THEN 60267000
|
|
BEGIN 60268000
|
|
SEARCH; 60269000
|
|
IF FOUND THEN 60270000
|
|
BEGIN 60271000
|
|
VARNUM:=1000|THISLEVEL+THISINDEX; 60272000
|
|
IF THISID.IDCLASS=VAR OR 60273000
|
|
THISID.IDCLASS=CONST AND BOOLEAN(THISID.FORMAL) THEN 60274000
|
|
BEGIN 60275000
|
|
IF THISLEVEL>1 AND THISLEVEL<CURLEVEL THEN ERROR(5); 60276000
|
|
IF THISLEVEL>CURLEVEL THEN ERROR(83); 60277000
|
|
VARTYPE:=THISID.TYPE; 60278000
|
|
IF TYPETAB1[VARTYPE].FORM{CHAR THEN 60279000
|
|
BEGIN 60280000
|
|
LLIM:=TYPETAB2[VARTYPE]; ULIM:=TYPETAB3[VARTYPE]; 60281000
|
|
END ELSE BEGIN ERROR(12); VARTYPE:=0 END; 60282000
|
|
END ELSE ERROR(8); 60283000
|
|
END ELSE ERROR(1); 60284000
|
|
END ELSE ERROR(9); 60285000
|
|
INSYMBOL; 60286000
|
|
IF CURSY!ASSIGNSY THEN 60287000
|
|
BEGIN ERROR(28); 60288000
|
|
SKIP(ASSIGNSY); 60289000
|
|
IF CURSY=ASSIGNSY THEN INSYMBOL ELSE 60290000
|
|
IF SYMKIND[CURSY]=INITIAL THEN GO TO STATM; 60291000
|
|
END ELSE INSYMBOL; 60292000
|
|
GENID("V",VARNUM,5); GEN("~",1,7); 60293000
|
|
IF CHECKOPTION THEN CHECKEXPR(LLIM,ULIM) ELSE EXPRESSION; 60294000
|
|
WRITEEXPR; 60295000
|
|
GEN(";",1,7); 60296000
|
|
IF VARTYPE=0 THEN VARTYPE:=CURTYPE ELSE CHECKTYPES(VARTYPE,CURTYPE);60297000
|
|
NUMTEMPS:=NUMTEMPS+1; IF NUMTEMPS>MAXTEMPS THEN ERROR(16); 60298000
|
|
IF CURSY=TOSY THEN INSYMBOL ELSE 60299000
|
|
IF CURSY=DOWNTOSY THEN BEGIN DOWN:=TRUE; INSYMBOL END ELSE 60300000
|
|
BEGIN IF CURTYPE>0 THEN ERROR(23); 60301000
|
|
SKIP(TOSY); 60302000
|
|
IF CURSY=TOSY THEN INSYMBOL ELSE 60303000
|
|
BEGIN IF CURTYPE=0 THEN ERROR(23); 60304000
|
|
IF SYMKIND[CURSY]=INITIAL THEN GO TO STATM; 60305000
|
|
END; END; 60306000
|
|
GENID("T",NUMTEMPS,2); GEN("~",1,7); 60307000
|
|
IF CHECKOPTION THEN CHECKEXPR(LLIM,ULIM) ELSE EXPRESSION; 60308000
|
|
WRITEEXPR; 60309000
|
|
GEN(";",1,7); 60310000
|
|
IF VARTYPE=0 THEN VARTYPE:=CURTYPE ELSE CHECKTYPES(VARTYPE,CURTYPE);60311000
|
|
IF CURSY!DOSY THEN 60312000
|
|
BEGIN IF CURTYPE>0 THEN ERROR(19); 60313000
|
|
SKIP(DOSY); 60314000
|
|
IF CURSY=DOSY THEN INSYMBOL ELSE 60315000
|
|
IF CURTYPE=0 THEN ERROR(19); 60316000
|
|
END ELSE INSYMBOL; 60317000
|
|
GEN("FOR",4,5); GENID("V",VARNUM,5); GEN("~",1,7); 60318000
|
|
GENID("V",VARNUM,5); GEN(" ",1,7); 60319000
|
|
IF DOWN THEN GEN("DOWNTO",7,2) ELSE GEN("UPTO",5,4); 60320000
|
|
GENID("T",NUMTEMPS,2); GEN(" DO",4,5); 60321000
|
|
STATM: STATEMENT; 60322000
|
|
GEN(" END",5,4); 60323000
|
|
NUMTEMPS:=NUMTEMPS-1; 60324000
|
|
END OF FORSTAT; 60325000
|
|
60326000
|
|
60327000
|
|
PROCEDURE GOTOSTAT; 60328000
|
|
BEGIN 60329000
|
|
INTEGER I; 60330000
|
|
INSYMBOL; 60331000
|
|
IF CURSY=INTCONST THEN 60332000
|
|
BEGIN I:=NUMLABS; 60333000
|
|
WHILE I}1 AND LABTAB[I].LABVAL!CURVAL DO I:=I-1; 60334000
|
|
IF I=0 THEN ERROR(15); 60335000
|
|
GEN("GO",3,6); GENID("L",CURVAL,4); 60336000
|
|
INSYMBOL; 60337000
|
|
END ELSE ERROR(10); 60338000
|
|
END OF GOTOSTAT; 60339000
|
|
60340000
|
|
60341000
|
|
PROCEDURE WITHSTAT; 60342000
|
|
BEGIN 60343000
|
|
INTEGER STARTLEVEL,VERYFIRSTWITHSYM,I; 60344000
|
|
REAL D; 60345000
|
|
STARTLEVEL:=TOPLEVEL; VERYFIRSTWITHSYM:=NWITHSYMS; 60346000
|
|
DO BEGIN 60347000
|
|
INSYMBOL; 60348000
|
|
IF CURSY=IDENTIFIER THEN 60349000
|
|
BEGIN 60350000
|
|
SEARCH; 60351000
|
|
IF FOUND THEN 60352000
|
|
BEGIN 60353000
|
|
IF THISID.IDCLASS=VAR THEN 60354000
|
|
BEGIN 60355000
|
|
VARIABLE; 60356000
|
|
IF CURTYPE>0 THEN 60357000
|
|
IF TYPETAB1[CURTYPE].FORM!RECORD THEN ERROR(98); 60358000
|
|
IF SIMPLEVARIABLE THEN 60359000
|
|
BEGIN PUTSYM("["); INSIDEBRACKETS:=TRUE END; 60360000
|
|
IF TOPLEVEL<MAXLEVEL THEN 60361000
|
|
BEGIN 60362000
|
|
TOPLEVEL:=TOPLEVEL+1; 60363000
|
|
D.NAMETAB:=TYPETAB1[CURTYPE].RECTAB; 60364000
|
|
D.RECTYPE:=CURTYPE; 60365000
|
|
D.NUMPNTRSINWITH:=NUMPOINTERS; 60366000
|
|
D.FIRSTWITHSYM:=NWITHSYMS; 60367000
|
|
D.BRACKETSINWITH:=REAL(INSIDEBRACKETS); 60368000
|
|
IF NWITHSYMS+NUMSYMS>MAXWITHSYMS THEN ERROR(63) ELSE 60369000
|
|
FOR I:=1 STEP 1 UNTIL NUMSYMS DO 60370000
|
|
BEGIN 60371000
|
|
WITHTAB[NWITHSYMS]:=SYMTAB[I]; 60372000
|
|
NWITHSYMS:=NWITHSYMS+1; 60373000
|
|
END; 60374000
|
|
D.LASTWITHSYM:=NWITHSYMS-1; 60375000
|
|
DISPLAY[TOPLEVEL]:=D; 60376000
|
|
END ELSE ERROR(84); 60377000
|
|
END ELSE BEGIN ERROR(8); INSYMBOL END; 60378000
|
|
END ELSE BEGIN ERROR(1); INSYMBOL END; 60379000
|
|
END ELSE BEGIN ERROR(9); INSYMBOL END; 60380000
|
|
NUMSYMS:=0; 60381000
|
|
NUMPOINTERS := 0; 60382000
|
|
END UNTIL CURSY!COMMA; 60383000
|
|
IF CURSY!DOSY THEN 60384000
|
|
BEGIN ERROR(19); SKIP(DOSY); 60385000
|
|
IF CURSY=DOSY THEN INSYMBOL; 60386000
|
|
END ELSE INSYMBOL; 60387000
|
|
STATEMENT; 60388000
|
|
TOPLEVEL:=STARTLEVEL; NWITHSYMS:=VERYFIRSTWITHSYM; 60389000
|
|
END OF WITHSTAT; 60390000
|
|
60391000
|
|
60392000
|
|
PROCEDURE STATEMENT; 60393000
|
|
BEGIN 60394000
|
|
INTEGER I; 60395000
|
|
LABEL LABFOUND; 60396000
|
|
60397000
|
|
IF CURSY=INTCONST THEN % *** LABELED STATEMENT *** 60398000
|
|
BEGIN 60399000
|
|
FOR I:=FIRSTLAB STEP 1 UNTIL NUMLABS DO 60400000
|
|
IF LABTAB[I].LABVAL=CURVAL THEN 60401000
|
|
BEGIN IF LABTAB[I].LABDEF=1 THEN ERROR(31); 60402000
|
|
LABTAB[I].LABDEF:=1; 60403000
|
|
GO TO LABFOUND; 60404000
|
|
END; 60405000
|
|
ERROR(15); 60406000
|
|
LABFOUND: GENID("L",CURVAL,4); GEN(":",1,7); 60407000
|
|
INSYMBOL; 60408000
|
|
IF CURSY!COLON THEN 60409000
|
|
BEGIN ERROR(26); 60410000
|
|
SKIP(COLON); IF CURSY=COLON THEN INSYMBOL; 60411000
|
|
END ELSE INSYMBOL; 60412000
|
|
END; 60413000
|
|
60414000
|
|
COMMENT *** START OF STATEMENT *** ; 60415000
|
|
60416000
|
|
IF CURSY=IDENTIFIER THEN 60417000
|
|
BEGIN 60418000
|
|
SEARCH; 60419000
|
|
IF FOUND THEN 60420000
|
|
BEGIN 60421000
|
|
IF THISID.IDCLASS=VAR OR 60422000
|
|
THISID.IDCLASS=CONST AND BOOLEAN(THISID.FORMAL) OR 60423000
|
|
THISID.IDCLASS=FUNC THEN ASSIGNMENT ELSE 60424000
|
|
IF THISID.IDCLASS=PROC THEN 60425000
|
|
BEGIN 60426000
|
|
IF THISLEVEL=0 THEN % *** INTRINSIC PROCEDURE *** 60427000
|
|
BEGIN 60428000
|
|
IF CURNAME1="50WRITE" THEN PWRITE(FALSE) ELSE 60429000
|
|
IF CURNAME1="7WRITEL" AND 60430000
|
|
CURNAME2="000000N" THEN PWRITE(TRUE) ELSE 60431000
|
|
IF CURNAME1="400READ" THEN PREAD(FALSE) ELSE 60432000
|
|
IF CURNAME1="6READLN" THEN PREAD(TRUE) ELSE 60433000
|
|
IF CURNAME1="400PAGE" THEN FILEHANDLING(5) ELSE 60434000
|
|
IF CURNAME1="3000GET" THEN FILEHANDLING(2) ELSE 60435000
|
|
IF CURNAME1="3000PUT" THEN FILEHANDLING(1) ELSE 60436000
|
|
IF CURNAME1="50RESET" THEN FILEHANDLING(3) ELSE 60437000
|
|
IF CURNAME1="7REWRIT" AND 60438000
|
|
CURNAME2="000000E" THEN FILEHANDLING(4) ELSE 60439000
|
|
IF CURNAME1="3000NEW" THEN NEWDISP ELSE 60440000
|
|
IF CURNAME1="7DISPOS" AND 60441000
|
|
CURNAME2="000000E" THEN NEWDISP ELSE 60442000
|
|
IF CURNAME1="400PACK" THEN PACK ELSE 60443000
|
|
IF CURNAME1="6UNPACK" THEN UNPACK ELSE ERROR(0); 60444000
|
|
END ELSE PASSPARAMS; 60445000
|
|
WRITEEXPR; 60446000
|
|
END ELSE BEGIN ERROR(13); SKIP(99) END; 60447000
|
|
END ELSE BEGIN ERROR(1); ASSIGNMENT END; 60448000
|
|
END OF IDENTIFIER ELSE 60449000
|
|
IF CURSY=BEGINSY THEN COMPSTAT ELSE 60450000
|
|
IF CURSY=IFSY THEN IFSTAT ELSE 60451000
|
|
IF CURSY=CASESY THEN CASESTAT ELSE 60452000
|
|
IF CURSY=WHILESY THEN WHILESTAT ELSE 60453000
|
|
IF CURSY=REPEATSY THEN REPEATSTAT ELSE 60454000
|
|
IF CURSY=FORSY THEN FORSTAT ELSE 60455000
|
|
IF CURSY=WITHSY THEN WITHSTAT ELSE 60456000
|
|
IF CURSY=GOTOSY THEN GOTOSTAT ELSE 60457000
|
|
IF SYMKIND[CURSY]!TERMINAL THEN 60458000
|
|
BEGIN ERROR(13); INSYMBOL; SKIP(SEMICOLON) END; 60459000
|
|
END OF STATEMENT; 60460000
|
|
$ PAGE 70000000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70001000
|
|
% %70002000
|
|
% %70003000
|
|
% %70004000
|
|
% PART 7: TYPE DECLARATIONS. %70005000
|
|
% ------------------ %70006000
|
|
% %70007000
|
|
% %70008000
|
|
% %70009000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70010000
|
|
70011000
|
|
70012000
|
|
REAL VALX1,VALX2; 70013000
|
|
INTEGER TYPEX1,TYPEX2; 70014000
|
|
BOOLEAN PACKED; 70015000
|
|
70016000
|
|
PROCEDURE FIELDLIST(RECTAB,FIRSTADDR,LASTADDR); 70017000
|
|
VALUE RECTAB,FIRSTADDR; 70018000
|
|
INTEGER RECTAB,FIRSTADDR,LASTADDR; 70019000
|
|
FORWARD; 70020000
|
|
70021000
|
|
DEFINE SUBRANGE= %*** SUBRANGE DECLARATION*** 70022000
|
|
BEGIN %*************************** 70023000
|
|
CONSTANT(VALX1,TYPEX1); 70024000
|
|
IF TYPETAB1[TYPEX1].FORM>CHAR THEN ERROR(11); 70025000
|
|
IF CURSY!DOUBLEDOT THEN ERROR(53); 70026000
|
|
INSYMBOL; 70027000
|
|
CONSTANT(VALX2,TYPEX2); 70028000
|
|
IF TYPEX1>0 AND TYPEX2>0 THEN 70029000
|
|
IF TYPEX1!TYPEX2 THEN ERROR(11) ELSE 70030000
|
|
IF VALX1>VALX2 THEN ERROR(54); 70031000
|
|
T1:=TYPETAB1[TYPEX1].FORM; IF T1=SYMBOLIC THEN T1:=SUBTYPE; 70032000
|
|
NEWTYPE; TTYPE:=TYPEINDEX; 70033000
|
|
T1.SIZE:=TSIZE:=1; T1.STRUCT:=0; T1.MAINTYPE:=TYPEX1; 70034000
|
|
TYPETAB1[TYPEINDEX]:=T1; 70035000
|
|
TYPETAB2[TYPEINDEX]:=VALX1; TYPETAB3[TYPEINDEX]:=VALX2; 70036000
|
|
END OF SUBRANGE#; 70037000
|
|
70038000
|
|
70039000
|
|
PROCEDURE TYPEDECL(TTYPE,TSIZE); 70040000
|
|
INTEGER TTYPE,TSIZE; 70041000
|
|
BEGIN 70042000
|
|
PROCEDURE TYPERR(ERRNUM,TTYPE,TSIZE); 70043000
|
|
VALUE ERRNUM; 70044000
|
|
INTEGER ERRNUM,TTYPE,TSIZE; 70045000
|
|
BEGIN ERROR(ERRNUM); 70046000
|
|
TTYPE:=TSIZE:=0; 70047000
|
|
END; 70048000
|
|
70049000
|
|
INTEGER RECINX,ARRSTRUCT,TX,SX,T1,T2,T3,T,N; 70050000
|
|
BOOLEAN FIRST; 70051000
|
|
70052000
|
|
PACKED:=FALSE; 70080000
|
|
IF CURSY=IDENTIFIER THEN %*** SIMPLE TYPE DECLARATION ***70081000
|
|
BEGIN %*******************************70082000
|
|
SEARCH; 70083000
|
|
IF FOUND THEN 70084000
|
|
BEGIN 70085000
|
|
IF THISID.IDCLASS=TYPES THEN 70086000
|
|
BEGIN 70087000
|
|
TTYPE:=THISID.TYPE; TSIZE:=TYPETAB1[TTYPE].SIZE; 70088000
|
|
INSYMBOL; 70089000
|
|
END ELSE IF THISID.IDCLASS=CONST THEN SUBRANGE 70090000
|
|
ELSE TYPERR(7,TTYPE,TSIZE); 70091000
|
|
END ELSE BEGIN TYPERR(1,TTYPE,TSIZE); INSYMBOL END; 70092000
|
|
END ELSE 70093000
|
|
IF CURSY{CHARCONST OR CURSY=PLUS OR CURSY=MINUS THEN SUBRANGE ELSE 70094000
|
|
IF CURSY=LPAR THEN 70095000
|
|
BEGIN 70096000
|
|
N:=0; 70097000
|
|
NEWTYPE; T3.IDCLASS:=CONST; T3.TYPE:=TYPEINDEX; 70098000
|
|
DO BEGIN 70099000
|
|
INSYMBOL; 70100000
|
|
IF CURSY=IDENTIFIER THEN 70101000
|
|
BEGIN 70102000
|
|
NEWNAME(CURNAME1,CURNAME2,CURLEVEL); 70103000
|
|
T3.INFO:=N; NAMETAB3[CURLEVEL,THISINDEX]:=T3; 70104000
|
|
N:=N+1; INSYMBOL; 70105000
|
|
END ELSE ERROR(9); 70106000
|
|
END UNTIL CURSY!COMMA; 70107000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 70108000
|
|
T1:=SYMBOLIC; T1.STRUCT:=0; 70109000
|
|
T1.SIZE:=TSIZE:=1; TTYPE:=TYPEINDEX; 70110000
|
|
TYPETAB1[TYPEINDEX]:=T1; 70111000
|
|
TYPETAB2[TYPEINDEX]:=0; TYPETAB3[TYPEINDEX]:=N-1; 70112000
|
|
IF CURSY=RPAR THEN INSYMBOL; 70113000
|
|
END ELSE 70114000
|
|
70115000
|
|
IF CURSY=ARROW THEN %*** POINTER DECLARATION *** 70116000
|
|
BEGIN %*************************** 70117000
|
|
INSYMBOL; 70118000
|
|
IF CURSY=IDENTIFIER THEN 70119000
|
|
BEGIN 70120000
|
|
NEWTYPE; TTYPE:=TYPEINDEX; T1:=POINTERS; 70121000
|
|
T1.SIZE:=TSIZE:=1; T1.STRUCT:=0; 70122000
|
|
TYPETAB1[TYPEINDEX]:=T1; 70123000
|
|
SEARCH; 70124000
|
|
IF FOUND THEN 70125000
|
|
BEGIN 70126000
|
|
IF THISID.IDCLASS=TYPES THEN 70127000
|
|
TYPETAB1[TYPEINDEX].POINTTYPE:=THISID.TYPE ELSE 70128000
|
|
TYPERR(7,TTYPE,TSIZE); 70129000
|
|
END ELSE 70130000
|
|
BEGIN 70131000
|
|
IF NUMPNTRS<MAXPNTRS THEN NUMPNTRS:=NUMPNTRS+1 ELSE ERROR(52);70132000
|
|
PNTRTAB1[NUMPNTRS]:=CURNAME1; PNTRTAB2[NUMPNTRS]:=CURNAME2; 70133000
|
|
PNTRTAB3[NUMPNTRS]:=TYPEINDEX; 70134000
|
|
END; 70135000
|
|
INSYMBOL; 70136000
|
|
END ELSE TYPERR(9,TTYPE,TSIZE); 70137000
|
|
END OF POINTER DECLARATION ELSE 70138000
|
|
BEGIN 70139000
|
|
IF CURSY=PACKEDSY THEN BEGIN PACKED:=TRUE; INSYMBOL END; 70140000
|
|
70141000
|
|
IF CURSY=ARRAYSY THEN %*** ARRAY DECLARATION *** 70142000
|
|
BEGIN %************************* 70143000
|
|
INSYMBOL; 70144000
|
|
IF CURSY!LBRACKET THEN ERROR(47) ELSE INSYMBOL; 70145000
|
|
T1:=0; FIRST:=TRUE; 70146000
|
|
DO BEGIN 70147000
|
|
IF FIRST THEN FIRST:=FALSE ELSE INSYMBOL; 70148000
|
|
TYPEDECL(TX,SX); 70149000
|
|
IF TX>0 THEN 70150000
|
|
BEGIN 70151000
|
|
IF TYPETAB1[TX].FORM>CHAR THEN ERROR(48); 70152000
|
|
T1:=ARRAYS; T1.INXTYPE:=TX; T1.ARRTYPE:=T; 70153000
|
|
T2:=TYPETAB2[TX]; T3:=TYPETAB3[TX]; 70154000
|
|
IF T3-T2>1022 THEN ERROR(61); 70155000
|
|
T1.SIZE:=MIN(1023,T3-T2+1); 70156000
|
|
NEWTYPE; 70157000
|
|
TYPETAB1[TYPEINDEX]:=T1; 70158000
|
|
TYPETAB2[TYPEINDEX]:=T2; TYPETAB3[TYPEINDEX]:=T3; 70159000
|
|
T:=TYPEINDEX; 70160000
|
|
END; 70161000
|
|
END UNTIL CURSY!COMMA; 70162000
|
|
IF CURSY!RBRACKET THEN ERROR(59) ELSE INSYMBOL; 70163000
|
|
IF CURSY!OFSY THEN BEGIN ERROR(18); SKIP(OFSY) END; 70164000
|
|
INSYMBOL; 70165000
|
|
TYPEDECL(TX,SX); 70166000
|
|
IF TYPETAB1[TX].FORM}FILES THEN ERROR(60); 70167000
|
|
ARRSTRUCT:=TYPETAB1[TX].STRUCT; 70168000
|
|
WHILE T>0 DO 70169000
|
|
BEGIN 70170000
|
|
T1:=TYPETAB1[T]; T3:=T1.ARRTYPE; 70171000
|
|
T1.ARRTYPE:=TX; T1.STRUCT:=ARRSTRUCT:=ARRSTRUCT+1; 70172000
|
|
T1.SIZE:=SX:=MIN(1024,SX|T1.SIZE); 70173000
|
|
TYPETAB1[T]:=T1; TX:=T; T:=T3; 70174000
|
|
END; 70175000
|
|
TTYPE:=TX; TSIZE:=SX; 70176000
|
|
END OF ARRAY DECLARATION ELSE 70177000
|
|
70178000
|
|
IF CURSY=FILESY THEN %*** FILE DECLARATION *** 70179000
|
|
BEGIN %************************ 70180000
|
|
INSYMBOL; 70181000
|
|
IF CURSY!OFSY THEN 70182000
|
|
BEGIN ERROR(18); 70183000
|
|
IF CURSY!IDENTIFIER THEN INSYMBOL; 70184000
|
|
END ELSE INSYMBOL; 70185000
|
|
TYPEDECL(TX,SX); 70186000
|
|
IF TX>0 THEN 70187000
|
|
BEGIN T:=TYPETAB1[TX]; 70188000
|
|
IF T.FORM}FILES THEN ERROR(50) ELSE 70189000
|
|
IF T.STRUCT>1 THEN ERROR(49) 70190000
|
|
END; 70191000
|
|
NEWTYPE; TTYPE:=TYPEINDEX; 70192000
|
|
T1:=IF T.FORM=CHAR THEN TEXTFILE ELSE FILES; 70193000
|
|
T1.SIZE:=TSIZE:=SX; T1.FILETYPE:=TX; 70194000
|
|
T1.STRUCT:=1; 70195000
|
|
TYPETAB1[TYPEINDEX]:=T1; 70196000
|
|
END OF FILE DECLARATION ELSE 70197000
|
|
70198000
|
|
IF CURSY=SETSY THEN %*** SET DECLARATION *** 70199000
|
|
BEGIN %*********************** 70200000
|
|
INSYMBOL; 70201000
|
|
IF CURSY!OFSY THEN 70202000
|
|
BEGIN ERROR(18); 70203000
|
|
IF CURSY>CHARCONST THEN INSYMBOL; 70204000
|
|
END ELSE INSYMBOL; 70205000
|
|
TYPEDECL(TX,SX); 70206000
|
|
IF TX>0 THEN 70207000
|
|
BEGIN 70208000
|
|
IF TYPETAB1[TX].FORM>CHAR THEN ERROR(48) ELSE 70209000
|
|
IF TYPETAB2[TX]<0 OR TYPETAB3[TX]>38 THEN ERROR(51); 70210000
|
|
END; 70211000
|
|
NEWTYPE; TTYPE:=TYPEINDEX; 70212000
|
|
T1:=SET; T1.SETTYPE:=TX; T1.STRUCT:=0; 70213000
|
|
T1.SIZE:=TSIZE:=1; TYPETAB1[TYPEINDEX]:=T1; 70214000
|
|
TYPETAB2[TYPEINDEX]:=TYPETAB2[TX]; 70215000
|
|
TYPETAB3[TYPEINDEX]:=TYPETAB3[TX]; 70216000
|
|
END OF SET DECLARATION ELSE 70217000
|
|
70218000
|
|
IF CURSY=RECORDSY THEN %*** RECORD DECLARATION *** 70219000
|
|
BEGIN %************************** 70220000
|
|
IF LASTREC-1>CURLEVEL THEN LASTREC:=LASTREC-1 ELSE ERROR(55); 70221000
|
|
RECINX:=LASTREC; 70222000
|
|
BLOCKTAB[RECINX]:=NUMBLOCKS:=NUMBLOCKS+1; 70223000
|
|
INSYMBOL; 70224000
|
|
FIELDLIST(RECINX,0,SX); 70225000
|
|
IF SX>1022 THEN BEGIN ERROR(56); SX:=1022 END; 70226000
|
|
NEWTYPE; TTYPE:=TYPEINDEX; 70227000
|
|
T1:=RECORD; T1.RECTAB:=RECINX; T1.STRUCT:=1; 70228000
|
|
T1.SIZE:=TSIZE:=SX; TYPETAB1[TYPEINDEX]:=T1; 70229000
|
|
TYPETAB2[TYPEINDEX]:=0; TYPETAB3[TYPEINDEX]:=SX-1; 70230000
|
|
IF CURSY!ENDSY THEN BEGIN ERROR(24); SKIP(ENDSY) END; 70231000
|
|
IF CURSY=ENDSY THEN INSYMBOL; 70232000
|
|
END ELSE BEGIN ERROR(4); SKIP(99) END; 70233000
|
|
END; 70234000
|
|
END OF TYPEDECL; 70235000
|
|
70236000
|
|
70237000
|
|
PROCEDURE FIELDLIST(RECTAB,FIRSTADDR,LASTADDR); 70238000
|
|
VALUE RECTAB,FIRSTADDR; 70239000
|
|
INTEGER RECTAB,FIRSTADDR,LASTADDR; 70240000
|
|
BEGIN 70241000
|
|
INTEGER ARRAY ILIST[0:LISTLENGTH]; 70242000
|
|
INTEGER LISTINX; 70243000
|
|
INTEGER CASETYPE,ADDR,MAXADDR,INDEX,CTYPE,TX,SX,T1,T3,LLIM,ULIM,I; 70244000
|
|
BOOLEAN FIRST; 70245000
|
|
REAL CVAL; 70246000
|
|
LABEL CASETYPEID,CASEPART,EXIT; 70247000
|
|
70248000
|
|
ADDR:=FIRSTADDR; 70249000
|
|
DO BEGIN 70250000
|
|
WHILE CURSY=SEMICOLON DO INSYMBOL; 70251000
|
|
IF CURSY=CASESY THEN GO TO CASEPART; 70252000
|
|
IF CURSY=IDENTIFIER THEN 70253000
|
|
BEGIN 70254000
|
|
LISTINX:=0; FIRST:=TRUE; 70255000
|
|
DO BEGIN 70256000
|
|
IF FIRST THEN FIRST:=FALSE ELSE INSYMBOL; 70257000
|
|
IF CURSY=IDENTIFIER THEN 70258000
|
|
BEGIN 70259000
|
|
IF LISTINX}LISTLENGTH THEN BEGIN ERROR(37); LISTINX:=0 END; 70260000
|
|
LISTINX:=LISTINX+1; 70261000
|
|
NEWNAME(CURNAME1,CURNAME2,RECTAB); 70262000
|
|
ILIST[LISTINX]:=THISINDEX; 70263000
|
|
INSYMBOL; 70264000
|
|
END ELSE 70265000
|
|
BEGIN ERROR(9); 70266000
|
|
IF CURSY!COMMA THEN INSYMBOL; 70267000
|
|
END; 70268000
|
|
END UNTIL CURSY!COMMA; 70269000
|
|
IF CURSY!COLON THEN BEGIN ERROR(26); SKIP(COLON) END; 70270000
|
|
INSYMBOL; 70271000
|
|
TYPEDECL(TX,SX); 70272000
|
|
IF TX>0 THEN IF TYPETAB1[TX].FORM}FILES THEN ERROR(57); 70273000
|
|
T3.IDCLASS:=VAR; T3.TYPE:=TX; 70274000
|
|
FOR I:=1 STEP 1 UNTIL LISTINX DO 70275000
|
|
BEGIN 70276000
|
|
T3.INFO:=ADDR; ADDR:=MIN(ADDR+SX,1024); 70277000
|
|
NAMETAB3[RECTAB,ILIST[I]]:=T3; 70278000
|
|
END; 70279000
|
|
END; 70280000
|
|
END UNTIL CURSY!SEMICOLON; 70281000
|
|
LASTADDR:=ADDR; 70282000
|
|
GO TO EXIT; 70283000
|
|
70284000
|
|
CASEPART: 70285000
|
|
LISTINX:=0; LASTADDR:=ADDR; INDEX:=-1; 70286000
|
|
INSYMBOL; 70287000
|
|
IF CURSY=IDENTIFIER THEN 70288000
|
|
BEGIN 70289000
|
|
SEARCH; 70290000
|
|
IF FOUND AND THISID.IDCLASS=TYPES THEN GO TO CASETYPEID; 70291000
|
|
NEWNAME(CURNAME1,CURNAME2,RECTAB); INDEX:=THISINDEX; 70292000
|
|
INSYMBOL; 70293000
|
|
IF CURSY!COLON THEN ERROR(26); 70294000
|
|
INSYMBOL; 70295000
|
|
IF CURSY=IDENTIFIER THEN 70296000
|
|
BEGIN 70297000
|
|
SEARCH; 70298000
|
|
IF FOUND THEN 70299000
|
|
BEGIN 70300000
|
|
IF THISID.IDCLASS=TYPES THEN 70301000
|
|
BEGIN 70302000
|
|
CASETYPEID: CASETYPE:=THISID.TYPE; T1:=TYPETAB1[CASETYPE]; 70303000
|
|
LLIM:=TYPETAB2[CASETYPE]; ULIM:=TYPETAB3[CASETYPE]; 70304000
|
|
IF T1.FORM>CHAR THEN ERROR(48); 70305000
|
|
IF INDEX}0 THEN 70306000
|
|
BEGIN 70307000
|
|
T3.IDCLASS:=VAR; T3.TYPE:=CASETYPE; T3.INFO:=ADDR; 70308000
|
|
ADDR:=LASTADDR:=ADDR+1; NAMETAB3[RECTAB,INDEX]:=T3; 70309000
|
|
END; 70310000
|
|
INSYMBOL; 70311000
|
|
END ELSE BEGIN ERROR(7); SKIP(OFSY) END; 70312000
|
|
END ELSE BEGIN ERROR(1); SKIP(OFSY) END; 70313000
|
|
END ELSE BEGIN ERROR(9); SKIP(OFSY) END; 70314000
|
|
END ELSE BEGIN ERROR(9); SKIP(OFSY) END; 70315000
|
|
IF CURSY!OFSY THEN BEGIN ERROR(18); SKIP(RPAR) END; 70316000
|
|
IF CURSY=OFSY THEN INSYMBOL; 70317000
|
|
IF CASETYPE=0 THEN BEGIN LLIM:=-MAXINT; ULIM:=MAXINT END; 70318000
|
|
DO BEGIN 70319000
|
|
WHILE CURSY=SEMICOLON DO INSYMBOL; 70320000
|
|
IF CURSY{CHARCONST OR CURSY=PLUS OR CURSY=MINUS THEN 70321000
|
|
BEGIN 70322000
|
|
FIRST:=TRUE; 70323000
|
|
DO BEGIN 70324000
|
|
IF FIRST THEN FIRST:=FALSE ELSE INSYMBOL; 70325000
|
|
CONSTANT(CVAL,CTYPE); 70326000
|
|
IF CTYPE>0 THEN 70327000
|
|
BEGIN 70328000
|
|
IF CASETYPE=0 THEN CASETYPE:=CTYPE ELSE 70329000
|
|
IF CVAL<LLIM OR CVAL>ULIM THEN ERROR(14) ELSE 70330000
|
|
CHECKTYPES(CASETYPE,CTYPE); 70331000
|
|
IF LISTINX}LISTLENGTH THEN BEGIN ERROR(30); LISTINX:=0 END; 70332000
|
|
LISTINX:=LISTINX+1; 70333000
|
|
ILIST[LISTINX]:=CVAL; I:=1; 70334000
|
|
WHILE ILIST[I]!CVAL DO I:=I+1; 70335000
|
|
IF I<LISTINX THEN ERROR(31); 70336000
|
|
END; 70337000
|
|
END UNTIL CURSY!COMMA; 70338000
|
|
IF CURSY!COLON THEN BEGIN ERROR(26); SKIP(LPAR) END; 70339000
|
|
IF CURSY=COLON THEN INSYMBOL; 70340000
|
|
IF CURSY=LPAR THEN 70341000
|
|
BEGIN 70342000
|
|
INSYMBOL; FIELDLIST(RECTAB,ADDR,MAXADDR); 70343000
|
|
IF MAXADDR>LASTADDR THEN LASTADDR:=MAXADDR; 70344000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(RPAR) END; 70345000
|
|
INSYMBOL; 70346000
|
|
END ELSE ERROR(58); 70347000
|
|
END; 70348000
|
|
END UNTIL CURSY NEQ SEMICOLON; % 70349000
|
|
EXIT: 70350000
|
|
END OF FIELDLIST; 70351000
|
|
$ PAGE 80000000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%80001000
|
|
% %80002000
|
|
% %80003000
|
|
% %80004000
|
|
% PART 8: THE PROCEDURE BLOCK. %80005000
|
|
% -------------------- %80006000
|
|
% %80007000
|
|
% %80008000
|
|
% %80009000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%80010000
|
|
80011000
|
|
80012000
|
|
80013000
|
|
PROCEDURE DECLAREVARS(PARAM,TAB,FIRST,LAST,LEVEL); 80014000
|
|
VALUE PARAM,FIRST,LAST,LEVEL; 80015000
|
|
INTEGER ARRAY TAB[0]; 80016000
|
|
INTEGER FIRST,LAST,LEVEL; 80017000
|
|
BOOLEAN PARAM; 80018000
|
|
BEGIN 80019000
|
|
INTEGER LEVEL1000,TYP,NAM,NAMTAB,T1,I,J,RECSIZE; 80020000
|
|
BOOLEAN REALVAR,ARRAYVAR,FIRSTDIM,EXTFILE; 80021000
|
|
ALPHA FNAME; 80022000
|
|
INTEGER FNLENGTH,FNSTART; % 80023000
|
|
80024000
|
|
LEVEL1000:=LEVEL|1000; 80025000
|
|
FOR I:=FIRST STEP 1 UNTIL LAST DO 80026000
|
|
BEGIN 80027000
|
|
NAM:=TAB[I].[9:10]; NAMTAB:=NAMETAB3[LEVEL,NAM]; 80028000
|
|
TYP:=NAMTAB.TYPE; T1:=TYPETAB1[TYP]; 80029000
|
|
IF NAMTAB.IDCLASS GEQ FUNC THEN 80030000
|
|
BEGIN 80031000
|
|
IF REALVAR OR ARRAYVAR THEN 80032000
|
|
BEGIN 80033000
|
|
GEN(";",1,7); 80034000
|
|
REALVAR:=ARRAYVAR:=FALSE; 80035000
|
|
END; 80036000
|
|
IF NAMTAB.IDCLASS=FUNC THEN GEN("REAL",5,4); 80037000
|
|
GEN("PROCEDU",8,1); 80038000
|
|
GENID("V",LEVEL1000+NAM,5); GEN(";",1,7); 80039000
|
|
END ELSE 80040000
|
|
IF T1.STRUCT=0 THEN %*** SIMPLE TYPE *** 80041000
|
|
BEGIN 80042000
|
|
IF ARRAYVAR THEN BEGIN GEN(";",1,7); ARRAYVAR:=FALSE END; 80043000
|
|
IF REALVAR THEN GEN(",",1,7) ELSE 80044000
|
|
BEGIN GEN("REAL",5,4); REALVAR:=TRUE END; 80045000
|
|
GENID("V",LEVEL1000+NAM,5); 80046000
|
|
END ELSE 80047000
|
|
BEGIN 80048000
|
|
IF REALVAR THEN BEGIN GEN(";",1,7); REALVAR:=FALSE END; 80049000
|
|
IF T1.FORM<FILES THEN %*** ARRAY/RECORD *** 80050000
|
|
BEGIN 80051000
|
|
IF ARRAYVAR THEN GEN(",",1,7) ELSE 80052000
|
|
BEGIN GEN("ARRAY",6,3); ARRAYVAR:=TRUE END; 80053000
|
|
GENID("V",LEVEL1000+NAM,5); GEN("[",1,7); 80054000
|
|
FIRSTDIM:=TRUE; 80055000
|
|
DO BEGIN 80056000
|
|
IF FIRSTDIM THEN FIRSTDIM:=FALSE ELSE GEN(",",1,7); 80057000
|
|
GENINT(TYPETAB2[TYP]); 80058000
|
|
IF NOT PARAM THEN 80059000
|
|
BEGIN GEN(":",1,7); GENINT(TYPETAB3[TYP]) END; 80060000
|
|
TYP:=IF T1.FORM=ARRAYS THEN T1.ARRTYPE ELSE REALTYPE; 80061000
|
|
T1:=TYPETAB1[TYP]; 80062000
|
|
END UNTIL T1.STRUCT=0; 80063000
|
|
GEN("]",1,7); 80064000
|
|
END ELSE 80065000
|
|
BEGIN %*** FILE *** 80066000
|
|
IF REALVAR OR ARRAYVAR THEN 80067000
|
|
BEGIN GEN(";",1,7); REALVAR:=ARRAYVAR:=FALSE END; 80068000
|
|
IF T1.FORM=TEXTFILE AND NOT PARAM THEN 80069000
|
|
BEGIN 80070000
|
|
IF NUMFILES}MAXFILES THEN ERROR(97) 80071000
|
|
ELSE NUMFILES:=NUMFILES+1; 80072000
|
|
FILETAB[NUMFILES]:=NAM; 80073000
|
|
END; 80074000
|
|
EXTFILE:=FALSE; 80075000
|
|
FNAME:=NAMETAB1[LEVEL,NAM]; 80076000
|
|
FNLENGTH := FNAME.NAMELENGTH; FNSTART := 8-FNLENGTH; % 80077000
|
|
IF FNLENGTH LEQ 6 THEN % 80078000
|
|
BEGIN 80079000
|
|
FOR J:=1 STEP 1 UNTIL NUMEXTFILES DO 80080000
|
|
IF FNAME=EXTFILETAB[J] THEN EXTFILE:=TRUE; 80081000
|
|
END; 80082000
|
|
IF EXTFILE AND NOT PARAM THEN 80083000
|
|
BEGIN 80084000
|
|
IF NUMFILES GEQ MAXFILES THEN ERROR(97) 80085000
|
|
ELSE 80086000
|
|
NUMFILES := NUMFILES + 1; 80087000
|
|
FILETAB[NUMFILES] := -NAM - 1; 80088000
|
|
GEN("DEFINE",7,2); GENID("F",LEVEL1000+NAM,5); 80089000
|
|
GEN("=",1,7); 80090000
|
|
GEN(FNAME,FNLENGTH,FNSTART); % 80091000
|
|
GEN("#;",2,6); GEN("SAVE",5,4); GEN("FILE",5,4); 80092000
|
|
GEN(FNAME,FNLENGTH,FNSTART); % 80093000
|
|
END ELSE 80094000
|
|
BEGIN 80095000
|
|
GEN("FILE",5,4); GENID("F",LEVEL1000+NAM,5); 80096000
|
|
END; 80097000
|
|
IF NOT PARAM THEN 80098000
|
|
BEGIN 80099000
|
|
GEN(" DISK",6,3); GEN("SERIAL",7,2); 80100000
|
|
IF EXTFILE THEN 80101000
|
|
BEGIN 80102000
|
|
IF ALGOLCNT LSS 13 THEN WRITEALGOL; 80103000
|
|
GEN("[0:0]",5,3); 80104000
|
|
GEN(""",1,7); 80105000
|
|
GEN(FNAME,FNLENGTH,FNSTART); % 80106000
|
|
GEN(""",1,7); GEN("/",1,7); 80107000
|
|
IF ALGOLCNT<9 THEN WRITEALGOL; 80108000
|
|
GEN(""",1,7); GEN(USER,7,1); GEN(""",1,7); 80109000
|
|
END ELSE 80110000
|
|
BEGIN 80111000
|
|
GEN("[20:",4,4); GEN("300]",4,4); 80112000
|
|
END; 80113000
|
|
GEN("(1,",3,5); 80114000
|
|
RECSIZE:=IF T1.FORM=TEXTFILE THEN 10 ELSE 80115000
|
|
IF TYPETAB1[T1.FILETYPE].STRUCT=0 THEN 1 ELSE 80116000
|
|
TYPETAB3[T1.FILETYPE]-TYPETAB2[T1.FILETYPE]+1; 80117000
|
|
GENINT(RECSIZE); GEN(",",1,7); 80118000
|
|
IF RECSIZE=1 OR RECSIZE=10 THEN GENINT(150) 80119000
|
|
ELSE GENINT(RECSIZE); 80120000
|
|
IF ALGOLCNT LSS 10 THEN WRITEALGOL; 80121000
|
|
GEN(",SAVE",6,3); GEN("30",2,6); 80122000
|
|
GEN(");",2,6); 80123000
|
|
END ELSE GEN(";",1,7); 80124000
|
|
GEN("ARRAY",6,3); GENID("V",LEVEL1000+NAM,5); 80125000
|
|
GEN("[",1,7); 80126000
|
|
IF TYPETAB1[T1.FILETYPE].STRUCT=0 THEN 80127000
|
|
BEGIN 80128000
|
|
IF PARAM THEN GEN("0",1,7) ELSE GEN("0:0",3,5); 80129000
|
|
END ELSE 80130000
|
|
BEGIN 80131000
|
|
GENINT(TYPETAB2[T1.FILETYPE]); 80132000
|
|
IF NOT PARAM THEN 80133000
|
|
BEGIN GEN(":",1,7); GENINT(TYPETAB3[T1.FILETYPE]) END; 80134000
|
|
END; 80135000
|
|
GEN("];",2,6); 80136000
|
|
GEN("INTEGER",8,1); GENID("I",LEVEL1000+NAM,5); 80137000
|
|
GEN(";",1,7); 80138000
|
|
END; 80139000
|
|
END; 80140000
|
|
END OF LOOP; 80141000
|
|
IF REALVAR OR ARRAYVAR THEN GEN(";",1,7); 80142000
|
|
END OF DECLAREVARS; 80143000
|
|
80144000
|
|
80145000
|
|
PROCEDURE PARAMETERLIST; 80146000
|
|
BEGIN 80147000
|
|
INTEGER FIRSTPARAM,CURKIND,P1,PX,I,T; 80148000
|
|
BOOLEAN FIRST; 80149000
|
|
80150000
|
|
DEFINE NEWPARAM= 80151000
|
|
BEGIN 80152000
|
|
IF NUMPARAMS}MAXPARAMS THEN 80153000
|
|
BEGIN ERROR(70); NUMPARAMS:=MAXPARAMS-10 END; 80154000
|
|
NUMPARAMS:=NUMPARAMS+1; 80155000
|
|
END OF NEWPARAM#; 80156000
|
|
80157000
|
|
NEWPARAM; FIRSTPARAM:=NUMPARAMS; 80158000
|
|
IF CURSY=LPAR THEN 80159000
|
|
BEGIN 80160000
|
|
DO BEGIN 80161000
|
|
INSYMBOL; 80162000
|
|
IF CURSY=VARSY OR CURSY=FUNCSY OR CURSY=PROCSY THEN 80163000
|
|
BEGIN 80164000
|
|
CURKIND:=IF CURSY=VARSY THEN VAR ELSE 80165000
|
|
IF CURSY=FUNCSY THEN FUNC ELSE PROC; 80166000
|
|
INSYMBOL; 80167000
|
|
END ELSE CURKIND:=CONST; 80168000
|
|
FIRST:=TRUE; P1:=NUMPARAMS+1; 80169000
|
|
DO BEGIN 80170000
|
|
IF FIRST THEN FIRST:=FALSE ELSE INSYMBOL; 80171000
|
|
IF CURSY=IDENTIFIER THEN 80172000
|
|
BEGIN 80173000
|
|
NEWNAME(CURNAME1,CURNAME2,CURLEVEL+1); 80174000
|
|
PX:=THISINDEX; PX.PARAMKIND:=CURKIND; 80175000
|
|
PX.PARAMLEVEL:=CURLEVEL+1; 80176000
|
|
NEWPARAM; PARAMTAB[NUMPARAMS]:=PX; 80177000
|
|
END ELSE ERROR(9); 80178000
|
|
INSYMBOL; 80179000
|
|
END UNTIL CURSY!COMMA; 80180000
|
|
IF CURSY=COLON THEN 80181000
|
|
BEGIN 80182000
|
|
IF CURKIND=PROC THEN ERROR(90); 80183000
|
|
INSYMBOL; 80184000
|
|
IF CURSY=IDENTIFIER THEN 80185000
|
|
BEGIN 80186000
|
|
SEARCH; 80187000
|
|
IF FOUND THEN 80188000
|
|
BEGIN 80189000
|
|
IF THISID.IDCLASS=TYPES THEN 80190000
|
|
BEGIN 80191000
|
|
T3:=THISID.TYPE; 80192000
|
|
FOR I:=P1 STEP 1 UNTIL NUMPARAMS DO 80193000
|
|
PARAMTAB[I].PARAMTYPE:=T3; 80194000
|
|
IF CURKIND=CONST OR CURKIND=VAR THEN 80195000
|
|
BEGIN 80196000
|
|
T:=TYPETAB1[T3]; 80197000
|
|
IF T.FORM}FILES THEN 80198000
|
|
FOR I:=P1 STEP 1 UNTIL NUMPARAMS DO 80199000
|
|
PARAMTAB[I].PARAMFILE:=1; 80200000
|
|
IF T.STRUCT>0 AND CURKIND=CONST THEN ERROR(94); 80201000
|
|
END ELSE IF T.STRUCT>0 THEN ERROR(38); 80202000
|
|
END ELSE BEGIN ERROR(7); T3:=0 END; 80203000
|
|
END ELSE BEGIN ERROR(1); T3:=0 END; 80204000
|
|
END ELSE BEGIN ERROR(9); T3:=0 END; 80205000
|
|
INSYMBOL; 80206000
|
|
END ELSE 80207000
|
|
BEGIN 80208000
|
|
IF CURKIND!PROC THEN ERROR(7); 80209000
|
|
T3:=0; 80210000
|
|
END; 80211000
|
|
T3.IDCLASS:=CURKIND; T3.FORMAL:=1; 80212000
|
|
FOR I:=P1 STEP 1 UNTIL NUMPARAMS DO 80213000
|
|
NAMETAB3[CURLEVEL+1,PARAMTAB[I].PARAMNAME]:=T3; 80214000
|
|
END UNTIL CURSY!SEMICOLON; 80215000
|
|
IF CURSY!RPAR THEN 80216000
|
|
BEGIN ERROR(49); SKIP(RPAR); 80217000
|
|
IF CURSY=RPAR THEN INSYMBOL; 80218000
|
|
END ELSE INSYMBOL; 80219000
|
|
END; 80220000
|
|
PARAMTAB[FIRSTPARAM]:=NUMPARAMS-FIRSTPARAM; 80221000
|
|
END OF PARAMETERLIST; 80222000
|
|
80223000
|
|
80400000
|
|
PROCEDURE BLOCK; 80401000
|
|
BEGIN 80402000
|
|
INTEGER INDEX,CTYPE,NUMFORWARDS,T,T3,TX,I; 80403000
|
|
REAL CVAL; 80404000
|
|
ALPHA C1,C2; 80405000
|
|
BOOLEAN VALUEPARAMS,FUN; 80406000
|
|
LABEL START; 80407000
|
|
80408000
|
|
INTEGER LABTABTOP,CONSTTABTOP,TYPETABTOP,PARAMTABTOP,TOPREC, 80409000
|
|
FORMERFIRSTLAB,FIRSTFILE; 80410000
|
|
80411000
|
|
FORMERFIRSTLAB:=FIRSTLAB; 80412000
|
|
LABTABTOP:=NUMLABS; FIRSTLAB:=LABTABTOP+1; 80413000
|
|
CONSTTABTOP:=NUMCONSTS; 80414000
|
|
TYPETABTOP:=NUMTYPES; 80415000
|
|
PARAMTABTOP:=NUMPARAMS; 80416000
|
|
TOPREC:=LASTREC; 80417000
|
|
FIRSTFILE:=NUMFILES+1; 80418000
|
|
80419000
|
|
TOPLEVEL:=CURLEVEL; 80420000
|
|
IF CURLEVEL>1 THEN GEN("BEGIN",6,3); 80421000
|
|
START: 80422000
|
|
IF CURSY=LABELSY THEN %*** LABEL DECLARATION *** 80423000
|
|
BEGIN %************************* 80424000
|
|
GEN("LABEL",6,3); 80425000
|
|
DO BEGIN 80426000
|
|
INSYMBOL; 80427000
|
|
IF CURSY=INTCONST THEN 80428000
|
|
BEGIN 80429000
|
|
GENID("L",CURVAL,4); 80430000
|
|
IF CURVAL>9999 THEN ERROR(33); 80431000
|
|
FOR I:=FIRSTLAB STEP 1 UNTIL NUMLABS DO 80432000
|
|
IF LABTAB[I].LABVAL=CURVAL THEN ERROR(31); 80433000
|
|
IF NUMLABS}MAXLABS THEN BEGIN ERROR(34); NUMLABS:=0 END; 80434000
|
|
NUMLABS:=NUMLABS+1; 80435000
|
|
LABTAB[NUMLABS]:=CURVAL; 80436000
|
|
INSYMBOL; 80437000
|
|
END ELSE BEGIN ERROR(10); SKIP(COMMA) END; 80438000
|
|
IF CURSY=COMMA THEN GEN(",",1,7); 80439000
|
|
END UNTIL CURSY!COMMA; 80440000
|
|
IF CURSY!SEMICOLON THEN BEGIN ERROR(25); SKIP(SEMICOLON) END; 80441000
|
|
GEN(";",1,7); 80442000
|
|
IF SYMKIND[CURSY]!INITIAL THEN INSYMBOL; 80443000
|
|
END OF LABEL DECLARATION; 80444000
|
|
80445000
|
|
IF CURSY=CONSTSY THEN %*** CONSTANT DECLARATION *** 80446000
|
|
BEGIN %**************************** 80447000
|
|
INSYMBOL; 80448000
|
|
DO BEGIN 80449000
|
|
IF CURSY=IDENTIFIER THEN 80450000
|
|
BEGIN 80451000
|
|
NEWNAME(CURNAME1,CURNAME2,CURLEVEL); INDEX:=THISINDEX; 80452000
|
|
INSYMBOL; 80453000
|
|
IF CURSY=EQLSY THEN 80454000
|
|
BEGIN 80455000
|
|
INSYMBOL; CONSTANT(CVAL,CTYPE); 80456000
|
|
T3:=CTYPE; T3.IDCLASS:=CONST; 80457000
|
|
IF CVAL.[46:8]!0 OR CVAL>1023 THEN 80458000
|
|
BEGIN 80459000
|
|
IF NUMCONSTS}MAXCONSTS THEN 80460000
|
|
BEGIN ERROR(35); NUMCONSTS:=0 END; 80461000
|
|
NUMCONSTS:=NUMCONSTS+1; 80462000
|
|
CONSTTAB[NUMCONSTS]:=CVAL; 80463000
|
|
T3.INFO:=1023+NUMCONSTS; 80464000
|
|
END ELSE T3.INFO:=CVAL; 80465000
|
|
NAMETAB3[CURLEVEL,INDEX]:=T3; 80466000
|
|
END ELSE BEGIN ERROR(36); SKIP(SEMICOLON) END; 80467000
|
|
END ELSE BEGIN ERROR(9); SKIP(SEMICOLON) END; 80468000
|
|
IF CURSY!SEMICOLON THEN BEGIN ERROR(25); SKIP(SEMICOLON) END; 80469000
|
|
IF SYMKIND[CURSY]!INITIAL THEN INSYMBOL; 80470000
|
|
END UNTIL CURSY!IDENTIFIER; 80471000
|
|
END OF CONSTANT DECLARATION; 80472000
|
|
80473000
|
|
IF CURSY=TYPESY THEN %*** TYPE DECLARATION **** 80474000
|
|
BEGIN %************************* 80475000
|
|
INSYMBOL; 80476000
|
|
DO BEGIN 80477000
|
|
IF CURSY=IDENTIFIER THEN 80478000
|
|
BEGIN 80479000
|
|
NEWNAME(CURNAME1,CURNAME2,CURLEVEL); INDEX:=THISINDEX; 80480000
|
|
INSYMBOL; 80481000
|
|
IF CURSY=EQLSY THEN 80482000
|
|
BEGIN 80483000
|
|
INSYMBOL; 80484000
|
|
TYPEDECL(CTYPE,TX); 80485000
|
|
T3:=CTYPE; T3.IDCLASS:=TYPES; 80486000
|
|
NAMETAB3[CURLEVEL,INDEX]:=T3; 80487000
|
|
END ELSE BEGIN ERROR(36); SKIP(SEMICOLON) END; 80488000
|
|
END ELSE BEGIN ERROR(9); SKIP(SEMICOLON) END; 80489000
|
|
IF CURSY!SEMICOLON THEN BEGIN ERROR(25); SKIP(SEMICOLON) END; 80490000
|
|
IF SYMKIND[CURSY]!INITIAL THEN INSYMBOL; 80491000
|
|
END UNTIL CURSY!IDENTIFIER; 80492000
|
|
END OF TYPE DECLARATION; 80493000
|
|
80494000
|
|
IF CURSY=VARSY THEN %*** VARIABLE DECLARATION *** 80495000
|
|
BEGIN %**************************** 80496000
|
|
VARINDEX:=0; 80497000
|
|
DO BEGIN 80498000
|
|
FIRSTVAR:=VARINDEX+1; 80499000
|
|
DO BEGIN 80500000
|
|
IF CURSY=VARSY OR CURSY=COMMA THEN INSYMBOL; 80501000
|
|
IF CURSY=IDENTIFIER THEN 80502000
|
|
BEGIN 80503000
|
|
IF VARINDEX}LISTLENGTH THEN 80504000
|
|
BEGIN ERROR(37); VARINDEX:=0 END; 80505000
|
|
VARINDEX:=VARINDEX+1; 80506000
|
|
NEWNAME(CURNAME1,CURNAME2,CURLEVEL); 80507000
|
|
VARLIST[VARINDEX]:=THISINDEX; 80508000
|
|
INSYMBOL; 80509000
|
|
END ELSE BEGIN ERROR(9); SKIP(COLON) END; 80510000
|
|
END UNTIL CURSY!COMMA; 80511000
|
|
IF CURSY!COLON THEN BEGIN ERROR(26); SKIP(COLON) END; 80512000
|
|
IF CURSY=COLON THEN 80513000
|
|
BEGIN 80514000
|
|
INSYMBOL; 80515000
|
|
TYPEDECL(CTYPE,TX); 80516000
|
|
T3:=CTYPE; T3.IDCLASS:=VAR; 80517000
|
|
FOR I:=FIRSTVAR STEP 1 UNTIL VARINDEX DO 80518000
|
|
NAMETAB3[CURLEVEL,VARLIST[I]]:=T3; 80519000
|
|
END ELSE BEGIN ERROR(26); SKIP(SEMICOLON) END; 80520000
|
|
IF CURSY!SEMICOLON THEN BEGIN ERROR(25); SKIP(SEMICOLON) END; 80521000
|
|
IF SYMKIND[CURSY]!INITIAL THEN INSYMBOL; 80522000
|
|
END UNTIL CURSY!IDENTIFIER; 80523000
|
|
DECLAREVARS(FALSE,VARLIST,1,VARINDEX,CURLEVEL); 80524000
|
|
END OF VARIABLE DECLARATIONS; 80525000
|
|
80526000
|
|
IF NUMPNTRS>0 THEN 80527000
|
|
BEGIN 80528000
|
|
C1:=CURNAME1; C2:=CURNAME2; 80529000
|
|
FOR I:=1 STEP 1 UNTIL NUMPNTRS DO 80530000
|
|
BEGIN 80531000
|
|
CURNAME1:=PNTRTAB1[I]; CURNAME2:=PNTRTAB2[I]; 80532000
|
|
SEARCHTAB(CURLEVEL); 80533000
|
|
THISID:=NAMETAB3[CURLEVEL,THISINDEX]; 80534000
|
|
IF FOUND AND THISID.IDCLASS=TYPES THEN 80535000
|
|
TYPETAB1[PNTRTAB3[I]].POINTTYPE:=THISID.TYPE ELSE ERROR(62); 80536000
|
|
END; 80537000
|
|
CURNAME1:=C1; CURNAME2:=C2; NUMPNTRS:=0; 80538000
|
|
END; 80539000
|
|
80540000
|
|
WHILE CURSY=FUNCSY OR CURSY=PROCSY DO %*** PROC/FUNC DECLARATION ***80541000
|
|
BEGIN %*****************************80542000
|
|
FUN:=CURSY=FUNCSY; INSYMBOL; 80543000
|
|
IF CURSY=IDENTIFIER THEN 80544000
|
|
BEGIN 80545000
|
|
SEARCHTAB(CURLEVEL); 80546000
|
|
THISID:=NAMETAB3[CURLEVEL,THISINDEX]; 80547000
|
|
IF FOUND AND THISID.IDCLASS}PROC THEN 80548000
|
|
BEGIN 80549000
|
|
INDEX:=THISINDEX; 80550000
|
|
IF THISID.FORWARDDEF=1 THEN 80551000
|
|
BEGIN 80552000
|
|
NAMETAB3[THISLEVEL,THISINDEX].FORWARDDEF:=0; 80553000
|
|
NUMFORWARDS:=NUMFORWARDS-1; 80554000
|
|
IF(THISID.IDCLASS=PROC AND FUN)OR 80555000
|
|
(THISID.IDCLASS=FUNC AND NOT FUN) THEN ERROR(43); 80556000
|
|
INSYMBOL; 80567000
|
|
END ELSE BEGIN ERROR(2); SKIP(SEMICOLON) END; 80568000
|
|
END ELSE 80569000
|
|
BEGIN 80570000
|
|
NEWNAME(CURNAME1,CURNAME2,CURLEVEL); INDEX:=THISINDEX; 80571000
|
|
T3:=0; T3.INFO:=NUMPARAMS+1; 80572000
|
|
T3.IDCLASS:=IF FUN THEN FUNC ELSE PROC; 80573000
|
|
NAMETAB3[CURLEVEL,INDEX]:=T3; 80574000
|
|
INSYMBOL; PARAMETERLIST; 80575000
|
|
IF CURSY=COLON THEN 80576000
|
|
BEGIN 80577000
|
|
IF NOT FUN THEN ERROR(48); 80578000
|
|
INSYMBOL; 80579000
|
|
IF CURSY=IDENTIFIER THEN 80580000
|
|
BEGIN 80581000
|
|
SEARCH; 80582000
|
|
IF FOUND THEN 80583000
|
|
BEGIN 80584000
|
|
IF THISID.IDCLASS=TYPES THEN 80585000
|
|
BEGIN 80586000
|
|
T:=TYPETAB1[THISID.TYPE]; 80587000
|
|
IF T.FORM{ALFA OR T.FORM=POINTERS THEN 80588000
|
|
BEGIN 80589000
|
|
NAMETAB3[CURLEVEL,INDEX].TYPE:=THISID.TYPE; 80590000
|
|
END ELSE ERROR(38); 80591000
|
|
END ELSE ERROR(7); 80592000
|
|
END ELSE ERROR(1); 80593000
|
|
END ELSE ERROR(9); 80594000
|
|
INSYMBOL; 80595000
|
|
END ELSE IF FUN THEN 80596000
|
|
BEGIN ERROR(26); SKIP(SEMICOLON) END; 80597000
|
|
END; 80598000
|
|
END ELSE BEGIN ERROR(9); SKIP(SEMICOLON) END; 80599000
|
|
IF CURSY!SEMICOLON THEN BEGIN ERROR(25); SKIP(SEMICOLON) END; 80600000
|
|
IF FUN THEN GEN("FUNCTN",7,2) ELSE 80601000
|
|
GEN("PROCEDU",8,1); GENID("V",1000|CURLEVEL+INDEX,5); 80602000
|
|
T:=NAMETAB3[CURLEVEL,INDEX].INFO; TX:=T+PARAMTAB[T]; 80603000
|
|
IF TX>T THEN 80604000
|
|
BEGIN 80605000
|
|
GEN("(",1,7); 80606000
|
|
FOR I:=T+1 STEP 1 UNTIL TX DO 80607000
|
|
BEGIN GENID("V",1000|(CURLEVEL+1)+PARAMTAB[I].PARAMNAME,5); 80608000
|
|
IF BOOLEAN(PARAMTAB[I].PARAMFILE) THEN 80609000
|
|
BEGIN 80610000
|
|
GEN(",",1,7); 80611000
|
|
GENID("F",1000|(CURLEVEL+1)+PARAMTAB[I].PARAMNAME,5); 80612000
|
|
GEN(",",1,7); 80613000
|
|
GENID("I",1000|(CURLEVEL+1)+PARAMTAB[I].PARAMNAME,5); 80614000
|
|
END; 80615000
|
|
IF I LSS TX THEN GEN(",",1,7); 80616000
|
|
END; 80617000
|
|
GEN(");",2,6); 80618000
|
|
VALUEPARAMS:=FALSE; 80619000
|
|
FOR I:=T+1 STEP 1 UNTIL TX DO 80620000
|
|
IF PARAMTAB[I].PARAMKIND=CONST THEN 80621000
|
|
BEGIN 80622000
|
|
IF NOT VALUEPARAMS THEN 80623000
|
|
BEGIN GEN("VALUE",6,3); 80624000
|
|
VALUEPARAMS:=TRUE; 80625000
|
|
END ELSE GEN(",",1,7); 80626000
|
|
GENID("V",1000|(CURLEVEL+1)+PARAMTAB[I].PARAMNAME,5); 80627000
|
|
END; 80628000
|
|
IF VALUEPARAMS THEN GEN(";",1,7); 80629000
|
|
DECLAREVARS(TRUE,PARAMTAB,T+1,TX,CURLEVEL+1); 80630000
|
|
END ELSE GEN(";",1,7); 80631000
|
|
80632000
|
|
INSYMBOL; 80633000
|
|
IF CURNAME1="7FORWAR" AND CURNAME2="D" THEN 80634000
|
|
BEGIN 80635000
|
|
NAMETAB3[CURLEVEL,INDEX].FORWARDDEF:=1; 80636000
|
|
NUMFORWARDS:=NUMFORWARDS+1; 80637000
|
|
GEN("FORWARD",8,1); 80638000
|
|
INSYMBOL; 80639000
|
|
END ELSE 80640000
|
|
BEGIN 80641000
|
|
CURLEVEL:=CURLEVEL+1; 80642000
|
|
IF CURLEVEL}LASTREC THEN ERROR(55); 80643000
|
|
BLOCKTAB[CURLEVEL]:=NUMBLOCKS:=NUMBLOCKS+1; 80644000
|
|
T:=CURFUNC; CURFUNC:=IF FUN THEN INDEX ELSE -1; 80645000
|
|
BLOCK; %*** COMPILE PROCEDURE BODY *** 80646000
|
|
REPLACE POINTER(NAMETAB1[CURLEVEL,*]) BY 0 80647000
|
|
FOR MAXNAMES+1 WORDS; 80648000
|
|
CURLEVEL:=CURLEVEL-1; CURFUNC:=T; 80649000
|
|
TOPLEVEL:=CURLEVEL; 80650000
|
|
END; 80651000
|
|
IF CURSY!SEMICOLON THEN BEGIN ERROR(25); SKIP(SEMICOLON) END; 80652000
|
|
GEN(";",1,7); 80653000
|
|
IF SYMKIND[CURSY]!INITIAL THEN INSYMBOL; 80654000
|
|
END OF PROCEDURE DECLARATION; 80655000
|
|
80656000
|
|
80657000
|
|
IF NUMFORWARDS>0 THEN ERROR(44); 80658000
|
|
GEN("INTEGER",8,1); 80659000
|
|
FOR I:=1 STEP 1 UNTIL MAXTEMPS DO 80660000
|
|
BEGIN GENID("T",I,2); 80661000
|
|
IF I<MAXTEMPS THEN GEN(",",1,7) ELSE GEN(";",1,7); 80662000
|
|
END; 80663000
|
|
IF CURSY!BEGINSY THEN 80664000
|
|
BEGIN ERROR(39); 80665000
|
|
WHILE SYMKIND[CURSY]!INITIAL DO 80666000
|
|
BEGIN INSYMBOL; SKIP(SEMICOLON) END; 80667000
|
|
IF(CURSY=TYPESY)OR(CONSTSY{CURSY AND CURSY{PROCSY)THEN 80668000
|
|
GO TO START; 80669000
|
|
END; 80670000
|
|
IF CURLEVEL=1 THEN 80671000
|
|
BEGIN 80672000
|
|
GEN("INIT(",5,3); 80673000
|
|
IF INPUTDECL THEN GEN("TRUE",4,4) ELSE GEN("FALSE",5,3); 80674000
|
|
GEN(");",2,6); 80675000
|
|
END; 80676000
|
|
FOR I:=FIRSTFILE STEP 1 UNTIL NUMFILES DO 80677000
|
|
IF FILETAB[I] LSS 0 THEN 80678000
|
|
BEGIN 80679000
|
|
GEN("CHFIL(",6,2); 80680000
|
|
GENID("F",1000|CURLEVEL-FILETAB[I]-1,5); 80681000
|
|
GEN(");",2,6); 80682000
|
|
END 80683000
|
|
ELSE 80684000
|
|
BEGIN 80685000
|
|
GENID("I",1000|CURLEVEL+FILETAB[I],5); 80686000
|
|
GEN(",",1,7); GEN("BUFSIZE",7,1); GEN(":=80;",5,3); 80687000
|
|
END; 80688000
|
|
NUMFILES:=FIRSTFILE-1; 80689000
|
|
80690000
|
|
COMPSTAT; %*** COMPILE STATEMENT PART *** 80691000
|
|
80692000
|
|
FOR I:=LASTREC STEP 1 UNTIL TOPREC-1 DO 80693000
|
|
REPLACE POINTER(NAMETAB1[I,*]) BY 0 FOR MAXNAMES+1 WORDS; 80694000
|
|
FOR I:=FIRSTLAB STEP 1 UNTIL NUMLABS DO 80695000
|
|
IF LABTAB[I].LABDEF=0 THEN ERROR(93); 80696000
|
|
LASTREC:=TOPREC; 80697000
|
|
NUMLABS:=LABTABTOP; 80698000
|
|
FIRSTLAB:=FORMERFIRSTLAB; 80699000
|
|
NUMCONSTS:=CONSTTABTOP; 80700000
|
|
NUMTYPES:=TYPETABTOP; 80701000
|
|
NUMPARAMS:=PARAMTABTOP; 80702000
|
|
IF CURLEVEL>1 THEN GEN("END",4,5); 80703000
|
|
END OF BLOCK; 80704000
|
|
$PAGE 90000000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%90001000
|
|
% %90002000
|
|
% %90003000
|
|
% %90004000
|
|
% PART 9: THE MAIN PROGRAM. %90005000
|
|
% ----------------- %90006000
|
|
% %90007000
|
|
% %90008000
|
|
% %90009000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%90010000
|
|
90011000
|
|
90012000
|
|
INTEGER PROGNAMELENGTH; 90013000
|
|
ALPHA PROGNAME,ALGOLNAME; 90014000
|
|
90015000
|
|
ALGOLNAME:="PASC000"&ENTIER(TIME(4) MOD 10)[17:5:6]; 90016000
|
|
ALGOLNAME:=ALGOLNAME&ENTIER(TIME(4) DIV 7)[11:5:6]; 90017000
|
|
ALGOLNAME:=ALGOLNAME&ENTIER(TIME(4) MOD 9)[5:5:6]; 90018000
|
|
USER:=TIME(-1); 90019000
|
|
FILL PASCALGOL WITH ALGOLNAME,USER; 90020000
|
|
BEGIN 90021000
|
|
FILE PASCRUN DISK SERIAL "PASCRUN"/"DISK" (2,10,150); 90022000
|
|
ARRAY BUF[0:9]; 90023000
|
|
LABEL EOF; 90024000
|
|
90025000
|
|
WHILE TRUE DO 90026000
|
|
BEGIN 90027000
|
|
READ(PASCRUN,9,BUF[*]) [EOF]; 90028000
|
|
WRITE(PASCALGOL,10,BUF[*]); 90029000
|
|
END; 90030000
|
|
EOF: 90031000
|
|
END OF TRANSFER OF RUN TIME SYSTEM; 90032000
|
|
CARDLENGTH:=72; 90033000
|
|
INITIALIZE; NEWCARD; 90034000
|
|
LISTOPTION:=CHECKOPTION:=TRUE; 90035000
|
|
C:=" "; INSYMBOL; 90036000
|
|
IF CURSY=PROGRAMSY THEN 90037000
|
|
BEGIN 90038000
|
|
INSYMBOL; 90039000
|
|
IF CURSY=IDENTIFIER THEN 90040000
|
|
BEGIN 90041000
|
|
PROGNAME:=CURNAME1.[35:36]; PROGNAMELENGTH:=MIN(6,CURLENGTH); 90042000
|
|
INSYMBOL; 90043000
|
|
IF CURSY=LPAR THEN 90044000
|
|
BEGIN 90045000
|
|
DO BEGIN 90046000
|
|
INSYMBOL; 90047000
|
|
IF CURSY=IDENTIFIER THEN 90048000
|
|
BEGIN 90049000
|
|
IF CURNAME1="50INPUT" THEN INPUTDECL:=TRUE ELSE 90050000
|
|
IF CURNAME1="6OUTPUT" THEN OUTPUTDECL:=TRUE ELSE 90051000
|
|
BEGIN 90052000
|
|
IF CURLENGTH>6 THEN ERROR(77); 90053000
|
|
NUMEXTFILES:=NUMEXTFILES+1; 90054000
|
|
IF NUMEXTFILES{MAXEXTFILES THEN 90055000
|
|
EXTFILETAB[NUMEXTFILES]:=CURNAME1 ELSE 90056000
|
|
IF NUMEXTFILES=MAXEXTFILES+1 THEN ERROR(73); 90057000
|
|
END; 90058000
|
|
END ELSE ERROR(9); 90059000
|
|
INSYMBOL; 90060000
|
|
END UNTIL CURSY!COMMA; 90061000
|
|
IF CURSY!RPAR THEN BEGIN ERROR(46); SKIP(SEMICOLON) END; 90062000
|
|
IF CURSY=RPAR THEN INSYMBOL; 90063000
|
|
IF CURSY!SEMICOLON THEN BEGIN ERROR(25); SKIP(SEMICOLON) END; 90064000
|
|
END ELSE BEGIN ERROR(58); SKIP(SEMICOLON) END; 90065000
|
|
END ELSE BEGIN ERROR(9); SKIP(SEMICOLON) END; 90066000
|
|
END ELSE BEGIN ERROR(75); SKIP(SEMICOLON) END; 90067000
|
|
INSYMBOL; 90068000
|
|
CURLEVEL:=1; 90069000
|
|
LASTREC:=MAXTABLES+1; 90070000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%90071000
|
|
% %90072000
|
|
BLOCK; % COMPILE USER PROGRAM. %90073000
|
|
% %90074000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%90075000
|
|
IF CURSY!DOT THEN 90076000
|
|
BEGIN 90077000
|
|
ERROR(76); 90078000
|
|
DO BLOCK UNTIL CURSY=DOT; 90079000
|
|
END; 90080000
|
|
IF FALSE THEN 90081000
|
|
BEGIN 90082000
|
|
ENDOFINPUT: ERROR(87); CHARCNT:=-1; 90083000
|
|
WRITE(LINES,TERMMESS); 90084000
|
|
END; 90085000
|
|
IF LISTOPTION AND CHARCNT}0 THEN PRINTLINE; 90086000
|
|
IF ERRINX>0 THEN PRINTERRORS; 90087000
|
|
WRITE(LINES[DBL]); 90088000
|
|
WRITE(LINES[DBL]); 90089000
|
|
IF NUMERRS=0 THEN 90090000
|
|
BEGIN 90091000
|
|
ARRAY ZIPARRAY[0:19], Z[0:0]; 90092000
|
|
POINTER ZIPPNT; 90093000
|
|
90094000
|
|
DEFINE ZIPTEXT(TEXT,L)= 90095000
|
|
BEGIN 90096000
|
|
Z[0]:=TEXT; 90097000
|
|
REPLACE ZIPPNT:ZIPPNT BY POINTER(Z[*])+(8-L) FOR L; 90098000
|
|
END#; 90099000
|
|
90100000
|
|
PROCEDURE ZIPNUM(N); % TRANSFERS A NUMBER TO THE ZIP BUFFER. 90101000
|
|
VALUE N; INTEGER N; 90102000
|
|
IF N{9 THEN ZIPTEXT(N,1) ELSE 90103000
|
|
BEGIN ZIPNUM(N DIV 10); ZIPTEXT(ENTIER(N MOD 10),1) END; 90104000
|
|
90105000
|
|
WRITEALGOL; 90106000
|
|
WRITE(PASCALGOL,LASTLINE); 90107000
|
|
LOCK(PASCALGOL,SAVE); 90108000
|
|
ZIPPNT:=POINTER(ZIPARRAY[*]); 90109000
|
|
REPLACE ZIPPNT BY " " FOR 20 WORDS; 90110000
|
|
WRITE(LINES,NOERRORS); 90111000
|
|
ZIPTEXT("CC ",3); ZIPTEXT("COMPILE",7); 90112000
|
|
ZIPTEXT(" ",1); ZIPTEXT(PROGNAME,PROGNAMELENGTH); 90113000
|
|
ZIPTEXT("/",1); ZIPTEXT(USER,7); 90114000
|
|
ZIPTEXT(" XALGOL",7); ZIPTEXT(" ",1); 90115000
|
|
IF SAVEFACTOR>0 THEN ZIPTEXT("LIBRARY",7); 90116000
|
|
IF SAVEFACTOR<0 THEN ZIPTEXT("SYNTAX",6); 90117000
|
|
ZIPTEXT(";",1); 90118000
|
|
ZIPTEXT("XALGOL",6); ZIPTEXT(" FILE",5); 90119000
|
|
ZIPTEXT(" CARD=",6); ZIPTEXT(ALGOLNAME,7); 90120000
|
|
ZIPTEXT("/",1); ZIPTEXT(USER,7); 90121000
|
|
ZIPTEXT(" SERIAL",7); ZIPTEXT(";",1); 90122000
|
|
IF SAVEFACTOR>0 THEN 90123000
|
|
BEGIN 90124000
|
|
ZIPTEXT("SAVE=",5); ZIPNUM(SAVEFACTOR); 90125000
|
|
ZIPTEXT(";",1); 90126000
|
|
END; 90127000
|
|
ZIPTEXT("END.",4); 90128000
|
|
ZIP WITH ZIPARRAY[*]; 90129000
|
|
END OF COMPILER ZIP ELSE 90130000
|
|
BEGIN 91001000
|
|
INTEGER I; 91002000
|
|
SWITCH FORMAT ERRORMESS1 := 91003000
|
|
(" 0 *** COMPILER ERROR *** CONTACT THE COMPUTER CENTRE."), 91004000
|
|
(" 1 IDENTIFIER NOT DEFINED."), 91005000
|
|
(" 2 IDENTIFIER ALREADY DEFINED."), 91006000
|
|
(" 3 WRONG NUMBER OF PARAMETERS."), 91007000
|
|
(" 4 SYNTAX ERROR."), 91008000
|
|
(" 5 VARIABLE NOT ACCESSIBLE (HARDWARE RESTRICTION)."), 91009000
|
|
(" 6 STRINGS MAY NOT BE CONTINUED FROM ONE CARD TO ANOTHER."), 91010000
|
|
(" 7 A TYPE EXPECTED."), 91011000
|
|
(" 8 VARIABLE EXPECTED."), 91012000
|
|
(" 9 IDENTIFIER EXPECTED."), 91013000
|
|
(" 10 INTEGER CONSTANT EXPECTED."), 91014000
|
|
(" 11 CONSTANT OF OTHER TYPE THAN EXPECTED."), 91015000
|
|
(" 12 VARIABLE OF ILLEGAL TYPE."), 91016000
|
|
(" 13 UNRECOGNIZABLE STATEMENT."), 91017000
|
|
(" 14 CONSTANT TOO BIG OR TO SMALL."), 91018000
|
|
(" 15 UNDEFINED LABEL."), 91019000
|
|
(" 16 FOR- AND CASE-STATEMENTS NESTED TOO DEEP."), 91020000
|
|
(" 17 EXPRESSION IS OF WRONG TYPE."), 91021000
|
|
(" 18 """OF""" EXPECTED."), 91022000
|
|
(" 19 """DO""" EXPECTED."), 91023000
|
|
(" 20 """ELSE""" WITHOUT CORRESPONDING """THEN"""."), 91024000
|
|
(" 21 ILLEGAL TERMINATION OF STATEMENT."), 91025000
|
|
(" 22 """UNTIL""" EXPECTED."), 91026000
|
|
(" 23 """TO"""/"""DOWNTO""" EXPECTED."), 91027000
|
|
(" 24 """END""" EXPECTED."), 91028000
|
|
(" 25 """;""" EXPECTED."), 91029000
|
|
(" 26 """:""" EXPECTED."), 91030000
|
|
(" 27 """THEN""" EXPECTED."), 91031000
|
|
(" 28 """:=""" EXPECTED."), 91032000
|
|
(" 29 ONLY NUMBERS MAY BE SIGNED."), 91033000
|
|
(" 30 TOO MANY CASES."), 91034000
|
|
(" 31 LABEL USED MORE THAN ONCE."), 91035000
|
|
(" 32 CONSTANT EXPECTED."), 91036000
|
|
(" 33 LABEL NOT IN RANGE 0..9999."), 91037000
|
|
(" 34 TOO MANY LABELS DECLARED."), 91038000
|
|
(" 35 TOO MANY CONSTANTS DECLARED."), 91039000
|
|
(" 36 """=""" EXPECTED."), 91040000
|
|
(" 37 THE LIST IS TOO LONG."), 91041000
|
|
(" 38 INVALID TYPE FOR A FUNCTION."), 91042000
|
|
(" 39 """BEGIN""" EXPECTED."), 91043000
|
|
(" 40 TOO MANY IDENTIFIERS DECLARED."), 91044000
|
|
(" 41 ALFA CONSTANTS MAY NOT BE LONGER THAN 7 CHARACTERS."), 91045000
|
|
(" 42 EXPRESSION IS NOT OF TYPE BOOLEAN."), 91046000
|
|
(" 43 NOT PROPER FORWARD DECLARATION."), 91047000
|
|
(" 44 UNSATISFIED FORWARD DECLARATION."), 91048000
|
|
(" 45 TOO MANY DIFFERENT TYPES DECLARED."), 91049000
|
|
(" 46 """)""" EXPECTED."), 91050000
|
|
(" 47 """[""" EXPECTED."), 91051000
|
|
(" 48 A SIMPLE TYPE EXPECTED."), 91052000
|
|
(" 49 """ARRAY OF ARRAY""" AND """ARRAY OF RECORD""" ILLEGAL", 91053000
|
|
" AS FILE TYPE."), 91054000
|
|
(" 50 """FILE OF FILE""" IS ILLEGAL."), 91055000
|
|
(" 51 SET BOUNDRY IS TOO BIG OR TOO SMALL."), 91056000
|
|
(" 52 TOO MANY UNDECLARED POINTERS."), 91057000
|
|
(" 53 """..""" EXPECTED."), 91058000
|
|
(" 54 FIRST VALUE IS GREATER THAN SECOND VALUE."), 91059000
|
|
(" 55 TOO MANY RECORDS DECLARED AT ONE TIME."), 91060000
|
|
(" 56 THE RECORD CONTAINS MORE THEN 1023 WORDS."), 91061000
|
|
(" 57 FILES NOT ALLOWED IN RECORDS."), 91062000
|
|
(" 58 """(""" EXPECTED."), 91063000
|
|
(" 59 """]""" EXPECTED."); 91064000
|
|
91065000
|
|
SWITCH FORMAT ERRORMESS2 := 91066000
|
|
(" 60 """ARRAY OF FILE""" NOT ALLOWED."), 91067000
|
|
(" 61 RANGE OF INDEX IS GREATER THAN 1023."), 91068000
|
|
(" 62 UNSATISFIED POINTER DECLARATION."), 91069000
|
|
(" 63 EXPRESSION IS TOO LONG."), 91070000
|
|
(" 64 ILLEGAL OPERATOR FOR THIS TYPE OF EXPRESSION."), 91071000
|
|
(" 65 INTEGER EXPRESSION EXPECTED."), 91072000
|
|
(" 66 A SET EXPECTED."), 91073000
|
|
(" 67 PARAMETER OF ILLEGAL TYPE."), 91074000
|
|
(" 68 PROCEDURES NOT ALLOWED IN THIS CONTEXT."), 91075000
|
|
(" 69 ILLEGAL USE OF THIS TYPE OF IDENTIFIER."), 91076000
|
|
(" 70 TOO MANY PARAMETERS DECLARED IN THE PROGRAM."), 91077000
|
|
(" 71 """ARRAY OF CHAR""" EXPECTED."), 91078000
|
|
(" 72 WRONG TYPE OF SET EXPRESSION."), 91079000
|
|
(" 73 TOO MANY EXTERNAL FILES."), 91080000
|
|
(" 74 ILLEGAL IDENTIFIER FOR EXTERNAL FILE."), 91081000
|
|
(" 75 """PROGRAM""" EXPECTED."), 91082000
|
|
(" 76 """.""" EXPECTED AT END OF PROGRAM."), 91083000
|
|
(" 77 EXTERNAL FILE IDENTIFIER MAY NOT EXCEED 6 CHARACTERS."), 91084000
|
|
(" 78 ILLEGAL FILE PARAMETER."), 91085000
|
|
(" 79 ILLEGAL USE OF FILE HANDLING PROCEDURE."), 91086000
|
|
(" 80 TEXT-FILE EXPECTED."), 91087000
|
|
(" 81 POINTER VARIABLE EXPECTED."), 91088000
|
|
(" 82 ONLY VALUES OF TYPE REAL, INTEGER OR CHAR MAY BE READ."), 91089000
|
|
(" 83 VARIABLES IN RECORDS ILLEGAL IN THIS CONTEXT."), 91090000
|
|
(" 84 DISPLAY OVERFLOW."), 91091000
|
|
(" 85 READ AND WRITE MAY ONLY BE USED ON TEXT-FILES."), 91092000
|
|
(" 86 REFERENCED OBJECT IS TOO BIG."), 91093000
|
|
(" 87 END-OF-INPUT DISCOVERED."), 91094000
|
|
(" 88 CHARACTER ARRAY EXPECTED."), 91095000
|
|
(" 89 """,""" EXPECTED."), 91096000
|
|
(" 91 PROCEDURES MAY NOT HAVE ANY TYPE."), 91097000
|
|
(" 91 PARAMETER OF WRONG KIND."), 91098000
|
|
(" 92 ONLY COMPLETE ARRAYS AND RECORDS MAY BE TRANSMITTED."), 91099000
|
|
(" 93 DECLARED LABEL NOT USED."), 91100000
|
|
(" 94 PARAMETERS OF THIS TYPE SHOULD NOT BE VALUE PARAMETERS."), 91101000
|
|
(" 95 ASSIGNMENT OF STRUCTURED VARIABLES NOT IMPLIMENTED."), 91102000
|
|
(" 96 INPUT/OUPUT NOT DECLARED."), 91103000
|
|
(" 97 TOO MANY FILES IN USE."), 91104000
|
|
(" 98 RECORD IDENTIFIER EXPECTED."), 91105000
|
|
(" 99 UNRECOGNIZED ITEM."), 91106000
|
|
(); 91107000
|
|
91108000
|
|
91109000
|
|
WRITE(LINES,ERRORS,NUMERRS); 91110000
|
|
FOR I:=0 STEP 1 UNTIL 59 DO IF ERR[I] THEN 91111000
|
|
WRITE(LINES,ERRORMESS1[I]); 91112000
|
|
FOR I:=60 STEP 1 UNTIL 119 DO IF ERR[I] THEN 91113000
|
|
WRITE(LINES,ERRORMESS2[I-60]); 91114000
|
|
END OF ERROR MESSAGES; 91115000
|
|
IF XREFOPTION THEN 92001000
|
|
BEGIN 92002000
|
|
REPLACE POINTER(XREFLINE[*]) BY " " FOR 17 WORDS; 92003000
|
|
HEADING; 92004000
|
|
SORT(PRINTXREF,XREFFILE,0,XREFMAX,XREFCOMPARE,3,1000,6000); 92005000
|
|
END; 92006000
|
|
END OF B5700 PASCAL COMPILER COMPILER...................................99001000
|
|
END;END. LAST CARD IMAGE ON SOURCE TAPE FILE 99999999
|