1473 lines
		
	
	
	
		
			59 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			1473 lines
		
	
	
	
		
			59 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
12330 (*+81()
 | 
						|
12340 (**)
 | 
						|
12350 (*+04()
 | 
						|
12360 FUNCTION FLOAT(N: A68INT): REAL;
 | 
						|
12370     BEGIN FLOAT := SHRINK(N) (*THIS IS SLOPPY*) END;
 | 
						|
12380 ()+04*)
 | 
						|
12390 (*+25()   (*+31()   (*$P+  +)   ()+31+)    ()+25*)
 | 
						|
12400 (**)
 | 
						|
12410 (**)
 | 
						|
12420                (*LISTING*)
 | 
						|
12430                (*********)
 | 
						|
12440 (**)
 | 
						|
12450 (*+05()
 | 
						|
12460 PROCEDURE OPENLOADFILE(VAR F: LOADFILE; PARAM: INTEGER; WRITING: BOOLEAN);
 | 
						|
12470   VAR S: ARGSTRING;
 | 
						|
12480   PROCEDURE NAMEFILE(S: ARGSTRING; SU, SL: INTEGER; VAR F: ANYFILE); EXTERN;
 | 
						|
12490   FUNCTION GETARG(VAR S: ARGSTRING; SU, SL: INTEGER; I: INTEGER): BOOLEAN; EXTERN;
 | 
						|
12500     BEGIN
 | 
						|
12510     IF GETARG(S, 50 ,1, PARAM) THEN
 | 
						|
12520       NAMEFILE(S, 50, 1, F);
 | 
						|
12530     IF WRITING THEN REWRITE(F) ELSE RESET(F);
 | 
						|
12540     END;
 | 
						|
12550 PROCEDURE OPENTEXT(VAR F: TEXT; PARAM: INTEGER; WRITING: BOOLEAN);
 | 
						|
12560   VAR S: ARGSTRING;
 | 
						|
12570   PROCEDURE NAMEFILE(S: ARGSTRING; SU, SL: INTEGER; VAR F: ANYFILE); EXTERN;
 | 
						|
12580   FUNCTION GETARG(VAR S: ARGSTRING; SU, SL: INTEGER; I: INTEGER): BOOLEAN; EXTERN;
 | 
						|
12590     BEGIN
 | 
						|
12600     IF GETARG(S, 50, 1, PARAM) THEN
 | 
						|
12610       NAMEFILE(S, 50, 1, F);
 | 
						|
12620     IF WRITING THEN REWRITE(F) ELSE RESET(F);
 | 
						|
12630     END;
 | 
						|
12632 FUNCTION TIME: INTEGER; EXTERN;
 | 
						|
12634 PROCEDURE CTIME(VAR RESULT: TIMSTRING; SU, SL: INTEGER; CLOCK: INTEGER); EXTERN;
 | 
						|
12640 ()+05*)
 | 
						|
12650 (**)
 | 
						|
12660 (**)
 | 
						|
12670 PROCEDURE CHECKPAGE;
 | 
						|
12680   (*STARTS NEW PAGE IF LISTING IN PROGRESS AND OLD PAGE
 | 
						|
12690     EXHAUSTED*)
 | 
						|
12700     BEGIN
 | 
						|
12710     IF LSTCNT>LINESPERPAGE THEN
 | 
						|
12720       BEGIN
 | 
						|
12730       LSTCNT := 0;
 | 
						|
12740       IF PRGLIST IN PRAGFLGS THEN
 | 
						|
12750         BEGIN
 | 
						|
12760         LSTPAGE := LSTPAGE+1;
 | 
						|
12770         IF ONLINE THEN
 | 
						|
12780         BEGIN
 | 
						|
12782 (*-01() IF LSTPAGE<>1 THEN PAGE(LSTFILE); ()-01*)
 | 
						|
12790         WRITELN(LSTFILE, (*+01()'1',()+01*)
 | 
						|
12800                 'ALGOL68S COMPILER ',VERSIONNUM,
 | 
						|
12810         (*-04() (*-02() (*-05()DAT, ' ',()-05*) TIM, ()-02*) ()-04*) '             PAGE ', LSTPAGE:3);
 | 
						|
12820         WRITELN(LSTFILE (*+01(),' '()+01*));
 | 
						|
12830         END
 | 
						|
12840 (*-02() (*-04() (*-05()
 | 
						|
12850         ELSE  (*BATCH*)
 | 
						|
12860         BEGIN
 | 
						|
12862 (*-01() IF LSTPAGE<>1 THEN PAGE(LSTFILE); ()-01*)
 | 
						|
12870         WRITELN(OUTPUT, (*+01()'1',()+01*)
 | 
						|
12880                 'ALGOL68S COMPILER ',VERSIONNUM,
 | 
						|
12890         DAT, ' ', TIM, '             PAGE ', LSTPAGE:3);
 | 
						|
12900         WRITELN(OUTPUT, ' ');
 | 
						|
12910         END
 | 
						|
12920 ()-05*) ()-04*) ()-02*)
 | 
						|
12930         END
 | 
						|
12940       END;
 | 
						|
12950     END;
 | 
						|
12960 (**)
 | 
						|
12970 (**)
 | 
						|
12980 PROCEDURE INITIO;
 | 
						|
12990 (*+01()   VAR AW66: PW66; ()+01*)
 | 
						|
13000 (*+05()   TYPE STRING = PACKED ARRAY [1..12] OF CHAR;
 | 
						|
13010           VAR S: STRING;
 | 
						|
13020 ()+05*)
 | 
						|
13030     BEGIN
 | 
						|
13040     ERRDEV := FALSE;
 | 
						|
13050 (*+23()   NUMPARAMS:=0;  (* TO COUNT NO OF P-OP PARAMETERS OUTPUT TO LSTFILE *)  ()+23*)
 | 
						|
13060     LSTLINE := -1;  (*FOR FIRST TIME OF OUTSRC*)
 | 
						|
13070     LSTCNT := 100;         (*TO FORCE NEWPAGE*)
 | 
						|
13080     LSTPAGE := 0;
 | 
						|
13090 (*-03() (*-04() (*-05()
 | 
						|
13100     RESET(SOURCDECS);
 | 
						|
13110     REWRITE(LSTFILE);
 | 
						|
13120 ()-05*) ()-04*) ()-03*)
 | 
						|
13130 (*+03()
 | 
						|
13140 WRITE('SOURCE-FILE: ');
 | 
						|
13150 OPEN(SOURCDECS,'','SYMB',SEQRD);
 | 
						|
13160 WRITE('LIST-FILE: ');
 | 
						|
13170 OPEN(LSTFILE,'','DATA',SEQWR);
 | 
						|
13180 OPEN(OUTPUT,'TERMINAL','SYMB',SEQWR);
 | 
						|
13190 ()+03*)
 | 
						|
13200 (*+04()
 | 
						|
13210     RESET(SOURCDECS, 'SOURCDECS');
 | 
						|
13220     REWRITE(OUTPUT, 'CONSOLE');
 | 
						|
13230     REWRITE(LSTFILE, 'LSTFILE');
 | 
						|
13240 ()+04*)
 | 
						|
13250 (*+05()
 | 
						|
13260     OPENTEXT(SOURCDECS, 1, FALSE);
 | 
						|
13270     OPENTEXT(LSTFILE, 3, TRUE);
 | 
						|
13280 ()+05*)
 | 
						|
13290     SRCBUF[0]  := ' '; (*IT WILL NEVER BE WRITTEN TO AGAIN*)
 | 
						|
13300 (*+01()
 | 
						|
13310     LINELIMIT(OUTPUT, 100000);
 | 
						|
13320     AW66 := ASPTR(66B);
 | 
						|
13330     ONLINE := AW66^.JOPR=3;
 | 
						|
13340  ()+01*)
 | 
						|
13350 (*+02() ONLINE := TRUE; ()+02*)
 | 
						|
13360 (*+03() ONLINE := FILENR(LSTFILE)<>1; ()+03*)
 | 
						|
13370 (*+04() ONLINE := TRUE; ()+04*)
 | 
						|
13380 (*+05() ONLINE := TRUE; ()+05*)
 | 
						|
13390 (*+01() DATE(DAT); TIME(TIM); ()+01*)
 | 
						|
13392 (*+03() DATE(DAT); TIME(TIM); ()+03*)
 | 
						|
13394 (*+05() CTIME(TIM, 26, 1, TIME); TIM[25] := CHR(0); ()+05*)
 | 
						|
13400     END;
 | 
						|
13410 (**)
 | 
						|
13420 (**)
 | 
						|
13430 PROCEDURE OUTLST(LINE: INTEGER; VAR BUF: BUFFER; PTR: INTEGER);
 | 
						|
13440 (*FUNCTION: SEND A SINGLE RECORD TO THE LISTING DEVICE (AND
 | 
						|
13450     POSSIBLY THE ERROR DEVICE AS WELL). THE PRAGMAT NOLIST MAY BE
 | 
						|
13460     USED TO SUPPRESS THE PRINTING OF THE LISTING. IN THIS CASE,
 | 
						|
13470     NO ACTION IS TAKEN UNLESS THE LINE IS BEING SENT TO THE ERROR
 | 
						|
13480     DEVICE. ERROR LINES ARE ALWAYS TRANSMITTED.
 | 
						|
13490   INPUTS:
 | 
						|
13500     LINE  - THE LINE NUMBER; -VE IF NO NUMBER TO BE PRINTED
 | 
						|
13510     BUF   - BUFFER CONTAINING THE LINE TO BE PRINTED; USUALLY
 | 
						|
13520             SRCBUF OR ERRBUF
 | 
						|
13530     PTR   - NUMBER OF CHARACTERS IN BUF; USUALLY SRCPTR OR ERRPTR
 | 
						|
13540   GLOBALS:
 | 
						|
13550     PRAGFLGS
 | 
						|
13560     LSTCNT- THE NUMBER OF LINES ALREADY PRINTED ON THE CURRENT
 | 
						|
13570             PAGE
 | 
						|
13580     ERRDEV- TRUE IFF RECORD IS TO BE SENT TO ERROR DEVICE
 | 
						|
13590     SRCSTAT-THE VALUE OF SRCSTCH AT THE BEGINNING OF THE LINE
 | 
						|
13600 *)
 | 
						|
13610   VAR I: INTEGER;
 | 
						|
13620     BEGIN
 | 
						|
13630     IF ONLINE THEN
 | 
						|
13640     BEGIN
 | 
						|
13650     IF PRGLIST IN PRAGFLGS THEN
 | 
						|
13660       BEGIN
 | 
						|
13662 (*+01() WRITE(LSTFILE, ' '); ()+01*)
 | 
						|
13670       IF LINE>=0 THEN
 | 
						|
13680         WRITE(LSTFILE, SRCSTAT, ' ', LINE:5, ' ')
 | 
						|
13690       ELSE WRITE(LSTFILE, '        ');
 | 
						|
13700       FOR I := 0 TO PTR DO
 | 
						|
13710         WRITE(LSTFILE, BUF[I]);
 | 
						|
13720       WRITELN(LSTFILE);
 | 
						|
13730       LSTCNT := LSTCNT+1;
 | 
						|
13740       END;
 | 
						|
13750     IF ERRDEV THEN
 | 
						|
13760       BEGIN
 | 
						|
13770       IF LINE>=0 THEN
 | 
						|
13780         WRITE(OUTPUT, SRCSTAT, ' ', LINE:5, ' ')
 | 
						|
13790       ELSE WRITE(OUTPUT, '        ');
 | 
						|
13800       FOR I := 0 TO PTR DO
 | 
						|
13810         WRITE(OUTPUT, BUF[I]);
 | 
						|
13820       WRITELN(OUTPUT);
 | 
						|
13830       END
 | 
						|
13840     END
 | 
						|
13850 (*-02() (*-04() (*-05()
 | 
						|
13860     ELSE  (*BATCH*)
 | 
						|
13870     IF ERRDEV OR (PRGLIST IN PRAGFLGS) THEN
 | 
						|
13880       BEGIN
 | 
						|
13882 (*+01() WRITE(LSTFILE, ' '); ()+01*)
 | 
						|
13890       IF LINE >=0 THEN
 | 
						|
13900         WRITE(OUTPUT, SRCSTAT, ' ', LINE:5, ' ')
 | 
						|
13910       ELSE WRITE(OUTPUT, '        ');
 | 
						|
13920       FOR I := 1 TO PTR DO
 | 
						|
13930         WRITE(OUTPUT, BUF[I]);
 | 
						|
13940       WRITELN(OUTPUT);
 | 
						|
13950       LSTCNT := LSTCNT+1
 | 
						|
13960       END;
 | 
						|
13970 ()-05*) ()-04*) ()-02*)
 | 
						|
13980     END;
 | 
						|
13990 (**)
 | 
						|
14000 (**)
 | 
						|
14010                 (*ERROR HANDLING*)
 | 
						|
14020                 (****************)
 | 
						|
14030 (**)
 | 
						|
14040 PROCEDURE OUTERR(N: INTEGER; LEV: ERRLEV; LEX: PLEX);
 | 
						|
14050 (*FUNCTION: OUTPUT ERROR MESSAGE AND WRITE CHARACTER TO
 | 
						|
14060     APPROPRIATE POSITION IN ERRBUF.
 | 
						|
14070   INPUTS:
 | 
						|
14080     N - IDENTIFIES MESSAGE TO BE PRINTED
 | 
						|
14090     LEV - INDICATES WARNING OR ERROR
 | 
						|
14100   GLOBALS:
 | 
						|
14110     ERRLXPTR - POINTS TO ERRBUF POSITION JUST BEFORE START OF
 | 
						|
14120         OFFENDING LEXEME
 | 
						|
14130     ERRDEV, ERRNONBLANK, ERRBUF, ERRS, LSTCNT, PRAGFLGS
 | 
						|
14140 *)
 | 
						|
14150   VAR I: INTEGER;
 | 
						|
14160   PROCEDURE PRINTLEX(VAR F: TEXT);
 | 
						|
14170     VAR I: INTEGER;
 | 
						|
14180       BEGIN WITH LEX^ DO
 | 
						|
14190         BEGIN
 | 
						|
14200         WRITE(F, ' - ');
 | 
						|
14210         CASE LXTOKEN OF
 | 
						|
14220           TKTAG: (*NOTHING*);
 | 
						|
14230           TKBOLD: WRITE(F, '.');
 | 
						|
14240           TKSYMBOL: WRITE(F, '''');
 | 
						|
14250           END;
 | 
						|
14260         FOR I := 1 TO LXCOUNT*CHARPERWORD DO
 | 
						|
14270           IF STRNG[I]<>' ' THEN WRITE(F, STRNG[I]);
 | 
						|
14280         IF LXTOKEN=TKSYMBOL THEN WRITE(F, '''');
 | 
						|
14290         END
 | 
						|
14300       END;
 | 
						|
14310 (**)
 | 
						|
14320    PROCEDURE ERRMSG(VAR F: TEXT);
 | 
						|
14330       BEGIN
 | 
						|
14340       WRITE(F, '      ');
 | 
						|
14350       CASE LEV OF
 | 
						|
14360         ERRORR:  WRITE(F, 'ERROR   ');
 | 
						|
14370         WARNING: WRITE(F, 'WARNING ')
 | 
						|
14380         END;
 | 
						|
14390 (*+55() WRITE(F,N:3); ()+55*)
 | 
						|
14400 (*-55()
 | 
						|
14410       CASE N OF
 | 
						|
14420         (*ELX*)
 | 
						|
14430         3: WRITE(F, 'MISSING CLOSE QUOTE IN STRING-DENOTATION');
 | 
						|
14440         4: WRITE(F, 'MISSING CLOSE-PRAGMENT-SYMBOL');
 | 
						|
14450         5: WRITE(F, 'ILLEGAL SYMBOL');
 | 
						|
14460         6: WRITE(F, 'ILL-FORMED DENOTATION');
 | 
						|
14470         7: WRITE(F, 'STRAY STROP MARK');
 | 
						|
14480         8: WRITE(F, 'ILLEGAL CHARACTER');
 | 
						|
14490         9: WRITE(F, 'IDENTIFIER OR STRING-DENOTATION TOO ',
 | 
						|
14500                          'LONG, COMPLAIN TO CHL');
 | 
						|
14510        10: WRITE(F, 'DENOTATION OUT OF RANGE');
 | 
						|
14520       (*ESY*)
 | 
						|
14530        11: WRITE(F, 'MISSING UNIT (OR EXTRA ;)');
 | 
						|
14540        12: WRITE(F, 'DECLARER NOT FOUND WHERE EXPECTED');
 | 
						|
14550        13: WRITE(F, 'ILLEGAL FORM OF TRIMMER OR MISPLACED COLON');
 | 
						|
14560        14: WRITE(F, '.DO NOT FOUND WHERE EXPECTED');
 | 
						|
14570        15: WRITE(F, 'FIELD NOT SPECIFIED PROPERLY');
 | 
						|
14575        16: WRITE(F, 'MISMATCH AFTER ''[''');
 | 
						|
14580        17: WRITE(F, 'MISMATCH AFTER ''(''');
 | 
						|
14590        18: WRITE(F, 'END OF PROGRAM TEXT');
 | 
						|
14600        19: WRITE(F, 'MISSING LABEL-DECLARATION FOLLOWING .EXIT');
 | 
						|
14610        20: WRITE(F, 'MISSING = IN IDENTITY-DECLARATION');
 | 
						|
14620        21: WRITE(F, 'INCORRECT VARIABLE-DECLARATION');
 | 
						|
14630        22: WRITE(F, 'INCORRECT MODE-DECLARATION');
 | 
						|
14640        23: WRITE(F, '.GOTO NOT FOLLOWED BY LABEL');
 | 
						|
14650        24: WRITE(F, '.STRUCT NOT FOLLOWED BY ''(''');
 | 
						|
14660        25: WRITE(F, 'MISPLACED PROCEDURE-PLAN');
 | 
						|
14670        26: WRITE(F, 'MISSING DECLARER OR DENOTATION AFTER .LONG OR .SHORT');
 | 
						|
14680        27: WRITE(F, 'ILLEGAL BOUNDS IN FORMAL-DECLARER');
 | 
						|
14690        28: WRITE(F, 'FORMAL-PARAMETER NOT SPECIFIED PROPERLY');
 | 
						|
14700        29: WRITE(F, 'PARAMETER MODE NOT SPECIFIED PROPERLY');
 | 
						|
14710        30: WRITE(F, 'ACTUAL-BOUNDS NOT TERMINATED BY '','' OR '']''');
 | 
						|
14720        31: WRITE(F, 'ADDITIONAL TEXT FOLLOWS A COMPLETE PROGRAM');
 | 
						|
14730        32: WRITE(F, 'ILLEGAL ACTUAL-PARAMETER-LIST');
 | 
						|
14740        33: WRITE(F, 'MISSING COLON IN ROUTINE-TEXT');
 | 
						|
14750        34: WRITE(F, 'MISSING ;');
 | 
						|
14760        35: WRITE(F, 'MISPLACED COMMA OR MISSING COMMA');
 | 
						|
14770        36: WRITE(F, 'MISMATCH IN LOOP-CLAUSE');
 | 
						|
14780        37: WRITE(F, 'MISMATCH AFTER .BEGIN');
 | 
						|
14790        38: WRITE(F, 'MISMATCH IN CASE-CLAUSE');
 | 
						|
14800        39: WRITE(F, 'MISMATCH IN IF-CLAUSE');
 | 
						|
14810        40: WRITE(F, 'MISSING SEMICOLON AFTER DECLARATION');
 | 
						|
14820        41: WRITE(F, 'MISPLACED ACTUAL-DECLARER');
 | 
						|
14830        42: WRITE(F, 'LOOKS LIKE AN ILLEGAL DECLARATION');
 | 
						|
14840        43: WRITE(F, 'ILLEGAL UNIT IN THIS CONTEXT');
 | 
						|
14850        44: WRITE(F, 'ILLEGAL CONTEXT FOR DISPLAY IN ALGOL 68S');
 | 
						|
14860        45: WRITE(F, 'MODE IS ILLEGAL IN ALGOL 68S');
 | 
						|
14870        46: WRITE(F, 'MISSING IDENTIFIER AFTER .FOR');
 | 
						|
14880        47: WRITE(F, 'ILL-FORMED DISPLAY OR DATA-LIST');
 | 
						|
14890        48: WRITE(F, 'MISSING = IN OPERATION-DECLARATION');
 | 
						|
14900        49: WRITE(F, 'MISSING BOUNDS IN ACTUAL-DECLARER');
 | 
						|
14910        50: WRITE(F, 'INCORRECT PRIORITY-DECLARATION');
 | 
						|
14920        51: WRITE(F, 'MISSING = OR := IN ROUTINE-DECLARATION');
 | 
						|
14930        52: WRITE(F, 'ILLEGAL CASE-CLAUSE');
 | 
						|
14940        53: WRITE(F, 'PRIORITY MUST BE A DIGIT');
 | 
						|
14950 ()-55*)
 | 
						|
14960 (*+53()
 | 
						|
14970         END;
 | 
						|
14980        IF LEX<>NIL THEN PRINTLEX(F);
 | 
						|
14990        WRITELN(F);
 | 
						|
15000        END;
 | 
						|
15010   PROCEDURE ERRMSG2(VAR F: TEXT);
 | 
						|
15020       BEGIN
 | 
						|
15030       WRITE(F, '      ');
 | 
						|
15040       CASE LEV OF
 | 
						|
15050         ERRORR:  WRITE(F, 'ERROR   ');
 | 
						|
15060         WARNING: WRITE(F, 'WARNING ');
 | 
						|
15070         END;
 | 
						|
15080 (*+55() WRITE(F,N:3); ()+55*)
 | 
						|
15090 (*-55() CASE N OF ()-55*)
 | 
						|
15100 ()+53*)
 | 
						|
15110       (*ESE*)
 | 
						|
15120 (*-55()
 | 
						|
15130        61: WRITE(F, 'DUPLICATED FIELD-SELECTOR IN .STRUCT DECLARER');
 | 
						|
15140        62: WRITE(F, 'LABEL-DECLARATION IN ENQUIRY-CLAUSE');
 | 
						|
15150        63: WRITE(F, 'ILL-FORMED MODE IN MODE-DECLARATION');
 | 
						|
15160        64: WRITE(F, 'LABEL PRECEDES A DECLARATION IN CURRENT RANGE');
 | 
						|
15170        65: WRITE(F, 'LOCAL-GENERATOR MAY NOT PRECEDE FIRST DECLARATION OF RANGE IN ALGOL 68S');
 | 
						|
15180        66: WRITE(F, 'TOO MANY .SHORTS');
 | 
						|
15190        67: WRITE(F, 'LABEL ALREADY USED AS IDENTIFIER');
 | 
						|
15200        68: WRITE(F, 'IDENTIFIER ALREADY USED IN THIS REACH');
 | 
						|
15210        69: WRITE(F, 'IDENTIFIER ALREADY DECLARED');
 | 
						|
15220        70: WRITE(F, 'VALUE DISCARDED WITHOUT BEING USED');
 | 
						|
15230        71: WRITE(F, 'MODE-INDICATION ALREADY DECLARED');
 | 
						|
15240        72: WRITE(F, 'MODE-INDICATION ALREADY USED IN THIS REACH');
 | 
						|
15250        73: WRITE(F, 'LABEL ALREADY DECLARED');
 | 
						|
15260        74: WRITE(F, 'SCOPE VIOLATION');
 | 
						|
15270        75: WRITE(F, 'IDENTIFIER ALREADY USED AS LABEL');
 | 
						|
15280        76: WRITE(F, 'IDENTIFIER NOT DECLARED');
 | 
						|
15290        78: WRITE(F, 'DISPLAYS MUST BE IN STRONG NON-VOID POSITIONS');
 | 
						|
15300        79: WRITE(F, 'TOO MANY .LONGS');
 | 
						|
15310        80: WRITE(F, 'LEFT SIDE OF ASSIGNMENT IS NOT A VARIABLE');
 | 
						|
15320        81: WRITE(F, '.NIL OCCURS IN NON-REF CONTEXT');
 | 
						|
15330        82: WRITE(F, 'MONADIC-OPERATOR USED AS DYADIC-OPERATOR');
 | 
						|
15340        83: WRITE(F, 'UNSUITABLE OPERAND FOR MONADIC-OPERATOR');
 | 
						|
15350        84: WRITE(F, 'UNSUITABLE OPERANDS FOR DYADIC-OPERATOR');
 | 
						|
15360        85: WRITE(F, 'THE OBJECT CALLED IS NOT A .PROC');
 | 
						|
15370        86: WRITE(F, 'BALANCE CANNOT BE MADE IN A SOFT POSITION');
 | 
						|
15380        87: WRITE(F, 'BALANCE CANNOT BE MADE IN A WEAK POSITION');
 | 
						|
15390        88: WRITE(F, 'BALANCE CANNOT BE MADE IN A MEEK POSITION');
 | 
						|
15400        89: WRITE(F, 'BALANCE CANNOT BE MADE IN A FIRM POSITION');
 | 
						|
15410        90: WRITE(F, 'TOO MANY ACTUAL-PARAMETERS IN CALL');
 | 
						|
15420        91: WRITE(F, 'ILLEGAL MODE FOR TRANSPUT');
 | 
						|
15430        92: WRITE(F, 'STRING-SLICE MAY NOT CONTAIN .AT IN ALGOL 68S');
 | 
						|
15440        93: WRITE(F, 'ILLEGAL MODE FOR THIS POSITION');
 | 
						|
15450        94: WRITE(F, 'ENQUIRY IN IF-CLAUSE MUST BE .BOOL');
 | 
						|
15460        95: WRITE(F, 'ENQUIRY IN CASE-CLAUSE MUST BE .INT');
 | 
						|
15470        96: WRITE(F, 'ENQUIRY IN WHILE-PART OF LOOP-CLAUSE MUST BE .BOOL');
 | 
						|
15480        97: WRITE(F, 'ENQUIRY IN BRIEF CHOICE-CLAUSE MUST BE .BOOL OR .INT');
 | 
						|
15490        98: WRITE(F, '.GOTO UNDEFINED LABEL');
 | 
						|
15500        99: WRITE(F, 'UNIT AFTER .TO, .BY OR .FROM MUST BE .INT');
 | 
						|
15510       100: WRITE(F, 'JUMP MAY NOT OCCUR IN .PROC MODE CONTEXT IN ALGOL 68S');
 | 
						|
15520       101: WRITE(F, 'PRIORITY MUST BE FROM 1 TO 9');
 | 
						|
15530       102: WRITE(F, 'PRIORITY ALREADY GIVEN FOR THIS OPERATOR');
 | 
						|
15540       103: WRITE(F, 'THE OBJECT AFTER .OF IS NOT A .STRUCT');
 | 
						|
15550       104: WRITE(F, 'FIELD-SELECTOR NOT RECOGNIZED IN THIS .STRUCT');
 | 
						|
15560       105: WRITE(F, 'ROWED NAME USED IN IDENTITY-RELATION');
 | 
						|
15570       106: WRITE(F, 'MODE-INDICATION NOT DECLARED');
 | 
						|
15580       107: WRITE(F, 'THE OBJECT SLICED IS NOT AN ARRAY');
 | 
						|
15590       108: WRITE(F, 'TOO MANY TRIMSCRIPTS IN SLICE');
 | 
						|
15600       109: WRITE(F, 'TOO FEW TRIMSCRIPTS IN SLICE');
 | 
						|
15610       110: WRITE(F, 'UNIT AFTER .AT MUST BE .INT');
 | 
						|
15620       111: WRITE(F, 'UNIT IN SUBSCRIPT MUST BE .INT');
 | 
						|
15630       112: WRITE(F, 'UNIT IN LOWER-BOUND MUST BE .INT');
 | 
						|
15640       113: WRITE(F, 'UNIT IN UPPER-BOUND MUST BE .INT');
 | 
						|
15650       114: WRITE(F, 'TOO FEW/MANY PARAMETERS FOR OPERATOR');
 | 
						|
15660       115: WRITE(F, 'PRIORITY-DECLARATION MUST PRECEDE OPERATOR-DECLARATION IN ALGOL 68S');
 | 
						|
15670       116: WRITE(F, 'A MEEKLY-RELATED OPERATOR ALREADY EXISTS');
 | 
						|
15680       117: WRITE(F, 'OPERAND OF IDENTITY-RELATION IS NOT A NAME');
 | 
						|
15690       118: WRITE(F, 'TOO FEW UNITS IN STRUCTURE-DISPLAY');
 | 
						|
15700       119: WRITE(F, 'TOO MANY UNITS IN STRUCTURE-DISPLAY');
 | 
						|
15710       120: WRITE(F, 'DISPLAY DOES NOT HAVE REQUIRED MODE');
 | 
						|
15720       121: WRITE(F, 'A JUMP TO THIS LABEL BYPASSES A DECLARATION');
 | 
						|
15730       122: WRITE(F, 'TOO MANY INTERMEDIATE VALUES (POSSIBLE RUNTIME ERROR)');
 | 
						|
15740       123: WRITE(F, 'IDENTIFIER USED BEFORE DECLARATION COMPLETE');
 | 
						|
15750       132: WRITE(F, 'TOO FEW ACTUAL-PARAMETERS IN CALL');
 | 
						|
15760       133: WRITE(F, '.LOC OMITTED IN VARIABLE-DECLARATION');
 | 
						|
15770         END;
 | 
						|
15780 ()-55*)
 | 
						|
15790       IF LEX<>NIL THEN PRINTLEX(F);
 | 
						|
15800       WRITELN(F);
 | 
						|
15810       END;
 | 
						|
15820   (*START OF OUTERR*)
 | 
						|
15830     BEGIN
 | 
						|
15840     IF (LEV=ERRORR) OR (PRGWARN IN PRAGFLGS) THEN
 | 
						|
15850       BEGIN
 | 
						|
15860       ERRDEV := TRUE;
 | 
						|
15870       IF ERRPTR<ERRLXPTR THEN
 | 
						|
15880         BEGIN
 | 
						|
15890         FOR I := ERRPTR+1 TO ERRLXPTR-1 DO ERRBUF[I] := ERRCHAR;
 | 
						|
15900         ERRPTR := ERRLXPTR;
 | 
						|
15910         ERRBUF[ERRLXPTR] := '1'
 | 
						|
15920         END
 | 
						|
15930       ELSE
 | 
						|
15940       ERRBUF[ERRLXPTR] :=
 | 
						|
15950         CHR((ORD(ERRBUF[ERRLXPTR])-ORD('0')+1) MOD 10 + ORD('0'));
 | 
						|
15960       ERRNONBLANK := TRUE;
 | 
						|
15970       IF ONLINE THEN
 | 
						|
15980       BEGIN
 | 
						|
15990 (*+53()     IF N<=ESE THEN ERRMSG(OUTPUT) ELSE ERRMSG2(OUTPUT);   ()+53*)
 | 
						|
16000 (*-53()     ERRMSG(OUTPUT);   ()-53*)
 | 
						|
16010       IF PRGLIST IN PRAGFLGS THEN
 | 
						|
16020         BEGIN
 | 
						|
16030         IF LSTCNT>4+LINESPERPAGE THEN CHECKPAGE;
 | 
						|
16040 (*+01() WRITE(LSTFILE, ' '); ()+01*)
 | 
						|
16050 (*+53() IF N<=ESE THEN ERRMSG(LSTFILE) ELSE ERRMSG2(LSTFILE); ()+53*)
 | 
						|
16060 (*-53() ERRMSG(LSTFILE); ()-53*)
 | 
						|
16070         LSTCNT := LSTCNT+1;
 | 
						|
16080         END;
 | 
						|
16090       END
 | 
						|
16100 (*-02() (*-04() (*-05()
 | 
						|
16110       ELSE  (*BATCH*)
 | 
						|
16120       BEGIN
 | 
						|
16130       IF LSTCNT>4+LINESPERPAGE THEN CHECKPAGE;
 | 
						|
16140 (*+01()WRITE(OUTPUT, ' '); ()+01*)
 | 
						|
16150 (*+53()     IF N<=ESE THEN ERRMSG(OUTPUT) ELSE ERRMSG2(OUTPUT);   ()+53*)
 | 
						|
16160 (*-53()     ERRMSG(OUTPUT);   ()-53*)
 | 
						|
16170       LSTCNT := LSTCNT+1;
 | 
						|
16180       END
 | 
						|
16190 ()-05*) ()-04*) ()-02*)
 | 
						|
16200 ;     IF LEV=ERRORR THEN
 | 
						|
16210         ERRS := ERRS+1
 | 
						|
16220       ELSE WARNS := WARNS+1
 | 
						|
16230       END
 | 
						|
16240     END;
 | 
						|
16250 (**)
 | 
						|
16260 (**)
 | 
						|
16270 PROCEDURE SEMERR(N: INTEGER);
 | 
						|
16280 (*FUNCTION: PRINT ERROR MESSAGE PRODUCED BY SEMANTIC ROUTINES.
 | 
						|
16290     A FUTURE VERSION OF THIS PROCEDURE MIGHT INCREMENT A SPECIAL COUNTER
 | 
						|
16300     (AS DISTINCT FROM ERRS) FOR SEMANTIC ERRORS.
 | 
						|
16310 *)
 | 
						|
16320     BEGIN OUTERR(N, ERRORR, NIL); SEMERRS := SEMERRS+1 END;
 | 
						|
16330 (**)
 | 
						|
16340 (**)
 | 
						|
16350 PROCEDURE SEMERRP(N: INTEGER; LEX: PLEX);
 | 
						|
16360 (*FUNCTION: PRINTS ERROR MESSAGE FOLLOWED BY THE OFFENDING LEXEME*)
 | 
						|
16370     BEGIN OUTERR(N, ERRORR, LEX); SEMERRS := SEMERRS+1 END;
 | 
						|
16380 (**)
 | 
						|
16390 (**)
 | 
						|
16400 PROCEDURE MODERR(M: MODE; N: INTEGER);
 | 
						|
16410 (*FUNCTION: PRINTS ERROR MESSAGE UNLESS M=MDERROR*)
 | 
						|
16420     BEGIN
 | 
						|
16430     IF (M<>MDERROR) AND (M<>PRCERROR) THEN
 | 
						|
16440       BEGIN OUTERR(N, ERRORR, NIL); SEMERRS := SEMERRS+1 END
 | 
						|
16450     END;
 | 
						|
16460 (**)
 | 
						|
16470 ()+81*)
 | 
						|
16480 (*+82()
 | 
						|
16490 (**)
 | 
						|
16500                 (*LEXICAL ANALYSIS*)
 | 
						|
16510                 (******************)
 | 
						|
16520 (**)
 | 
						|
16530 PROCEDURE OUTSRC;
 | 
						|
16540 (*FUNCTION: OUTPUT A LINE OF SOURCE ON THE LISTING DEVICE.
 | 
						|
16550     IF AN ERROR OCCURRED IN THE LINE OR THE LINE WAS IGNORED DUE
 | 
						|
16560     TO A PREVIOUS ERROR, THEN A LINE OF ERROR INDICATION IS ALSO
 | 
						|
16570     OUTPUT.IF AN ERROR OCCURRED IN THE LINE, THEN ERRORDEV WILL
 | 
						|
16580     BE TRUE AND THUS ALL OUTPUT WILL GO TO THE ERROR DEVICE ALSO.
 | 
						|
16590   GLOBALS:
 | 
						|
16600     SRCBUF, SRCPTR - SOURCE BUFFER
 | 
						|
16610     ERRBUF, ERRPTR - BUFFER CONTAINING ERROR INDICATIONS
 | 
						|
16620     ERRNONBLANK - FALSE IF NO ERROR INDICATIONS
 | 
						|
16630     ERRLXPTR
 | 
						|
16640     PRAGFLGS
 | 
						|
16650     INDEX - INDEX TYPE OF CURRENT CHARACTER
 | 
						|
16660     LSTLINE - LINE NUMBER
 | 
						|
16670     SRCSTAT, SRCSTCH
 | 
						|
16680 *)
 | 
						|
16690   VAR I: INTEGER;
 | 
						|
16700     BEGIN
 | 
						|
16710     IF LSTCNT>4+LINESPERPAGE THEN CHECKPAGE;  (*MAINLY FOR FIRST TIME*)
 | 
						|
16720     OUTLST(LSTLINE, SRCBUF, SRCPTR);
 | 
						|
16730     IF ERRNONBLANK THEN
 | 
						|
16740       BEGIN
 | 
						|
16750       FOR I := ERRPTR+1 TO SRCPTR DO ERRBUF[I] := ERRCHAR;
 | 
						|
16760       OUTLST(-1, ERRBUF, SRCPTR);
 | 
						|
16770       IF ERRCHAR=' ' THEN
 | 
						|
16780         ERRNONBLANK := FALSE;
 | 
						|
16790       ERRDEV := FALSE
 | 
						|
16800       END;
 | 
						|
16810     IF INDEX=EOL THEN
 | 
						|
16820       IF EOF(SOURCDECS) THEN INDEX := EOFF
 | 
						|
16830       ELSE IF (LINENUMBERS IN PRAGFLGS) THEN
 | 
						|
16840         BEGIN READ(SOURCDECS, LSTLINE); IF SOURCDECS^=' ' THEN GET(SOURCDECS); END
 | 
						|
16850       ELSE LSTLINE := LSTLINE+1;
 | 
						|
16860     SRCPTR := 0; ERRPTR := -1; ERRLXPTR := 0;
 | 
						|
16870     IF LSTCNT>LINESPERPAGE THEN CHECKPAGE;
 | 
						|
16880     SRCSTAT := SRCSTCH
 | 
						|
16890     END;
 | 
						|
16900 (**)
 | 
						|
16910 (**)
 | 
						|
16920 PROCEDURE NEXTCH(LEVEL: INDEXTYPE);
 | 
						|
16930 (*FUNCTION: GET THE NEXT ACCEPTABLE CHARACTER FROM THE SOURCE
 | 
						|
16940     INPUT. LEVEL IS USED TO INDICATE WHICH CHARACTERS ARE
 | 
						|
16950     ACCEPTABLE.
 | 
						|
16960   INPUTS
 | 
						|
16970     LEVEL - THE LOWEST INDEX TYPE WHICH IS ACCEPTABLE
 | 
						|
16980   OUTPUTS (GLOBAL)
 | 
						|
16990     CHA   - THE CURRENT INPUT CHARACTER
 | 
						|
17000     TYPE  - THE TYPE TYPE OF CHA
 | 
						|
17010     INDEX - THE INDEX TYPE OF CHA
 | 
						|
17020 *)
 | 
						|
17030   LABEL 99;
 | 
						|
17040     BEGIN
 | 
						|
17050     REPEAT
 | 
						|
17060       IF (INDEX=EOL) OR (SRCPTR>=CBUFSIZE) THEN
 | 
						|
17070         OUTSRC;
 | 
						|
17080         IF INDEX=EOFF THEN GOTO 99
 | 
						|
17090         ELSE CHA := SOURCDECS^;
 | 
						|
17100         SRCPTR := SRCPTR+1; SRCBUF[SRCPTR] := CHA;
 | 
						|
17110         CHAC:=UPC;
 | 
						|
17120 (*-50()
 | 
						|
17130         IF (ORD(CHA)>96) AND (ORD(CHA)<127) THEN
 | 
						|
17140           BEGIN
 | 
						|
17150           CHA:=CHR(ORD(CHA)-32);
 | 
						|
17160           CHAC:=LOWC
 | 
						|
17170           END;
 | 
						|
17180 ()-50*)
 | 
						|
17190 (*+02() (*-25() IF EOF(SOURCDECS) THEN BEGIN INDEX := EOFF; GOTO 99 END ELSE ()-25*) ()+02*)
 | 
						|
17192 (*-50() IF (ORD(CHA)<32) OR (ORD(CHA)>=127) THEN
 | 
						|
17194           BEGIN INDEX := ERRCH; TYP := [] END
 | 
						|
17196         ELSE ()-50*)
 | 
						|
17200         CASE CHA OF
 | 
						|
17210           ' ':
 | 
						|
17220                 BEGIN
 | 
						|
17230                 TYP := [];
 | 
						|
17240                 IF EOF(SOURCDECS) THEN BEGIN INDEX:=EOFF; GOTO 99 END
 | 
						|
17250                 ELSE IF EOLN(SOURCDECS) THEN INDEX:=EOL
 | 
						|
17260                 ELSE INDEX := SPACE
 | 
						|
17270                 END;
 | 
						|
17280 (*-51()
 | 
						|
17290           '$', '&', '''', '?', '\', '_':
 | 
						|
17300 ()-51*)
 | 
						|
17310 (*+51()
 | 
						|
17320           '$', '_', '"', '\', '?', '^':
 | 
						|
17330 ()+51*)
 | 
						|
17340 (*+50()         BEGIN INDEX := ERRCH; TYP := [] END; ()+50*)
 | 
						|
17342 (*-50()         BEGIN IF CHAC=UPC THEN INDEX := ERRCH ELSE INDEX := PUNCT; TYP := [] END; ()-50*)
 | 
						|
17350           '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
 | 
						|
17360                 BEGIN
 | 
						|
17370                 INDEX := DIGIT;
 | 
						|
17380                 TYP := [HEX, DIG]
 | 
						|
17390                 END;
 | 
						|
17400           '.':
 | 
						|
17410                 BEGIN
 | 
						|
17420                 GET(SOURCDECS);
 | 
						|
17430                 IF SOURCDECS^ IN ['0'..'9'] THEN INDEX := POINT
 | 
						|
17440                 ELSE INDEX := STROP;
 | 
						|
17450                 TYP := [];
 | 
						|
17460                 GOTO 99
 | 
						|
17470                 END;
 | 
						|
17480 (*-51()
 | 
						|
17490           '"':  BEGIN INDEX := QUOTE; TYP := [] END;
 | 
						|
17500           ':', '!', '%', '(', ')', '*', '/', ',', ';', '<', '>',
 | 
						|
17510             '^', '=', '@', '[', ']':
 | 
						|
17520 ()-51*)
 | 
						|
17530 (*+51()
 | 
						|
17540           '!': BEGIN INDEX := QUOTE; TYP := [] END;
 | 
						|
17550           ':', '&', '%', '(', ')', '*', '/', ',', ';', '<', '>',
 | 
						|
17560             '''', '=', '@', '[', ']':
 | 
						|
17570 ()+51*)
 | 
						|
17580 (*+50()         BEGIN INDEX := PUNCT; TYP :=[] END; ()+50*)
 | 
						|
17582 (*-50()         BEGIN IF CHAC=UPC THEN INDEX := PUNCT ELSE INDEX := ERRCH; TYP := [] END; ()-50*)
 | 
						|
17590           '+', '-':
 | 
						|
17600                 BEGIN INDEX := PLSMIN; TYP := [] END;
 | 
						|
17610           'A', 'B', 'C', 'D', 'E', 'F':
 | 
						|
17620                 BEGIN
 | 
						|
17630                 INDEX := LETTER;
 | 
						|
17640                 TYP := [HEX, CHAC]
 | 
						|
17650                 END;
 | 
						|
17660           'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
 | 
						|
17670             'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z':
 | 
						|
17680                 BEGIN
 | 
						|
17690                 INDEX := LETTER;
 | 
						|
17700                 TYP := [CHAC]
 | 
						|
17710                 END;
 | 
						|
17720           '#':
 | 
						|
17730                 BEGIN INDEX := PRAG; TYP := [] END;
 | 
						|
17740           END;
 | 
						|
17750         GET(SOURCDECS);
 | 
						|
17760   99:
 | 
						|
17770     UNTIL INDEX>LEVEL
 | 
						|
17780     END;
 | 
						|
17790 (**)
 | 
						|
17800 (**)
 | 
						|
17810 PROCEDURE LXERR(N: INTEGER);
 | 
						|
17820 (*FUNCTION: PRINT ERROR MESSAGE UNLESS CURRENTLY PROCESSING
 | 
						|
17830     INSIDE A PRAGMENT.
 | 
						|
17840   INPUT:
 | 
						|
17850     N - IDENTIFIES MESSAGE TO BE PRINTED
 | 
						|
17860   GLOBALS:
 | 
						|
17870     INPRAGMENT
 | 
						|
17880 *)
 | 
						|
17890     BEGIN
 | 
						|
17900     IF NOT INPRAGMENT THEN
 | 
						|
17910       OUTERR(N, ERRORR, NIL)
 | 
						|
17920     END;
 | 
						|
17930 (**)
 | 
						|
17940 (**)
 | 
						|
17950 PROCEDURE INITLX;
 | 
						|
17960 (*FUNCTION: PERFORM PER-COMPILATION INITIALIZATION REQUIRED BY
 | 
						|
17970     THE LEXICAL ANALYZER.
 | 
						|
17980 *)
 | 
						|
17990 (*VAR I: 0..HTSIZE; *)
 | 
						|
18000     BEGIN
 | 
						|
18010     (*WORDS := 0;*)
 | 
						|
18020 (*+50()
 | 
						|
18030 (*-52() PRAGFLGS := [PRGPOINT, PRGWARN, PRGMACH, PRGLIST, PRGGO]; ()-52*)
 | 
						|
18040 (*+52() PRAGFLGS := [PRGPOINT, PRGWARN, PRGMACH, PRGLIST]; ()+52*)
 | 
						|
18050 ()+50*)
 | 
						|
18060 (*-50() PRAGFLGS := [PRGUPPER, PRGWARN, PRGMACH, PRGLIST, PRGGO]; ()-50*)
 | 
						|
18070     INDEX := CONTROL;
 | 
						|
18080     INPRAGMENT := FALSE;
 | 
						|
18090     LONGSCNT := 0;
 | 
						|
18100     ERRLXPTR := 0; ERRPTR := -1;
 | 
						|
18110     ERRCHAR := ' '; ERRNONBLANK := FALSE;
 | 
						|
18120     SRCPTR := 0;
 | 
						|
18130     (*KRONOS HAS A CONVENTION FOR LINE NUMBERING OF FILES.
 | 
						|
18140       THE FIRST CHARACTER OF THE FILE WILL NOW BE READ, AND IF
 | 
						|
18150       IT IS A DIGIT, IT WILL BE ASSUMED THAT THE SOURCE TEXT
 | 
						|
18160       IS NUMBERED ACCORDING TO THIS CONVENTION.*)
 | 
						|
18170     LSTLINE := 1;
 | 
						|
18180     IF NOT EOF(SOURCDECS) THEN
 | 
						|
18190       BEGIN
 | 
						|
18200     WHILE EOLN(SOURCDECS) DO GET(SOURCDECS);
 | 
						|
18210       IF SOURCDECS^ IN ['0'..'9'] THEN
 | 
						|
18220         BEGIN
 | 
						|
18230       READ(SOURCDECS,LSTLINE);
 | 
						|
18240         IF SOURCDECS^=' ' THEN GET(SOURCDECS);
 | 
						|
18250         PRAGFLGS := PRAGFLGS+[LINENUMBERS];
 | 
						|
18260         END
 | 
						|
18270       END;
 | 
						|
18280     LEXLINE := LSTLINE;
 | 
						|
18290     SRCSTAT := ' ';
 | 
						|
18340     END;
 | 
						|
18350 (**)
 | 
						|
18360 (**)
 | 
						|
18370 (*+04()
 | 
						|
18380 FUNCTION LABS(X: A68INT): A68INT;
 | 
						|
18390     BEGIN IF X>0 THEN LABS := X ELSE LABS := -X END;
 | 
						|
18400 ()+04*)
 | 
						|
18410 ()+82*)
 | 
						|
18420 (*+81()
 | 
						|
18430 FUNCTION HASHIN: PLEX;
 | 
						|
18440 (*FUNCTION: SEARCH HASH TABLE FOR LEXEME SITTING IN CURRENTLEX.
 | 
						|
18450     IF LEXEME IS ALREADY IN TABLE, THEN RETURN POINTER TO THIS OLD
 | 
						|
18460     LEXEME.  IF IT IS NOT IN THE TABLE AND NOENTER IS FALSE AND WE
 | 
						|
18470     ARE NOT INSIDE A PRAGMENT, THEN ENTER THE LEXEME IN THE TABLE
 | 
						|
18480     AND RETURN A POINTER TO THE NEW LEXEME.  IF LEXEME IS NOT
 | 
						|
18490     FOUND AND A NEW ENTRY IS NOT MADE, THEN RETURN NIL.
 | 
						|
18500 *)
 | 
						|
18510   LABEL 8, 9;
 | 
						|
18520   VAR TOTAL: A68INT; HASHVAL, HASHSTART:  INTEGER; I:  1..TAXLENWD; THIS:  PLEX;
 | 
						|
18530     BEGIN
 | 
						|
18540     WITH CURRENTLEX DO
 | 
						|
18550       BEGIN
 | 
						|
18560       TOTAL := 0;
 | 
						|
18570       HASHSTART := 1+ORD(LXTOKEN=TKDENOT);
 | 
						|
18580       FOR I := HASHSTART TO LXCOUNT DO
 | 
						|
18590 (*+11() TOTAL := TOTAL+FUDGE[2*I-1]+FUDGE[2*I];
 | 
						|
18592       HASHVAL := ABS(TOTAL MOD HTSIZE);   (*HASH VALUE*) ()+11*)
 | 
						|
18600 (*-11()
 | 
						|
18601 (*-05() TOTAL := (TOTAL+INTEGERS[I]) MOD HTSIZE; ()-05*)
 | 
						|
18602 (*+05() TOTAL := TOTAL+INTEGERS[I]; ()+05*)
 | 
						|
18604 (*-04()(*-05() HASHVAL := TOTAL;   (*HASH VALUE*) ()-05*)()-04*)
 | 
						|
18610 (*+05() HASHVAL := ABS(TOTAL MOD HTSIZE);   (*HASH VALUE*) ()+05*)
 | 
						|
18620 (*+04() HASHVAL := SHRINK(LABS(TOTAL)); ()+04*)
 | 
						|
18624 ()-11*)
 | 
						|
18630       THIS := HT[HASHVAL];
 | 
						|
18640       WHILE THIS<>NIL DO
 | 
						|
18650         BEGIN
 | 
						|
18660           IF LXCOUNT<>THIS^.LXCOUNT THEN GOTO 8;
 | 
						|
18670           FOR I := 1 TO LXCOUNT DO
 | 
						|
18680             IF INTEGERS[I]<>THIS^.INTEGERS[I] THEN GOTO 8;
 | 
						|
18690           IF LXTOKEN=THIS^.LXTOKEN THEN
 | 
						|
18700             IF LXTOKEN<>TKDENOT THEN GOTO 9
 | 
						|
18710             ELSE IF LXDENMD=THIS^.LXDENMD THEN GOTO 9 ELSE GOTO 8;
 | 
						|
18720     8:  THIS := THIS^.LINK
 | 
						|
18730         END;
 | 
						|
18740    9: IF (THIS=NIL) AND (NOT INPRAGMENT) THEN
 | 
						|
18750         BEGIN
 | 
						|
18760         (*NEW LEXEME MUST BE CREATED*)
 | 
						|
18770         (*CREATE LEXEME JUST BIG ENOUGH*)
 | 
						|
18780         ENEW(THIS, LXCOUNT*SZWORD+LEX1SIZE);
 | 
						|
18790         FOR I := 1 TO LXCOUNT + LEX1SIZE DIV SZWORD DO
 | 
						|
18800           THIS^.LEXWORDS[I] := LEXWORDS[I];
 | 
						|
18810         THIS^.LINK := HT[HASHVAL];
 | 
						|
18820         HT[HASHVAL] := THIS;
 | 
						|
18830         END;
 | 
						|
18840       HASHIN := THIS
 | 
						|
18850       END (*OF WITH CURRENTLEX*)
 | 
						|
18860     END;
 | 
						|
18870 (**)
 | 
						|
18880 ()+81*)
 | 
						|
18890 (*+82()
 | 
						|
18900 (**)
 | 
						|
18910 FUNCTION LX: PLEX;
 | 
						|
18920 (*FUNCTION: SCAN A SYMBOL FROM THE INPUT.
 | 
						|
18930   VALUE: PLEX FOR THE SYMBOL.
 | 
						|
18940 *)
 | 
						|
18950   LABEL 1, 6, 7, 8, 77, 88, 99;
 | 
						|
18960   CONST SKIPNONE=CONTROL; SKIPEOL=EOL; SKIPSPACES=SPACE;
 | 
						|
18970         SKIPDENS=PLSMIN; SKIPTAGS=LETTER;
 | 
						|
18980 (*+11()      MAX10=3146314631463146313B;
 | 
						|
18990     MAX2=37777777777777777777B;
 | 
						|
19000 ()+11*)
 | 
						|
19002 (*+12()
 | 
						|
19004     MAX10=3277;
 | 
						|
19006     MAX2=16383;
 | 
						|
19008 ()+12*)
 | 
						|
19010 (*+13() MAX10=214748364;
 | 
						|
19020       MAX2=1073741824;
 | 
						|
19030 ()+13*)
 | 
						|
19040   VAR LEX: PLEX; SYMCNT, I: INTEGER;
 | 
						|
19050     S: 0..127;
 | 
						|
19060     STATE: (PT, INTPT, R, PM, FRACPT, E, EXP, BITS);
 | 
						|
19070               (*FOR GETPRIMDEN*)
 | 
						|
19080     EXPONENT, SIGN, SCALE, DIGT: INTEGER;
 | 
						|
19090     NS: BOOLEAN;
 | 
						|
19100     RR, FAC: REAL;
 | 
						|
19110     LEVEL: INDEXTYPE;
 | 
						|
19120   PROCEDURE FINISHOFF(C: CHAR);
 | 
						|
19130   (*FUNCTION: FILLS REST OF STRING WITH SPACES UP TO NEXT FULL
 | 
						|
19140     WORD AND SETS LXCOUNT.
 | 
						|
19150   *)
 | 
						|
19160     VAR I: 0..TAXLEN;
 | 
						|
19170       BEGIN
 | 
						|
19180       WITH CURRENTLEX DO
 | 
						|
19190         BEGIN
 | 
						|
19200         IF SYMCNT<TAXLEN THEN
 | 
						|
19210           BEGIN
 | 
						|
19220         LXCOUNT := (SYMCNT+CHARPERWORD-1) DIV CHARPERWORD;
 | 
						|
19230           FOR I := (SYMCNT-1) MOD CHARPERWORD TO CHARPERWORD-2 DO
 | 
						|
19240             BEGIN SYMCNT := SYMCNT+1; STRNG[SYMCNT] := C END
 | 
						|
19250         END
 | 
						|
19260         ELSE BEGIN LXCOUNT := TAXLENWD; LXERR(ELX+9) END
 | 
						|
19270         END
 | 
						|
19280       END;
 | 
						|
19290   (*START OF LX*)
 | 
						|
19300     BEGIN
 | 
						|
19310     WITH CURRENTLEX DO
 | 
						|
19320       BEGIN
 | 
						|
19330       REPEAT
 | 
						|
19340      1: ERRLXPTR := SRCPTR;
 | 
						|
19350         LEXLINE := LSTLINE;
 | 
						|
19360         CASE INDEX OF
 | 
						|
19370   (*SKIPSPACES*)
 | 
						|
19380           CONTROL, EOL, SPACE:
 | 
						|
19390             BEGIN NEXTCH(SKIPSPACES); GOTO 1 END;
 | 
						|
19400   (*ERRORCHAR*)
 | 
						|
19410           ERRCH: (*ERRORCHAR*)
 | 
						|
19420             BEGIN
 | 
						|
19430             LXERR(ELX+8);
 | 
						|
19440             NEXTCH(SKIPNONE);
 | 
						|
19450             LEX := LEXERROR;
 | 
						|
19460             GOTO 99
 | 
						|
19470             END;
 | 
						|
19480   (*GETPRIMDEN*)
 | 
						|
19490           DIGIT, POINT: (*GETPRIMDEN*)
 | 
						|
19500             BEGIN
 | 
						|
19510             LXDENRPREAL := 0.0; EXPONENT := 0; SIGN := +1; SCALE := 0;
 | 
						|
19514 (*+02()     SYMCNT := ((SZADDR+SZREAL) DIV SZINT) * CHARPERWORD; ()+02*)
 | 
						|
19520             STATE := INTPT;
 | 
						|
19530             WHILE TRUE DO
 | 
						|
19540               BEGIN
 | 
						|
19550           6: (*LABEL TO REPEAT CASE WITH DIFFERENT STATE*)
 | 
						|
19560               CASE STATE OF
 | 
						|
19570                 INTPT: (*SCAN DIGITS*)
 | 
						|
19580 (*+43()           IF INDEX=POINT THEN STATE := PT
 | 
						|
19590                   ELSE IF (CHA='R')(*-50() AND ((PRGPOINT IN PRAGFLGS) OR (LOWC IN TYP))()-50*) THEN
 | 
						|
19600                     STATE := R
 | 
						|
19610                   ELSE IF (CHA='E')(*-50() AND ((PRGPOINT IN PRAGFLGS) OR (LOWC IN TYP))()-50*) THEN
 | 
						|
19620                     BEGIN STATE := PM;
 | 
						|
19630                     IF LXDENRP<=MAXINT THEN
 | 
						|
19640                       LXDENRPREAL := (*-04() LXDENRP ()-04*)(*+04() FLOAT(LXDENRP) ()+04*)
 | 
						|
19650                     ELSE BEGIN OUTERR(ELX+10, ERRORR, NIL); LXDENRPREAL := 0.0 END
 | 
						|
19660                     END
 | 
						|
19670                   ELSE IF DIG IN TYP THEN
 | 
						|
19680                     IF LXDENRP<MAX10 THEN
 | 
						|
19690                       LXDENRP := LXDENRP*10+(ORD(CHA)-ORD('0'))
 | 
						|
19700                     ELSE BEGIN OUTERR(ELX+10, ERRORR, NIL); LXDENRP := 0 END
 | 
						|
19710 (*+61()                 (*WORRY ABOUT LONG CONVERSIONS*) ()+61*)
 | 
						|
19720                   ELSE
 | 
						|
19730                     BEGIN (*+61() IF LONGSCNT=1 THEN LXDENMD := MDLINT ELSE ()+61*) LXDENMD := MDINT;
 | 
						|
19740                       GOTO 7 END;
 | 
						|
19750 ()+43*)
 | 
						|
19760 (*-43()           IF INDEX=POINT THEN STATE := PT
 | 
						|
19770                   ELSE IF (CHA='R')(*-50() AND ((PRGPOINT IN PRAGFLGS) OR (LOWC IN TYP))()-50*) THEN
 | 
						|
19780                        STATE:=R
 | 
						|
19790                   ELSE IF (CHA='E')(*-50() AND ((PRGPOINT IN PRAGFLGS) OR (LOWC IN TYP))()-50*) THEN
 | 
						|
19800                        STATE:=PM
 | 
						|
19810                   ELSE IF DIG IN TYP THEN
 | 
						|
19820                     LXDENRPREAL := LXDENRPREAL*10+(ORD(CHA)-ORD('0'))
 | 
						|
19830                   ELSE IF LXDENRPREAL<=MAXINT
 | 
						|
19840                        THEN BEGIN (*+61() IF LONGSCNT=1 THEN LXDENMD := MDLINT ELSE ()+61*) LXDENMD:=MDINT;
 | 
						|
19850                        LXDENRP:=TRUNC(LXDENRPREAL);GOTO 7 END
 | 
						|
19860                      ELSE BEGIN  OUTERR(ELX+10,ERRORR,NIL);
 | 
						|
19870 (*+61()                  (*WORRY ABOUT LONG CONVERSIONS*) ()+61*)
 | 
						|
19880                        LXDENMD := MDINT;
 | 
						|
19890                        LXDENRP:=0 END;
 | 
						|
19900 ()-43*)
 | 
						|
19910                 PT: (*FIXED-POINT-NUMERAL MUST FOLLOW IN
 | 
						|
19920                       FRACTIONAL-PART*)
 | 
						|
19930                   BEGIN STATE := FRACPT;
 | 
						|
19940 (*-02() (*+43()   IF LXDENRP<=MAXINT THEN
 | 
						|
19950                     LXDENRPREAL := LXDENRP
 | 
						|
19960                   ELSE BEGIN OUTERR(ELX+10, ERRORR, NIL); LXDENRPREAL := 0.0 END;
 | 
						|
19970 (*+61()               (*WORRY ABOUT LONG CONVERSIONS*) ()+61*)
 | 
						|
19980 ()+43*) ()-02*)
 | 
						|
19990                   GOTO 6
 | 
						|
20000                   END;
 | 
						|
20010                 FRACPT: (*SCAN DIGITS OF FRACTIONAL-PART*)
 | 
						|
20020                   IF (CHA='E') AND ((PRGPOINT IN PRAGFLGS) OR (LOWC IN TYP))
 | 
						|
20030                        THEN STATE:=PM
 | 
						|
20040                   ELSE IF DIG IN TYP THEN
 | 
						|
20050 (*-02()             BEGIN LXDENRPREAL := LXDENRPREAL*10+(ORD(CHA)-ORD('0')); SCALE := SCALE-1 END ()-02*)
 | 
						|
20060                   ELSE BEGIN STATE := EXP; GOTO 6 END;
 | 
						|
20070                 PM: (*CHECK FOR PLUSMINUS IN EXPONENT-PART*)
 | 
						|
20080                   IF INDEX=PLSMIN THEN
 | 
						|
20090                     BEGIN IF CHA='-' THEN SIGN := -1; STATE := E END
 | 
						|
20100                   ELSE IF DIG IN TYP THEN
 | 
						|
20110                     BEGIN STATE := EXP; GOTO 6 END
 | 
						|
20120                   ELSE BEGIN LXERR(ELX+6); LEX := LEXERROR; GOTO 99 END;
 | 
						|
20130                 E: (*FIXED-POINT-NUMERAL MUST FOLLOW PLUSMINUS*)
 | 
						|
20140                   IF DIG IN TYP THEN
 | 
						|
20150                     BEGIN STATE := EXP; GOTO 6 END
 | 
						|
20160                   ELSE BEGIN LXERR(ELX+6); LEX := LEXERROR; GOTO 99 END;
 | 
						|
20170                 EXP: (*SCAN FIXED-POINT-NUMERAL IN EXPONENT-PART*)
 | 
						|
20180                   IF DIG IN TYP THEN
 | 
						|
20190 (*-02()             EXPONENT := EXPONENT*10+(ORD(CHA)-ORD('0'))*SIGN ()-02*)
 | 
						|
20200                   ELSE
 | 
						|
20202                     BEGIN
 | 
						|
20210 (*-02()             SCALE := SCALE+EXPONENT;
 | 
						|
20220                     RR := 1.0; NS := SCALE<0; SCALE := ABS(SCALE); FAC := 10.0;
 | 
						|
20230                     WHILE SCALE<>0 DO
 | 
						|
20240                       BEGIN IF ODD(SCALE) THEN RR := RR*FAC;
 | 
						|
20250                       SCALE := SCALE DIV 2;
 | 
						|
20252                       IF SCALE<>0 THEN FAC := SQR(FAC);
 | 
						|
20260                       END;  (*RR = 10^SCALE*)
 | 
						|
20270                     IF NS THEN LXDENRPREAL := LXDENRPREAL/RR
 | 
						|
20280                     ELSE LXDENRPREAL := LXDENRPREAL*RR;
 | 
						|
20284 ()-02*)
 | 
						|
20290             (*+61() IF LONGSCNT=1 THEN LXDENMD := MDLREAL ELSE ()+61*) LXDENMD := MDREAL;
 | 
						|
20300                     GOTO 7;
 | 
						|
20310                     END;
 | 
						|
20320                 R: (*DIGITS MUST FOLLOW LETTER-R IN
 | 
						|
20330                      BITS-DENOTATION*)
 | 
						|
20340 (*+43()           IF (HEX IN TYP)(*-50() AND ((PRGPOINT IN PRAGFLGS) OR NOT(UPC IN TYP)) ()-50*)
 | 
						|
20350 (*-04()               AND (LXDENRP IN [2,4,8,16]) THEN ()-04*)
 | 
						|
20360 (*+04()               AND (SHRINK(LXDENRP) IN [2,4,8,16]) THE ()+04*)
 | 
						|
20370                     BEGIN STATE := BITS;
 | 
						|
20380                       EXPONENT := (*-04() LXDENRP; ()-04*)(*+04() SHRINK(LXDENRP); ()+04*)
 | 
						|
20390                       LXDENRP := 0; GOTO 6;
 | 
						|
20400                     END
 | 
						|
20410                   ELSE BEGIN LXERR(ELX+6); LEX := LEXERROR; GOTO 99 END;
 | 
						|
20420 ()+43*)
 | 
						|
20430 (*-43()          IF (HEX IN TYP)(*-50() AND ((PRGPOINT IN PRAGFLGS) OR NOT(UPC IN TYP))()-50*)
 | 
						|
20440                  AND (TRUNC(LXDENRPREAL)-1 IN [1,3,7,15]) THEN
 | 
						|
20450                     BEGIN STATE := BITS; EXPONENT := TRUNC(LXDENRPREAL); LXDENRPREAL := 0; GOTO 6 END
 | 
						|
20460                  ELSE BEGIN LXERR(ELX+6); LEX := LEXERROR; GOTO 99 END;
 | 
						|
20470 ()-43*)
 | 
						|
20480                 BITS: (*SCAN DIGITS IN BITS-DENOTATION*)
 | 
						|
20490 (*+43()           IF (HEX IN TYP)(*-50() AND ((PRGPOINT IN PRAGFLGS) OR NOT(UPC IN TYP))()-50*) THEN
 | 
						|
20500                     BEGIN IF DIG IN TYP THEN DIGT := ORD(CHA)-ORD('0')
 | 
						|
20510                           ELSE DIGT := ORD(CHA)-ORD('A')+10;
 | 
						|
20520                     IF DIGT<EXPONENT THEN
 | 
						|
20530                       BEGIN SCALE := EXPONENT;
 | 
						|
20540                       WHILE SCALE<>1 DO
 | 
						|
20550                         IF LXDENRP<=MAX2 THEN
 | 
						|
20560                           BEGIN LXDENRP := LXDENRP*2; SCALE := SCALE DIV 2 END
 | 
						|
20570                                         (*RELIES ON THE FACT THAT *2 IS A SHIFT*)
 | 
						|
20580                         ELSE BEGIN OUTERR(ELX+10, ERRORR, NIL); LXDENRP := 0 END;
 | 
						|
20590                       LXDENRP := LXDENRP+DIGT
 | 
						|
20600                       END
 | 
						|
20610                     ELSE BEGIN LXERR(ELX+6); LEX := LEXERROR; GOTO 99 END
 | 
						|
20620                     END
 | 
						|
20630                   ELSE BEGIN LXDENMD := MDBITS; GOTO 7 END
 | 
						|
20640 ()+43*)
 | 
						|
20650 (*-43()           IF (HEX IN TYP) AND ((PRGPOINT IN PRAGFLGS) OR (NOT(UPC IN TYP))) THEN
 | 
						|
20660                     BEGIN IF DIG IN TYP THEN DIGT := ORD(CHA)-ORD('0')
 | 
						|
20670                           ELSE DIGT := ORD(CHA)-ORD('A')+10;
 | 
						|
20680                     IF DIGT<EXPONENT THEN
 | 
						|
20690                       BEGIN SCALE := EXPONENT;
 | 
						|
20700                       WHILE SCALE<>1 DO
 | 
						|
20710                         BEGIN LXDENRPREAL := LXDENRPREAL*2; SCALE := SCALE DIV 2 END;
 | 
						|
20720                       LXDENRPREAL := LXDENRPREAL+DIGT
 | 
						|
20730                       END
 | 
						|
20740                     ELSE BEGIN LXERR(ELX+6); LEX := LEXERROR; GOTO 99 END
 | 
						|
20750                     END
 | 
						|
20760                   ELSE BEGIN
 | 
						|
20770                       IF LXDENRPREAL-MAXINT-1<=MAXINT THEN
 | 
						|
20780                         IF LXDENRPREAL<=MAXINT THEN
 | 
						|
20790                            LXDENRP := TRUNC(LXDENRPREAL)
 | 
						|
20800                         ELSE LXDENRP := TRUNC(LXDENRPREAL-MAXINT-MAXINT-2)
 | 
						|
20810                       ELSE BEGIN OUTERR(ELX+10, ERRORR, NIL); LXDENRP:=0 END ;
 | 
						|
20820                         LXDENMD := MDBITS; GOTO 7 END
 | 
						|
20830 ()-43*)
 | 
						|
20840                 END; (*OF CASE STATE*)
 | 
						|
20844 (*+02()       SYMCNT := SYMCNT+1; STRNG[SYMCNT] := CHA; ()+02*)
 | 
						|
20850               NEXTCH(SKIPSPACES)  (*SKIPNONE IN RES*)
 | 
						|
20860               END (*OF LOOP*);
 | 
						|
20870           7: (*EXIT LABEL FOR LOOP*)
 | 
						|
20880 (*+61()     IF LONGSCNT<0 THEN SEMERR(ESE+6) ELSE IF LONGSCNT>1 THEN SEMERR(ESE+19); ()+61*)
 | 
						|
20884             IF LXDENMD=MDREAL THEN
 | 
						|
20886               BEGIN
 | 
						|
20890 (*-02()       LXCOUNT := WORDSPERREAL + SZADDR DIV SZWORD ()-02*)
 | 
						|
20892 (*+02()       LXDENRP := SYMCNT - ((SZADDR+SZREAL) DIV SZINT)*CHARPERWORD;
 | 
						|
20894               FINISHOFF(CHR(0));
 | 
						|
20896 ()+02*)
 | 
						|
20900 (*+61()       (*WORRY ABOUT LONG MODES*) ()+61*)
 | 
						|
20904               END
 | 
						|
20910             ELSE LXCOUNT := (SZADDR+SZINT) DIV SZWORD;
 | 
						|
20920             LXV := LXVPRDEN;
 | 
						|
20930             LXTOKEN := TKDENOT;
 | 
						|
20940             GOTO 88
 | 
						|
20950             END (*OF GETPRIMDEN*);
 | 
						|
20960   (*GETSTRGDEN*)
 | 
						|
20970           QUOTE: (*GETSTRGDEN*)
 | 
						|
20980             BEGIN
 | 
						|
20990             SRCSTCH := 'S';
 | 
						|
21000             SYMCNT := ((SZADDR+SZINT) DIV SZINT)*CHARPERWORD; (*ALLOWS ROOM FOR LXDENMD AND LXDENRP*)
 | 
						|
21010             WHILE TRUE DO
 | 
						|
21020               BEGIN
 | 
						|
21030               NEXTCH(SKIPEOL);
 | 
						|
21040               IF INDEX=EOFF THEN
 | 
						|
21050                 BEGIN LXERR(ELX+3); LEX := LEXERROR; GOTO 99 END
 | 
						|
21060               ELSE IF INDEX<>QUOTE THEN
 | 
						|
21070                 BEGIN
 | 
						|
21080 (*-50()         IF CHAC=LOWC THEN CHA := CHR(ORD(CHA)+32); ()-50*)
 | 
						|
21090                 IF SYMCNT<TAXLEN THEN
 | 
						|
21100                   BEGIN SYMCNT := SYMCNT+1; STRNG[SYMCNT] := CHA END
 | 
						|
21110                 ELSE (*NO ACTION*)
 | 
						|
21120                 END
 | 
						|
21130               ELSE
 | 
						|
21140                 BEGIN
 | 
						|
21150                 NEXTCH(SKIPNONE);
 | 
						|
21160                 IF INDEX=QUOTE THEN
 | 
						|
21170                   IF SYMCNT<TAXLEN THEN
 | 
						|
21180                     BEGIN SYMCNT := SYMCNT+1; STRNG[SYMCNT] := CHA END
 | 
						|
21190                   ELSE (*NO ACTION*)
 | 
						|
21200                 ELSE
 | 
						|
21210                   BEGIN
 | 
						|
21220                   SRCSTCH := ' ';
 | 
						|
21230                   IF INDEX<=SKIPSPACES THEN NEXTCH(SKIPSPACES);
 | 
						|
21240                   IF INDEX<>QUOTE THEN GOTO 8;
 | 
						|
21250                   SRCSTCH := 'S'
 | 
						|
21260                   END
 | 
						|
21270                 END
 | 
						|
21280               END (*OF LOOP*);
 | 
						|
21290            8: (*UPON RECOGNITION OF END OF STRING-DENOTATION*)
 | 
						|
21300             LXDENRP := SYMCNT-((SZADDR+SZINT)DIV SZINT)*CHARPERWORD;  (*LENGTH OF STRING*)
 | 
						|
21310             IF SYMCNT=((SZADDR+SZINT) DIV SZINT)*CHARPERWORD+1 THEN
 | 
						|
21320               BEGIN LXDENMD := MDCHAR;
 | 
						|
21330               LXDENRP := ORD(STRNG[((SZADDR+SZINT) DIV SZINT)*CHARPERWORD+1]);
 | 
						|
21340               LXV := LXVPRDEN; LXCOUNT := (SZADDR+SZINT) DIV SZWORD;
 | 
						|
21350               END
 | 
						|
21360             ELSE
 | 
						|
21370               BEGIN LXDENMD := MDSTRNG; FINISHOFF(CHR(0)); LXV := LXVSTRGDEN END;
 | 
						|
21380             LXTOKEN := TKDENOT;
 | 
						|
21390             GOTO 88
 | 
						|
21400             END (*OF GETSTRGDEN*);
 | 
						|
21410   (*GETOPR*)
 | 
						|
21420           PUNCT, PLSMIN, PRAG: (*GETOPR*)
 | 
						|
21430             BEGIN
 | 
						|
21440 (*+01()     IF CHA=':' THEN S := ORD('$')-ORD('+') ELSE S := ORD(CHA)-ORD('+');  ()+01*)
 | 
						|
21450 (*+25()     IF CHA=':' THEN S := ORD('$')-ORD('+') ELSE S := ORD(CHA)-ORD('+');  ()+25*)
 | 
						|
21460 (*-01() (*-25()     S := ORD(CHA)-ORD('!'); (*ASCII VERSION*)
 | 
						|
21462             IF CHA='%' THEN S := 23
 | 
						|
21465             IF CHA = '%' THEN S:=23 ELSE
 | 
						|
21470             IF CHA IN ['[',']','^','\'] THEN S:=S-55; ()-25*)  ()-01*)
 | 
						|
21480             NEXTCH(SKIPNONE);
 | 
						|
21490             WITH OPCHTABLE[S] DO
 | 
						|
21500               BEGIN
 | 
						|
21510               LEX := OTLEX;
 | 
						|
21520               S := OTNEXT
 | 
						|
21530               END;
 | 
						|
21540             WHILE S<>0 DO
 | 
						|
21550               WITH OPCHTABLE[S] DO
 | 
						|
21560                 IF CHA=OTCHAR THEN
 | 
						|
21570                   BEGIN
 | 
						|
21580                   NEXTCH(SKIPNONE);
 | 
						|
21590                   LEX := OTLEX;
 | 
						|
21600                   S := OTNEXT
 | 
						|
21610                   END
 | 
						|
21620                 ELSE S := OTALT;
 | 
						|
21630             IF LEX=LEXERROR THEN
 | 
						|
21640               BEGIN
 | 
						|
21650               NEXTCH(SKIPNONE);
 | 
						|
21660               LXERR(ELX+5);
 | 
						|
21670               END;
 | 
						|
21680             GOTO 99
 | 
						|
21690             END;
 | 
						|
21700   (*GETTAX*)
 | 
						|
21710           LETTER: (*GETTAX*)
 | 
						|
21720             BEGIN
 | 
						|
21730             (*IN RES STROPPING, NOENTER IS SET.
 | 
						|
21740               IF UPPER/LOWER STROP AND UPPER/LOWER OR IF RES
 | 
						|
21750               THEN USE HASHBOLD
 | 
						|
21760               ELSE*)
 | 
						|
21770             IF PRGPOINT IN PRAGFLGS THEN TTYPE:=[UPC, LOWC, DIG]
 | 
						|
21780                                      ELSE TTYPE:=[CHAC, DIG];
 | 
						|
21790             IF (PRGUPPER IN PRAGFLGS) AND (CHAC=UPC) THEN
 | 
						|
21800               BEGIN
 | 
						|
21810               LXV:=LXVTAB;
 | 
						|
21820               LXTOKEN:=TKBOLD;
 | 
						|
21830               LEVEL:=SKIPNONE
 | 
						|
21840               END
 | 
						|
21850             ELSE
 | 
						|
21860               BEGIN
 | 
						|
21870               LXV:=LXVTAG;
 | 
						|
21880               LXTOKEN:=TKTAG;
 | 
						|
21890               LEVEL:=SKIPSPACES
 | 
						|
21900               END
 | 
						|
21910             END (*OF GETTAX*);
 | 
						|
21920   (*GETBOLD*)
 | 
						|
21930           STROP: (*GETBOLD*)
 | 
						|
21940             BEGIN
 | 
						|
21950             NEXTCH(SKIPNONE);
 | 
						|
21960             IF INDEX=LETTER THEN
 | 
						|
21970               BEGIN
 | 
						|
21980               (*HASHBOLD*)
 | 
						|
21990             TTYPE:=[CHAC,DIG];
 | 
						|
22000               LXV := LXVTAB;
 | 
						|
22010               LXTOKEN := TKBOLD;
 | 
						|
22020               LEVEL := SKIPNONE
 | 
						|
22030               END
 | 
						|
22040             ELSE BEGIN LXERR(ELX+7); LEX := LEXERROR; GOTO 99 END
 | 
						|
22050             END (*OF GETBOLD*);
 | 
						|
22060   (*ENDOFFILE*)
 | 
						|
22070           EOFF: (*ENDOFFILE*)
 | 
						|
22080             BEGIN
 | 
						|
22090             LEX := LEXSTOP;
 | 
						|
22100             GOTO 99
 | 
						|
22110             END;
 | 
						|
22120           END (*OF CASE INDEX*);
 | 
						|
22130       77: (*SCANTAX*)
 | 
						|
22140       SYMCNT := 0;
 | 
						|
22150       REPEAT
 | 
						|
22160         IF SYMCNT<TAXLEN THEN
 | 
						|
22170           BEGIN SYMCNT := SYMCNT+1; STRNG[SYMCNT] := CHA END;
 | 
						|
22180         NEXTCH(LEVEL)
 | 
						|
22190       UNTIL TYP*TTYPE=[];
 | 
						|
22200 (*+11()
 | 
						|
22210       IF SYMCNT<11 THEN
 | 
						|
22220         BEGIN
 | 
						|
22230         LXCOUNT := 1;
 | 
						|
22240         WHILE SYMCNT<10 DO
 | 
						|
22250           BEGIN SYMCNT := SYMCNT+1; STRNG[SYMCNT] := ' ' END;
 | 
						|
22260         LEX := HT[(FUDGE1+FUDGE2) MOD HTSIZE];
 | 
						|
22270         WHILE LEX<>NIL DO
 | 
						|
22280           BEGIN
 | 
						|
22290           IF S10=LEX^.S10 THEN
 | 
						|
22300             IF LXTOKEN=LEX^.LXTOKEN THEN GOTO 99;
 | 
						|
22310           LEX := LEX^.LINK
 | 
						|
22320           END
 | 
						|
22330         END
 | 
						|
22340       ELSE     ()+11*)
 | 
						|
22350            FINISHOFF(' ');
 | 
						|
22360       88: (*HASHIN*)
 | 
						|
22370       LEX := HASHIN;
 | 
						|
22380       99: (*LABEL REACHED FROM EXITLX*)
 | 
						|
22390       UNTIL (LEX<>LEXERROR) OR INPRAGMENT;
 | 
						|
22400       LX := LEX;
 | 
						|
22410       END (*OF WITH CURRENTLEX*)
 | 
						|
22420     END;
 | 
						|
22430 (**)
 | 
						|
22440 (**)
 | 
						|
22450 PROCEDURE LEXALF(LEX: PLEX; VAR ALF: ALFA);
 | 
						|
22460 (*OBTAINS 1ST 10 CHARS OF IDENTIFIER IN LEX*)
 | 
						|
22470   VAR I: INTEGER;
 | 
						|
22480     BEGIN
 | 
						|
22490     IF LEX=NIL THEN ALF := '-UNNAMED- '
 | 
						|
22500     ELSE WITH LEX^ DO
 | 
						|
22510       IF LXCOUNT=0 THEN ALF := '-UNNAMED- '
 | 
						|
22520       ELSE
 | 
						|
22530 (*-11() IF LXCOUNT*CHARPERWORD<10 THEN
 | 
						|
22540           BEGIN ALF := '          ';
 | 
						|
22550           FOR I := 1 TO LXCOUNT*CHARPERWORD DO ALF[I] := S10[I];
 | 
						|
22560           END
 | 
						|
22570         ELSE
 | 
						|
22580  ()-11*)
 | 
						|
22590           ALF := S10;
 | 
						|
22600     END;
 | 
						|
22610 (**)
 | 
						|
22620 (**)
 | 
						|
22630 (*+01()
 | 
						|
22640 PROCEDURE SETPARAM(S: ALFA; COUNT: INTEGER);
 | 
						|
22650 (*SETS S AS THE COUNTTH PARAMETER IN THE COMMUNICATION AREA*)
 | 
						|
22660   VAR PARAMS: PACKED RECORD CASE SEVERAL OF
 | 
						|
22670           1: (INT: INTEGER);
 | 
						|
22680           2: (REC: PACKED ARRAY [1..7] OF CHAR;
 | 
						|
22690               CODE: 0..777777B);
 | 
						|
22700           3,4,5,6,7,8,9,10: ()
 | 
						|
22710           END;
 | 
						|
22720       P: PINTEGER;
 | 
						|
22730       I: INTEGER;
 | 
						|
22740     BEGIN WITH PARAMS DO
 | 
						|
22750       BEGIN
 | 
						|
22760       IF COUNT=0 THEN P := ASPTR(64B)
 | 
						|
22770       ELSE P := ASPTR(1+COUNT);
 | 
						|
22780       FOR I := 1 TO 7 DO
 | 
						|
22790         IF S[I]=' ' THEN REC[I] := CHR(0)
 | 
						|
22800         ELSE REC[I] := S[I];
 | 
						|
22810       CODE := 1; (*FOR COMMA*)
 | 
						|
22820       P^ := INT;
 | 
						|
22830       P := ASPTR(64B);
 | 
						|
22840       INT := P^;
 | 
						|
22850       CODE := COUNT;
 | 
						|
22860       P^ := INT
 | 
						|
22870       END
 | 
						|
22880     END;
 | 
						|
22890 (**)
 | 
						|
22900 (**)
 | 
						|
22910  ()+01*)
 | 
						|
22920 FUNCTION PARSIN: PLEX;
 | 
						|
22930 (*FUNCTION: SCAN A TOKEN FROM THE INPUT AND RETURN ITS LEXEME.
 | 
						|
22940     A TOKEN CONSISTS OF AN OPTIONAL PRAGMENT (PRAGMAT OR COMMENT)
 | 
						|
22950     FOLLOWED BY A SYMBOL.
 | 
						|
22960 *)
 | 
						|
22970   LABEL 9;
 | 
						|
22980   CONST SKIPDENS=PLSMIN;
 | 
						|
22990   VAR LEX, LEX2: PLEX;
 | 
						|
23000       PTR: PLEXQ;
 | 
						|
23010       GOCOUNT, I:  INTEGER;
 | 
						|
23020     BEGIN
 | 
						|
23030     (*PARSCLKS := PARSCLKS+1; LXCLOCK := LXCLOCK-CLOCK;*)
 | 
						|
23040     IF PLINPQ=NIL THEN
 | 
						|
23050     BEGIN
 | 
						|
23060     REPEAT
 | 
						|
23070       SRCSTCH := ' ';
 | 
						|
23080       LEX := LX;
 | 
						|
23090       WITH LEX^.LXV DO
 | 
						|
23100         BEGIN
 | 
						|
23110         IF (LXIO=LXIOCMMENT) OR (LXIO=LXIOPRAGMAT) THEN
 | 
						|
23120           BEGIN
 | 
						|
23130           IF LXIO=LXIOCMMENT THEN SRCSTCH := 'C'
 | 
						|
23140           ELSE SRCSTCH := 'P';
 | 
						|
23150           INPRAGMENT := TRUE; LEX2 := NIL;
 | 
						|
23160           REPEAT
 | 
						|
23170             IF INDEX=EOFF THEN
 | 
						|
23180               BEGIN OUTERR(ELX+4, ERRORR, LEX); GOTO 9 END
 | 
						|
23190             ELSE IF INDEX>=LETTER THEN
 | 
						|
23200               BEGIN
 | 
						|
23210               LEX2 := LX;
 | 
						|
23220               IF SRCSTCH='P' THEN
 | 
						|
23230   (*DOPRAG*)    WITH CURRENTLEX DO
 | 
						|
23232                 BEGIN
 | 
						|
23240 (*-11()         FOR I:=LXCOUNT*CHARPERWORD+1 TO 10 DO S10[I]:=' ';   ()-11*)
 | 
						|
23250                 IF S10='WARN      ' THEN PRAGFLGS := PRAGFLGS+[PRGWARN]
 | 
						|
23260                   ELSE IF S10='NOWARN    ' THEN PRAGFLGS := PRAGFLGS-[PRGWARN]
 | 
						|
23270                   ELSE IF S10='POINT     ' THEN PRAGFLGS := PRAGFLGS+[PRGPOINT]
 | 
						|
23280                                                                     -[PRGUPPER]
 | 
						|
23290                   ELSE IF S10='UPPER     ' THEN PRAGFLGS := PRAGFLGS+[PRGUPPER]
 | 
						|
23300                                                                     -[PRGPOINT]
 | 
						|
23310                   ELSE IF S10='LIST      ' THEN PRAGFLGS := PRAGFLGS+[PRGLIST]
 | 
						|
23320                   ELSE IF S10='NOLIST    ' THEN
 | 
						|
23330                     BEGIN
 | 
						|
23340                     PRAGFLGS := PRAGFLGS-[PRGLIST];
 | 
						|
23350                     LSTCNT := 100  (*TO FORCE NEW PAGE ON RESTARTING*)
 | 
						|
23360                     END
 | 
						|
23370                   ELSE IF (S10='PAGE      ') AND (PRGLIST IN PRAGFLGS) THEN
 | 
						|
23380                       LSTCNT := 55
 | 
						|
23390                   ELSE IF S10='GO        ' THEN
 | 
						|
23400                     BEGIN
 | 
						|
23410                     PRAGFLGS := PRAGFLGS+[PRGGO]; GOCOUNT := 0;
 | 
						|
23420 (*+01()
 | 
						|
23430                     REPEAT
 | 
						|
23440                       SETPARAM(S10, GOCOUNT); GOCOUNT := GOCOUNT+1;
 | 
						|
23450                       IF INDEX<=SKIPDENS THEN NEXTCH(SKIPDENS); LEX2 := LX
 | 
						|
23460                     UNTIL LEX2=LEX
 | 
						|
23470 ()+01*)
 | 
						|
23480                     END
 | 
						|
23490                   ELSE IF S10='NOGO      ' THEN PRAGFLGS := PRAGFLGS-[PRGGO]
 | 
						|
23500                (* ELSE IF S10='SPACE     ' THEN
 | 
						|
23510                     BEGIN
 | 
						|
23520                     REPEAT LEX2 := LEX
 | 
						|
23530                     UNTIL (LXTOKEN=TKDENOT) OR (LEX2=LEX);
 | 
						|
23540                     IF LXTOKEN=TKDENOT THEN WORDS := LXDENRP
 | 
						|
23550                     END
 | 
						|
23560                *)
 | 
						|
23570                 END
 | 
						|
23580             END
 | 
						|
23590             ELSE NEXTCH(SKIPDENS)  (*MAYBE DIFFERENT IN RES*)
 | 
						|
23600           UNTIL LEX2=LEX;  (*MATCHING PRAGMENT-SYMBOL*)
 | 
						|
23610           INPRAGMENT := FALSE;
 | 
						|
23620       9: (*LABEL REACHED AFTER ELX+4*)
 | 
						|
23630           END
 | 
						|
23640         END
 | 
						|
23650     UNTIL SRCSTCH=' ';
 | 
						|
23660     IF LEX^.LXV.LXIO=LXIOLONG THEN
 | 
						|
23670       LONGSCNT := LONGSCNT+1
 | 
						|
23680     ELSE IF LEX^.LXV.LXIO=LXIOSHORT THEN
 | 
						|
23690       LONGSCNT := LONGSCNT-1
 | 
						|
23700     ELSE LONGSCNT := 0;
 | 
						|
23710     PARSIN := LEX
 | 
						|
23720     END
 | 
						|
23730     ELSE WITH PLINPQ^ DO
 | 
						|
23740       BEGIN
 | 
						|
23750       PARSIN := DATA1;
 | 
						|
23760       PTR := PLINPQ; PLINPQ := LINK; DISPOSE(PTR)
 | 
						|
23770       END;
 | 
						|
23780     (*LXCLOCK := LXCLOCK+CLOCK; LXCLOCKS := LXCLOCKS+1*)
 | 
						|
23790     END;
 | 
						|
23800 (**)
 | 
						|
23810 ()+82*)
 | 
						|
23820 (*+81()
 | 
						|
23830 (**)
 | 
						|
23840                 (*STACK HANDLING*)
 | 
						|
23850                 (****************)
 | 
						|
23860 (**)
 | 
						|
23870 PROCEDURE SUBSAVE;
 | 
						|
23880     BEGIN SRSEMP := SRSEMP+1; SRSTK[SRSEMP].SUBP := SRSUBP; SRSUBP := SRSEMP END;
 | 
						|
23890 (**)
 | 
						|
23900 (**)
 | 
						|
23910 PROCEDURE SUBREST;
 | 
						|
23920     BEGIN SRSEMP := SRSUBP-1; SRSUBP := SRSTK[SRSEMP+1].SUBP END;
 | 
						|
23930 (**)
 | 
						|
23940 (**)
 | 
						|
23950 FUNCTION SRPOPMD: MODE;
 | 
						|
23960     BEGIN SRPOPMD := SRSTK[SRSEMP].MD; SRSEMP := SRSEMP-1 END;
 | 
						|
23970 (**)
 | 
						|
23980 (**)
 | 
						|
23990 PROCEDURE SCPUSH(M: MODE);
 | 
						|
24000   VAR SC: PMODECHAIN;
 | 
						|
24010     BEGIN NEW(SC); WITH SC^ DO
 | 
						|
24020       BEGIN LINK := SCL; SCMODE := M END;
 | 
						|
24030    SCL := SC
 | 
						|
24040     END;
 | 
						|
24050 (**)
 | 
						|
24060 (**)
 | 
						|
24070 FUNCTION SCPOP: MODE;
 | 
						|
24080   VAR SC: PMODECHAIN;
 | 
						|
24090     BEGIN SCPOP := SCL^.SCMODE; SC := SCL; SCL := SCL^.LINK; DISPOSE(SC) END;
 | 
						|
24100 (**)
 | 
						|
24110 (**)
 | 
						|
24120 ()+81*)
 | 
						|
24130 (*+84()
 | 
						|
24140                 (*MODE CREATION*)
 | 
						|
24150                 (***************)
 | 
						|
24160 (**)
 | 
						|
24170 PROCEDURE FIND(VAR SEARCHLIST: MODE; RECURSIVE: BOOLEAN; LENGTH: CNTR);
 | 
						|
24180 (*REPLACES THE FIRST MODE OF SEARCHLIST BY ANY DUPLICATES OF ITSELF*)
 | 
						|
24190   VAR PREV, THIS, NEXT: MODE;
 | 
						|
24200   FUNCTION COMPARE(M1, M2: MODE; ASSUMPTION: PMODECHAIN; SEARCHDEEP: BOOLEAN): BOOLEAN;
 | 
						|
24210   (*IF SEARCHDEEP THEN
 | 
						|
24220         RETURNS TRUE IFF M1 AND M2 ARE EQUIVALENT UNDER THE ASSUMPTION THAT
 | 
						|
24230         NIL AND ALL MODES IN ASSUMPTION ARE EQUIVALENT TO SEARCHLIST
 | 
						|
24240     ELSE
 | 
						|
24250         RETURNS TRUE IFF M1=M2
 | 
						|
24260   *)
 | 
						|
24270     VAR FOUND: BOOLEAN;
 | 
						|
24280         I: INTEGER;
 | 
						|
24290         APTR: PMODECHAIN;
 | 
						|
24300       BEGIN
 | 
						|
24310       IF M1=M2 THEN COMPARE := TRUE
 | 
						|
24320       ELSE IF SEARCHDEEP THEN
 | 
						|
24330         IF M1=NIL THEN
 | 
						|
24340           IF RECURSIVE THEN
 | 
						|
24350             BEGIN
 | 
						|
24360             APTR := ASSUMPTION; FOUND := FALSE;
 | 
						|
24370             WHILE (APTR<>NIL) AND NOT FOUND DO WITH APTR^ DO (*SCAN ASSUMPTIONS*)
 | 
						|
24380               BEGIN FOUND := SCMODE=M2; APTR := LINK END;
 | 
						|
24390             COMPARE := FOUND;
 | 
						|
24400             IF NOT FOUND THEN (*MAKE NEW ASSUMPTION*)
 | 
						|
24410               BEGIN
 | 
						|
24420               NEW(APTR);
 | 
						|
24430               APTR^.LINK := ASSUMPTION; APTR^.SCMODE := M2;
 | 
						|
24440               COMPARE := COMPARE(SEARCHLIST, M2, APTR, TRUE);
 | 
						|
24450               DISPOSE(APTR)
 | 
						|
24460               END
 | 
						|
24470             END
 | 
						|
24480           ELSE COMPARE := FALSE
 | 
						|
24490         ELSE IF M2=NIL THEN COMPARE := COMPARE(NIL, M1, ASSUMPTION, SEARCHDEEP)
 | 
						|
24500         ELSE WITH M1^ DO IF (MDV.MDCNT=M2^.MDV.MDCNT) AND (MDV.MDID=M2^.MDV.MDID) THEN
 | 
						|
24510           BEGIN
 | 
						|
24520           IF MDV.MDID IN [MDIDPROC, MDIDPASC, MDIDREF, MDIDROW] THEN
 | 
						|
24530             FOUND := COMPARE(MDPRRMD, M2^.MDPRRMD, ASSUMPTION, RECURSIVE)
 | 
						|
24540           ELSE FOUND := TRUE;
 | 
						|
24550           IF MDV.MDID IN [MDIDPROC, MDIDPASC] THEN
 | 
						|
24560             FOR I := 0 TO MDV.MDCNT-1 DO
 | 
						|
24570               FOUND := FOUND AND COMPARE(MDPRCPRMS[I], M2^.MDPRCPRMS[I], ASSUMPTION, RECURSIVE)
 | 
						|
24580           ELSE IF MDV.MDID=MDIDSTRUCT THEN
 | 
						|
24590             FOR I := 0 TO MDV.MDCNT-1 DO WITH MDSTRFLDS[I] DO
 | 
						|
24600               FOUND := FOUND
 | 
						|
24610                 AND (MDSTRFLEX=M2^.MDSTRFLDS[I].MDSTRFLEX)
 | 
						|
24620                 AND COMPARE(MDSTRFMD, M2^.MDSTRFLDS[I].MDSTRFMD, ASSUMPTION, RECURSIVE);
 | 
						|
24630           COMPARE := FOUND
 | 
						|
24640           END
 | 
						|
24650         ELSE COMPARE := FALSE
 | 
						|
24660       ELSE COMPARE := FALSE
 | 
						|
24670       END; (*COMPARE*)
 | 
						|
24680     BEGIN (*FIND*)
 | 
						|
24690     PREV := SEARCHLIST;
 | 
						|
24700     THIS := SEARCHLIST^.MDLINK; (*FIRST MODE TO BE TESTED*)
 | 
						|
24710     WHILE THIS<>NIL DO WITH THIS^ DO
 | 
						|
24720       BEGIN
 | 
						|
24730       NEXT := MDLINK;
 | 
						|
24740       IF COMPARE(SEARCHLIST, THIS, NIL, TRUE) THEN (*MOVE THIS TO START OF SEARCHLIST*)
 | 
						|
24750         BEGIN
 | 
						|
24760         PREV^.MDLINK := NEXT;
 | 
						|
24770         MDLINK := SEARCHLIST^.MDLINK;
 | 
						|
24780         IF PREV=SEARCHLIST THEN PREV := THIS;
 | 
						|
24790         EDISPOSE(SEARCHLIST, LENGTH+MODE1SIZE);
 | 
						|
24800         SEARCHLIST := THIS;
 | 
						|
24810         THIS := NEXT;
 | 
						|
24820         END
 | 
						|
24830       ELSE
 | 
						|
24840         BEGIN PREV := THIS; THIS := NEXT  END;
 | 
						|
24850       END;
 | 
						|
24860     END;
 | 
						|
24870 (**)
 | 
						|
24880 (**)
 | 
						|
24890 FUNCTION FINDREF(M: MODE): MODE;
 | 
						|
24900 (*FIND, OR CREATE, A MODE TABLE ENTRY FOR .REF M*)
 | 
						|
24910   VAR CURRENTMD: MODE;
 | 
						|
24920     BEGIN
 | 
						|
24930     ENEW(CURRENTMD, MODE1SIZE);
 | 
						|
24940     WITH CURRENTMD^ DO
 | 
						|
24950       BEGIN
 | 
						|
24960       MDV := MDVREF; MDPRRMD := M;
 | 
						|
24970       MDLINK := REFL; REFL := CURRENTMD
 | 
						|
24980       END;
 | 
						|
24990     FIND(REFL, FALSE, 0);
 | 
						|
25000     FINDREF := REFL
 | 
						|
25010     END;
 | 
						|
25020 (**)
 | 
						|
25030 (**)
 | 
						|
25040 FUNCTION FINDROW(M: MODE; CNT: CNTR): MODE;
 | 
						|
25050 (*FIND, OR CREATE, A MODE TABLE ENTRY FOR ROWS OF M*)
 | 
						|
25060   VAR CURRENTMD: MODE;
 | 
						|
25070     BEGIN
 | 
						|
25080     IF CNT<=0 THEN FINDROW := M
 | 
						|
25090     ELSE BEGIN
 | 
						|
25100       ENEW(CURRENTMD, MODE1SIZE);
 | 
						|
25110       WITH CURRENTMD^ DO
 | 
						|
25120         BEGIN
 | 
						|
25130         MDV := MDVROW; MDPRRMD := M; MDV.MDCNT := CNT;
 | 
						|
25140         IF M<>NIL THEN
 | 
						|
25150           BEGIN MDV.MDIO := M^.MDV.MDIO; MDV.MDSCOPE := M^.MDV.MDSCOPE END;
 | 
						|
25152         IF M^.MDV.MDID IN [MDIDOUT..MDIDINB] THEN MDV.MDPILE := FALSE;
 | 
						|
25160         MDLINK := ROWL; ROWL := CURRENTMD
 | 
						|
25170         END;
 | 
						|
25180       FIND(ROWL, FALSE, 0);
 | 
						|
25190       FINDROW := ROWL
 | 
						|
25200       END
 | 
						|
25210     END;
 | 
						|
25220 (**)
 | 
						|
25230 (**)
 | 
						|
25240 PROCEDURE FINDPRC(RESMD: MODE; CNT: CNTR; CP: CODEPROC);
 | 
						|
25250 (*FIND, OR CREATE, A MODE TABLE ENTRY FOR A .PROC MODE.
 | 
						|
25260   RESMD IS THE RESULT MODE. THE PARAMETER MODES, IF ANY, ARE ON THE SUBSTACK
 | 
						|
25270 *)
 | 
						|
25280   VAR CURRENTMD: MODE;
 | 
						|
25290       LENGTH, I: INTEGER;
 | 
						|
25300     BEGIN
 | 
						|
25310     LENGTH := CNT*SZADDR;
 | 
						|
25320     ENEW(CURRENTMD, LENGTH+MODE1SIZE);
 | 
						|
25330     WITH CURRENTMD^ DO
 | 
						|
25340       BEGIN
 | 
						|
25350       CASE CP OF
 | 
						|
25360         PROC: BEGIN MDV := MDVPROC; MDLINK := PROCL; PROCL := CURRENTMD END;
 | 
						|
25370         PASC: BEGIN MDV := MDVPASC; MDLINK := PASCL; PASCL := CURRENTMD END;
 | 
						|
25390         END;
 | 
						|
25400       MDPRRMD := RESMD; MDV.MDCNT := CNT; MDV.MDDEPROC := CNT=0;
 | 
						|
25410       FOR I := 0 TO CNT-1 DO (*COPY PARAMETERS*)
 | 
						|
25420         MDPRCPRMS[I] := SRSTK[SRSUBP+1+I].MD;
 | 
						|
25430       SUBREST
 | 
						|
25440       END;
 | 
						|
25450     SRSEMP := SRSEMP+1; WITH SRSTK[SRSEMP] DO
 | 
						|
25460       CASE CP OF
 | 
						|
25470         PROC: BEGIN FIND(PROCL, FALSE, LENGTH); MD := PROCL END;
 | 
						|
25480         PASC: BEGIN FIND(PASCL, FALSE, LENGTH); MD := PASCL END;
 | 
						|
25500         END
 | 
						|
25510     END;
 | 
						|
25520 (**)
 | 
						|
25530 (**)
 | 
						|
25540 PROCEDURE FINSTRLEN(M: MODE);
 | 
						|
25550 (*FUNCTION: FILLS IN MDLEN, MDSCOPE AND MDIO FIELDS OF MODE,
 | 
						|
25560     IF ENOUGH INFORMATION IS AVAILABLE.
 | 
						|
25570 *)
 | 
						|
25580   LABEL 7;
 | 
						|
25590   VAR TOTAL: INTEGER; IO, SCOPE: BOOLEAN;
 | 
						|
25600     I: INTEGER;
 | 
						|
25610     BEGIN
 | 
						|
25620     WITH M^ DO
 | 
						|
25630       IF MDV.MDLEN=0 THEN
 | 
						|
25640         BEGIN (*LENGTH HAS NOT BEEN CALCULATED BEFORE*)
 | 
						|
25650         TOTAL := 0; IO := TRUE; SCOPE := FALSE;
 | 
						|
25660         FOR I := MDV.MDCNT-1 DOWNTO 0 DO
 | 
						|
25670           WITH MDSTRFLDS[I] DO
 | 
						|
25680             IF MDSTRFMD=NIL THEN GOTO 7
 | 
						|
25690             ELSE BEGIN
 | 
						|
25700               IF MDSTRFMD^.MDV.MDLEN=0 THEN GOTO 7;
 | 
						|
25710               IO := IO AND MDSTRFMD^.MDV.MDIO;
 | 
						|
25720               SCOPE := SCOPE OR MDSTRFMD^.MDV.MDSCOPE;
 | 
						|
25730               TOTAL := TOTAL+MDSTRFMD^.MDV.MDLEN
 | 
						|
25740               END;
 | 
						|
25750         MDV.MDIO := IO; MDV.MDLEN := TOTAL; MDV.MDSCOPE := SCOPE
 | 
						|
25760         END;
 | 
						|
25770  7: END;
 | 
						|
25780 (**)
 | 
						|
25790 (**)
 | 
						|
25800 PROCEDURE FINSTRUCT(CNT: CNTR);
 | 
						|
25810 (*FIND, OR CREATE, A MODE TABLE ENTRY FOR A .STRUCT MODE.
 | 
						|
25820   THE FIELDS ARE ALREADY ON THE SUBSTACK.
 | 
						|
25830 *)
 | 
						|
25840   VAR CURRENTMD: MODE;
 | 
						|
25850       LENGTH, I: INTEGER;
 | 
						|
25860     BEGIN
 | 
						|
25870 (*+01() LENGTH := SZADDR*CNT;   ()+01*)
 | 
						|
25880 (*-01() LENGTH := 2*SZADDR*CNT; ()-01*)
 | 
						|
25890     ENEW(CURRENTMD, LENGTH+MODE1SIZE);
 | 
						|
25900     WITH CURRENTMD^ DO
 | 
						|
25910       BEGIN
 | 
						|
25920       MDV := MDVSTRUCT; MDSTRSDB := 0; MDV.MDCNT := CNT;
 | 
						|
25930       FOR I := 0 TO CNT-1 DO WITH MDSTRFLDS[I] DO
 | 
						|
25940         BEGIN MDSTRFMD := SRSTK[SRSUBP+1+2*I].MD; MDSTRFLEX := SRSTK[SRSUBP+2+2*I].LEX END;
 | 
						|
25950       SUBREST;
 | 
						|
25960       MDLINK := STRUCTL; STRUCTL := CURRENTMD
 | 
						|
25970       END;
 | 
						|
25980     FIND(STRUCTL, FALSE, LENGTH);
 | 
						|
25990     SRSEMP := SRSEMP+1; WITH SRSTK[SRSEMP] DO
 | 
						|
26000       BEGIN MD := STRUCTL; FINSTRLEN(MD) END
 | 
						|
26010     END;
 | 
						|
26020 (**)
 | 
						|
26030 (**)
 | 
						|
26040 PROCEDURE NEWFIELD(LEX: PLEX);
 | 
						|
26050 (*FUNCTION: CALLED FROM SR07A AND SR07B TO PROCESS ANOTHER FIELD-SELECTOR IN A DECLARER*)
 | 
						|
26060   VAR ISLEX: BOOLEAN;
 | 
						|
26070       SEMP: -1..SRSTKSIZE;
 | 
						|
26080     BEGIN
 | 
						|
26090     ISLEX := FALSE;
 | 
						|
26100     SEMP := SRSUBP+1;
 | 
						|
26110     WHILE SEMP<=SRSEMP DO
 | 
						|
26120       BEGIN
 | 
						|
26130       IF ISLEX THEN
 | 
						|
26140         IF SRSTK[SEMP].LEX=LEX THEN SEMERRP(ESE+01, LEX);
 | 
						|
26150       ISLEX := NOT ISLEX;
 | 
						|
26160       SEMP := SEMP+1
 | 
						|
26170       END;
 | 
						|
26180     SRSEMP := SRSEMP+1; SRSTK[SRSEMP].LEX := LEX
 | 
						|
26190     END;
 | 
						|
26200 (**)
 | 
						|
26210 (**)
 | 
						|
26220 PROCEDURE RECURFIX(VAR BASEM: MODE);
 | 
						|
26230 (*BASEM IS THE MODE TO BE DEFINED IN A RECURSIVE MODE-DEFINITION.
 | 
						|
26240   IT IS AT THE START OF ITS APPROPRIATE MODE LIST.
 | 
						|
26250   IT IS REPLACED AT THE START OF THAT LIST BY ANY OTHER MODE EQUIVALENT
 | 
						|
26260   TO ITSELF, AND THEN ALL APPLIED OCCURRENCES OF THE MODE INDICATION WITHIN
 | 
						|
26270   IT ARE REPLACED BY THE NEW BASEM.
 | 
						|
26280 *)
 | 
						|
26290   FUNCTION FIXM(M: MODE): MODE;
 | 
						|
26300     VAR I: INTEGER;
 | 
						|
26310       BEGIN
 | 
						|
26320       IF M=NIL THEN FIXM := BASEM
 | 
						|
26330       ELSE WITH M^ DO
 | 
						|
26340         BEGIN
 | 
						|
26350         IF NOT MDV.MDRECUR THEN
 | 
						|
26360           BEGIN
 | 
						|
26370           IF MDV.MDID IN [MDIDPROC, MDIDPASC, MDIDREF, MDIDROW] THEN
 | 
						|
26380             MDPRRMD := FIXM(MDPRRMD);
 | 
						|
26390           IF MDV.MDID IN [MDIDPROC, MDIDPASC] THEN
 | 
						|
26400             FOR I := 0 TO MDV.MDCNT-1 DO
 | 
						|
26410               MDPRCPRMS[I] := FIXM(MDPRCPRMS[I])
 | 
						|
26420           ELSE IF MDV.MDID=MDIDSTRUCT THEN
 | 
						|
26430             BEGIN
 | 
						|
26440             FOR I := 0 TO MDV.MDCNT-1 DO WITH MDSTRFLDS[I] DO
 | 
						|
26450               MDSTRFMD := FIXM(MDSTRFMD);
 | 
						|
26460             FINSTRLEN(M)
 | 
						|
26470             END;
 | 
						|
26480           MDV.MDRECUR := TRUE
 | 
						|
26490           END;
 | 
						|
26500         FIXM := M
 | 
						|
26510         END
 | 
						|
26520       END; (*OF FIXM*)
 | 
						|
26530     BEGIN (*RECURFIX*)
 | 
						|
26540     WITH BASEM^ DO CASE MDV.MDID OF
 | 
						|
26550       MDIDREF: BEGIN FIND(REFL, TRUE, 0); BASEM := REFL END;
 | 
						|
26560       MDIDROW: BEGIN FIND(ROWL, TRUE, 0); BASEM := ROWL END;
 | 
						|
26570       MDIDPROC: BEGIN FIND(PROCL, TRUE, MDV.MDCNT); BASEM := PROCL END;
 | 
						|
26580       (*DON'T BOTHER WITH MDIDPASC FOR NOW*)
 | 
						|
26590       MDIDSTRUCT: BEGIN FIND(STRUCTL, TRUE,
 | 
						|
26600                                     (*+11() SZADDR*MDV.MDCNT ()+11*)
 | 
						|
26610                                     (*+12() 2*SZADDR*MDV.MDCNT ()+12*)
 | 
						|
26620                                     (*+13() 2*SZADDR*MDV.MDCNT ()+13*) );
 | 
						|
26630                   BASEM := STRUCTL END;
 | 
						|
26640       END;
 | 
						|
26650     BASEM := FIXM(BASEM)
 | 
						|
26660     END;
 | 
						|
26670 (**)
 | 
						|
26680 ()+84*)
 | 
						|
26690 (**)
 | 
						|
26700 (*+04()
 | 
						|
26710 BEGIN SIN; S1
 | 
						|
26720 END.
 | 
						|
26730 ()+04*)
 |