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*)
 |