1220 lines
		
	
	
	
		
			45 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			1220 lines
		
	
	
	
		
			45 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
| 70000              (*    COPYRIGHT 1983 C.H.LINDSEY,  UNIVERSITY OF MANCHESTER  *)
 | |
| 70010 (*+85()
 | |
| 70020 (**)
 | |
| 70030                 (*SEMANTIC ROUTINES*)
 | |
| 70040                 (*******************)
 | |
| 70050 (**)
 | |
| 70060 PROCEDURE INITSR;
 | |
| 70070   (*FUNCTION: PERFORM PER-COMPILATION INITIALIZATION REQUIRED BY SEMANTIC ROUTINES*)
 | |
| 70080     BEGIN
 | |
| 70090      SCPUSH(MDERROR);
 | |
| 70100     RTSTACK := NIL;
 | |
| 70110     RGINFO := [];
 | |
| 70120     RGSTATE := 16;
 | |
| 70130     RGLEV := 0;
 | |
| 70140     DCIL := NIL;
 | |
| 70150     DCLMODE := MDABSENT;
 | |
| 70160     DCLPRVMODE := MDABSENT;
 | |
| 70170     PSCOUNT := 0;
 | |
| 70180     NEW(RANGEL); RANGEL^.RGRTSTACK := RTSTACK;
 | |
| 70190     BALFLAG := FALSE;
 | |
| 70200     NEW(ROUTNL); WITH ROUTNL^ DO
 | |
| 70210 (*-02() BEGIN RNLEVEL := 0; (*AND MAYBE SOME OTHERS*) END;  ()-02*)
 | |
| 70220 (*+02() BEGIN RNLEVEL := 255; (*AND MAYBE SOME OTHERS*) END;  ()+02*)
 | |
| 70230     CURLEB := 0;
 | |
| 70240     SRSUBP := 0;
 | |
| 70250     SRSEMP := -1;
 | |
| 70260     RTSTKDEPTH := 0;
 | |
| 70270     DCLDEFN := [];
 | |
| 70280     END;
 | |
| 70290 (**)
 | |
| 70300 FUNCTION MAKESUBSTACK (N:INTEGER; M:MODE):PSB;
 | |
| 70310   (*PLACES A SEMBLOCK (FOR A RESULT) WITH SBMODE=M, TOGETHER WITH A SUBSTACK MARKER
 | |
| 70320     N LEVEL BELOW SRSEMP*)
 | |
| 70330   VAR I : INTEGER;
 | |
| 70340       SBB:PSB;
 | |
| 70350   BEGIN
 | |
| 70360   FOR I := 0 TO N-1 DO SRSTK[SRSEMP+2-I].SB:=SRSTK[SRSEMP-I].SB;
 | |
| 70370   SRSEMP:=SRSEMP-N;
 | |
| 70380   MAKESUBSTACK:=PUSHSB(M); UNSTACKSB;
 | |
| 70390   SUBSAVE;
 | |
| 70400   SRSEMP:=SRSEMP+N
 | |
| 70410   END;
 | |
| 70420 (**)
 | |
| 70430 FUNCTION ALLOC(N: OFFSETR): OFFSETR;
 | |
| 70440 (*FUNCTION: ALLOCATES A BLOCK OF N WORDS ON THE CURRENT INVOCATION BLOCK;
 | |
| 70450     RETURNS THE OFFSET OF THE FIRST WORD.
 | |
| 70460 *)
 | |
| 70470     BEGIN
 | |
| 70480     WITH ROUTNL^ DO
 | |
| 70490       BEGIN
 | |
| 70510 (*-41() ALLOC := CURID; CURID := CURID+N; ()-41*)
 | |
| 70520 (*+41() CURID := CURID+N; ALLOC := CURID; ()+41*)
 | |
| 70530       IF ABS(RNLENIDS)<ABS(CURID) THEN RNLENIDS := CURID;
 | |
| 70540       END
 | |
| 70550     END;
 | |
| 70560 (**)
 | |
| 70570 (**)
 | |
| 70580 FUNCTION FINDSTATE: STATE;
 | |
| 70590 (*FUNCTION: DETERMINES THE STATE IMPLIED BY THE DEFINITION CURRENTLY BEING PROCESSED*)
 | |
| 70600   VAR S: STATE;
 | |
| 70610     BEGIN
 | |
| 70620     WITH DCLMODE^ DO
 | |
| 70630       BEGIN
 | |
| 70640       IF (DCLDEFN=[STINIT (*FOR STDIDTY*)]) OR (DCLPARM IN RGINFO) THEN
 | |
| 70650         S := DLASCR
 | |
| 70660       ELSE IF MDV.MDID=MDIDROW THEN
 | |
| 70670         S := DLMULT
 | |
| 70680       ELSE IF MDV.MDID=MDIDSTRUCT THEN
 | |
| 70690         S := DLSTRUCT
 | |
| 70700       ELSE S := DLASCR;
 | |
| 70710       IF S<>DLASCR THEN (*VARIABLE STRUCTS OR ROWS*)
 | |
| 70720         BEGIN
 | |
| 70730         IF DCLDEFN=[STINIT, STVAR] THEN S := S+4;
 | |
| 70740         IF MDV.MDRECUR THEN S := S+1
 | |
| 70750         END
 | |
| 70760       ELSE
 | |
| 70770         BEGIN
 | |
| 70780         IF DCLDEFN=[STVAR] THEN S := DLVAREMPTY;
 | |
| 70790         IF (STINIT IN DCLDEFN) AND (MDV.MDID=MDIDPROC) THEN S:= 15
 | |
| 70800         ELSE IF (MDV.MDID=MDIDREF) AND NOT(DCLPARM IN RGINFO) THEN S := S+2
 | |
| 70810         ELSE IF MDV.MDPILE THEN S := S+1
 | |
| 70820         END;
 | |
| 70830       FINDSTATE := S
 | |
| 70840       END
 | |
| 70850     END;
 | |
| 70860 (* VALUES OF STATES:
 | |
| 70870               0
 | |
| 70880    DLVAREMPTY 1 NONSTOWED VAR NOT INIT
 | |
| 70890               2 NONSTOWED PILE
 | |
| 70900               3 NONSTOWED .REF MODE
 | |
| 70910    DLSTRUCT=
 | |
| 70920    DLACTION   4 .STRUCT VAR
 | |
| 70930               5 .STRUCT VAR RECURSIVE
 | |
| 70940    DLMULT     6 MULT VAR
 | |
| 70950               7 MULT VAR RECURSIVE
 | |
| 70960    DLUNITS    8 .STRUCT VAR INITIALIZED
 | |
| 70970               9 .STRUCT VAR INITIALIZED RECURSIVE
 | |
| 70980    DLBNDS    10 MULT VAR INITIALIZED
 | |
| 70990    DLDESC    11 MULT VAR INITIALIZED RECURSIVE
 | |
| 71000    DLASCR    12 IDENTITY OR NONSTOWED VAR INITIALIZED
 | |
| 71010              13 DITTO PILE
 | |
| 71020              14 DITTO .REF MODE
 | |
| 71030              15 PROCEDURES
 | |
| 71040   ANY STATE >= 16 REPRESENTS THAT STATE MOD 16 WITH RGNEXTFREE SET CORRECTLY.
 | |
| 71050 *)
 | |
| 71060 (**)
 | |
| 71070 (**)
 | |
| 71080 FUNCTION ALLOCIND(M: MODE): OFFSETR;
 | |
| 71090 (*FUNCTION: ALLOCATES STACK SPACE FOR A NEWLY DECLARED INDICATOR
 | |
| 71100     AND ATTENDS TO ITS INITIALIZATION.
 | |
| 71110 *)
 | |
| 71120   VAR NEWSTATE: STATE;
 | |
| 71130       LEN: 0..MAXSIZE;
 | |
| 71140     BEGIN
 | |
| 71150     IF M^.MDV.MDPILE THEN LEN := SZADDR ELSE LEN := M^.MDV.MDLEN;
 | |
| 71160     WITH DCLMODE^ DO
 | |
| 71170       BEGIN
 | |
| 71180       IF (PSCOUNT=0) OR (MDV.MDPILE<>(DCLPILE IN RGINFO)) THEN
 | |
| 71190         BEGIN (*START OF A NEW GROUP OF DECLARATIONS ALL ON OR ALL OFF THE PILE*)
 | |
| 71200         BRKASCR;
 | |
| 71210         IF RGSTATE IN [DLASCR..15] THEN CGFIXRG;
 | |
| 71220         IF DCLMODE^.MDV.MDPILE THEN RGINFO := RGINFO+[DCLPILEDECS];
 | |
| 71230         IF MDV.MDPILE THEN RGINFO := RGINFO+[DCLPILE] ELSE RGINFO := RGINFO-[DCLPILE]
 | |
| 71240         END;
 | |
| 71250       NEWSTATE := FINDSTATE;
 | |
| 71260       IF (NEWSTATE<>(RGSTATE MOD 16)) OR ((MDV.MDID=MDIDSTRUCT) AND (DCLMODE<>DCLPRVMODE)) THEN
 | |
| 71270         BEGIN (*TIDY UP PREVIOUS DECLARATIONS*)
 | |
| 71280         IF (DCLMODE=DCLPRVMODE) AND ((RGSTATE MOD 16) IN [6,7,10,11]) AND (NEWSTATE IN [6,7,10,11]) THEN
 | |
| 71290           RGINFO := RGINFO+[DCLSAVEDESC];
 | |
| 71300         BRKASCR;
 | |
| 71310         IF RGSTATE>=16 THEN RGSTATE := NEWSTATE + 16 (*PRESERVE CODING *)
 | |
| 71320         ELSE               RGSTATE := NEWSTATE;
 | |
| 71330         RGINFO := RGINFO-[DCLSAVEDESC];
 | |
| 71340         END;
 | |
| 71350       PSCOUNT := PSCOUNT+LEN;
 | |
| 71360       TODOCOUNT := TODOCOUNT+LEN;
 | |
| 71370       DCLPRVMODE := DCLMODE;
 | |
| 71380       ALLOCIND := ALLOC(LEN);
 | |
| 71390       END;
 | |
| 71400     END;
 | |
| 71410 (**)
 | |
| 71420 (**)
 | |
| 71430 PROCEDURE DISALLOCIND;
 | |
| 71440   BEGIN
 | |
| 71450   (*INITIALISE STBLOCK *)
 | |
| 71460   WITH DCIL^,SRSTK[SRSEMP].SB^ DO
 | |
| 71470      BEGIN
 | |
| 71480      IF SBTYP IN [SBTPROC,SBTRPROC] THEN
 | |
| 71490         BEGIN
 | |
| 71500         STPTR:=SBXPTR;
 | |
| 71510         STLEVEL:=SBLEVEL;
 | |
| 71520         END
 | |
| 71530      ELSE
 | |
| 71540         STVALUE:=SBLEX;
 | |
| 71550      STDEFTYP:=STDEFTYP+[STCONST]-[STRCONST];
 | |
| 71560    (* UNDO PREVIOUS ALLOCIND *)
 | |
| 71570      PSCOUNT := PSCOUNT-SBLEN;
 | |
| 71580      TODOCOUNT := TODOCOUNT-SBLEN;
 | |
| 71590      CURID:=CURID-SBLEN;
 | |
| 71600      END;
 | |
| 71610    UNSTACKSB;
 | |
| 71620   END;
 | |
| 71630 (**)
 | |
| 71640 (**)
 | |
| 71650 PROCEDURE LOCRNGE;
 | |
| 71660 (*FUNCTION: TO MAKE THE CURRENT RANGE INTO A LOCAL RANGE*)
 | |
| 71670   VAR DUMMY: INTEGER;
 | |
| 71680     BEGIN
 | |
| 71690     IF NOT (DCLLOCRNG IN RGINFO) THEN
 | |
| 71700       WITH RANGEL^ DO
 | |
| 71710         BEGIN
 | |
| 71720         RGINFO := RGINFO+[DCLLOCRNG];  RGLEB:=CURLEB;
 | |
| 71730         IF DCLPARM IN RGINFO THEN
 | |
| 71740           CURLEB:=SIZIBBASE
 | |
| 71750         ELSE
 | |
| 71760           BEGIN
 | |
| 71770           CGFIXRG;
 | |
| 71780           CURLEB:=CURID;
 | |
| 71790           DUMMY := ALLOC(SIZLEBBASE);
 | |
| 71800           END;
 | |
| 71810         RGDEFN := DCLDEFN;
 | |
| 71820         RGMODE := DCLMODE;
 | |
| 71830         RGPRVMODE := DCLPRVMODE;
 | |
| 71840         RGTODOCOUNT := TODOCOUNT ;
 | |
| 71850         WITH ROUTNL^ DO RNLOCRG := RNLOCRG+1;
 | |
| 71860         IF DCLPARM IN RGINFO THEN
 | |
| 71870           BEGIN RGPSCOUNT := PSCOUNT; PSCOUNT := 0; END
 | |
| 71880         ELSE BEGIN
 | |
| 71890           IF DCLLOCGEN IN RGINFO THEN SEMERR(ESE+05);
 | |
| 71900           CGRGN;
 | |
| 71920           END;
 | |
| 71930         END
 | |
| 71940     END;
 | |
| 71950 (**)
 | |
| 71960 (**)
 | |
| 71970 PROCEDURE RANGENT;
 | |
| 71980 (*FUNCTION: CREATE RANGE BLOCK FOR NEW RANGE*)
 | |
| 71990   VAR R: PRANGE;
 | |
| 72000     BEGIN
 | |
| 72010     NEW(R);
 | |
| 72020     WITH R^ DO
 | |
| 72030       BEGIN
 | |
| 72040       RGLINK := RANGEL; RANGEL := R;
 | |
| 72050       RGINF := RGINFO; RGINFO := [];
 | |
| 72060       RGSTAT := RGSTATE;
 | |
| 72062       RGSTATE :=16;
 | |
| 72070       RGDCIL := DCIL; DCIL := NIL;
 | |
| 72080       RGLEV := RGLEV+1;
 | |
| 72082       IF RGLEV=2 THEN LOCRNGE;
 | |
| 72084         (*GLOBAL RANGE OF PROGRAM MUST ALWAYS BE LOCAL, BECAUSE STANDIN ETC. ARE EFFECTIVELY WITHIN IT*)
 | |
| 72090       RGRTSTACK := RTSTACK;
 | |
| 72100       END
 | |
| 72110     END;
 | |
| 72120 (**)
 | |
| 72130 (**)
 | |
| 72140 PROCEDURE INCROUTN(R: PROUTN; STB: PSTB);
 | |
| 72150 (*FUNCTION ADD ROUTN R TO ROUTNCHAIN STARTING AT STROUTN OF THE LABEL STB*)
 | |
| 72160   VAR PTR,TEMP: PROUTNCHAIN;
 | |
| 72170     BEGIN
 | |
| 72180       WITH R^ DO RNNONIC := RNNONIC+1;
 | |
| 72190       NEW(PTR);
 | |
| 72200       WITH PTR^ DO
 | |
| 72210         BEGIN LINK := NIL; DATA := R END;
 | |
| 72212       IF STB^.STROUTN=NIL THEN STB^.STROUTN := PTR
 | |
| 72214       ELSE
 | |
| 72216       BEGIN
 | |
| 72218         TEMP := STB^.STROUTN;
 | |
| 72220         WHILE TEMP^.LINK<>NIL DO
 | |
| 72222           TEMP:=TEMP^.LINK;
 | |
| 72224         TEMP^.LINK := PTR
 | |
| 72226       END
 | |
| 72228     END;
 | |
| 72230 (**)
 | |
| 72240 (**)
 | |
| 72250 PROCEDURE DECROUTN(R: PROUTN; MUSTFIX: BOOLEAN);
 | |
| 72260 (*FUNCTION: DISPOSE OF ROUTN, BUT ONLY AFTER ITS RNNONIC HAS REACHED ZERO*)
 | |
| 72270     BEGIN
 | |
| 72280     WITH R^ DO
 | |
| 72290       BEGIN RNNONIC := RNNONIC-1;
 | |
| 72300       IF RNNONIC<=0 THEN
 | |
| 72310         BEGIN
 | |
| 72320         IF MUSTFIX THEN CGRTE(R);
 | |
| 72330         DISPOSE(R)
 | |
| 72340         END
 | |
| 72350       END
 | |
| 72360     END;
 | |
| 72370 (**)
 | |
| 72380 (**)
 | |
| 72390 PROCEDURE ROUTNNT;
 | |
| 72400 (*FUNCTION: CREATE ROUTN BLOCK FOR NEW ROUTINE*)
 | |
| 72410   VAR R: PROUTN;
 | |
| 72420       DUMMY: INTEGER;
 | |
| 72430       IDLEX: PLEX;
 | |
| 72440     BEGIN
 | |
| 72450     NEW(R);
 | |
| 72460     WITH R^ DO
 | |
| 72470       BEGIN
 | |
| 72480         RNLEVEL := ROUTNL^.RNLEVEL+1; RNNECLEV := 0;
 | |
| 72490       RNLINK := ROUTNL; ROUTNL := R;
 | |
| 72500       RNLENSTK := 0; RNLENIDS := 0;
 | |
| 72510       RNLOCRG := 0; RNNECLOCRG := 0;
 | |
| 72520       RNSTKDEPTH := RTSTKDEPTH; RTSTKDEPTH := 0;
 | |
| 72530       RNRTSTACK := RTSTACK;
 | |
| 72540       RTSTACK := NIL;
 | |
| 72550       RNNONIC := 1;
 | |
| 72560       RNCURID := CURID; CURID := 0;
 | |
| 72570       RANGENT;
 | |
| 72580       RGINFO := RGINFO+[DCLPARM];
 | |
| 72590       LOCRNGE
 | |
| 72600       END
 | |
| 72610     END;
 | |
| 72620 (**)
 | |
| 72630 (**)
 | |
| 72640 PROCEDURE NECENV(STB: PSTB);
 | |
| 72650 (*FUNCTION: ADJUST THE NECESSARY ENVIRON OF THE CURRENT ROUTINES TO ALLOW FOR STB*)
 | |
| 72660   VAR R: PROUTN;
 | |
| 72670     BEGIN
 | |
| 72680     R := ROUTNL;
 | |
| 72690     WITH STB^ DO
 | |
| 72700       WHILE STLEVEL<R^.RNLEVEL DO WITH R^ DO
 | |
| 72710         BEGIN
 | |
| 72720         IF RNNECLEV<STLEVEL THEN
 | |
| 72730           BEGIN RNNECLEV := STLEVEL; RNNECLOCRG := STLOCRG END
 | |
| 72740         ELSE IF (RNNECLEV=STLEVEL) AND (RNNECLOCRG<STLOCRG) THEN
 | |
| 72750           RNNECLOCRG := STLOCRG;
 | |
| 72760         R := RNLINK;
 | |
| 72770         END
 | |
| 72780     END;
 | |
| 72790 (**)
 | |
| 72800 (**)
 | |
| 72810 PROCEDURE NECLAB(STB: PSTB);
 | |
| 72820 (*FUNCTION: ADJUST THE NECESSARY ENVIRONS OF ALL ROUTNS ON THE STROUTN CHAIN OF STB*)
 | |
| 72830   VAR PTR, PTR1: PROUTNCHAIN;
 | |
| 72840       SAVROUTN: PROUTN;
 | |
| 72850     BEGIN
 | |
| 72860     SAVROUTN := ROUTNL; PTR := STB^.STROUTN;
 | |
| 72870     WHILE PTR<>NIL DO
 | |
| 72880       BEGIN
 | |
| 72890       ROUTNL := PTR^.DATA;
 | |
| 72900       NECENV(STB);
 | |
| 72910       DECROUTN(ROUTNL, ROUTNL^.RNADDRESS<>0);
 | |
| 72920       PTR1 := PTR; PTR := PTR^.LINK; DISPOSE(PTR1)
 | |
| 72930       END;
 | |
| 72940     ROUTNL := SAVROUTN
 | |
| 72950     END;
 | |
| 72960 (**)
 | |
| 72970 (**)
 | |
| 72980 PROCEDURE RANGEXT;
 | |
| 72990 (*FUNCTION: DEALS WITH ALL STBLOCKS THREADED ON DCIL AND
 | |
| 73000     DISPOSES OF CURRENT RANGE
 | |
| 73010 *)
 | |
| 73020   VAR STB, CURDCL, T: PSTB;
 | |
| 73030       TRYPREVRANGE: BOOLEAN;
 | |
| 73040       R: PRANGE;
 | |
| 73050       PTR: PROUTNCHAIN;
 | |
| 73060       SB: PSB;
 | |
| 73070       SEMP: -1..SRSTKSIZE;
 | |
| 73080       FLADSET, FLADNEEDED, REDOJUMPS: BOOLEAN;
 | |
| 73082       DUMMY: LABL;
 | |
| 73090     BEGIN
 | |
| 73100     WITH RANGEL^ DO
 | |
| 73110       BEGIN
 | |
| 73120       IF BALFLAG THEN FLADNEEDED := FALSE
 | |
| 73130       ELSE  BEGIN (*YIELD OF RANGE IS ON RTSTACK*)
 | |
| 73140         FLADNEEDED := (RTSTACK^.SBMODE<>MDJUMP);
 | |
| 73150         SB := RTSTACK; UNSTACKSB; (*PRETEND WE ARE IN VOID CONTEXT OUTSIDE THE RANGE*)
 | |
| 73160         END;
 | |
| 73170       FLADSET := FALSE;
 | |
| 73180       STB := DCIL;
 | |
| 73190       WHILE STB<>NIL DO WITH STB^ DO
 | |
| 73200         BEGIN
 | |
| 73210         IF (STBLKTYP=STBDEFLAB) AND (STROUTN<>NIL) THEN (*LABEL WAS JUMPED TO OUT OF A ROUTINE*)
 | |
| 73220           BEGIN
 | |
| 73230           IF NOT FLADSET AND FLADNEEDED THEN BEGIN CGFLADJUMP; FLADSET := TRUE END;
 | |
| 73250           CGLABE(STB, ROUTNL^.RNLEVEL, CURLEB(*+41()+SIZLEBBASE()+41*)); (*GET OUT*)
 | |
| 73280           NECLAB(STB)
 | |
| 73290           END;
 | |
| 73300         STB := STTHREAD
 | |
| 73310         END;
 | |
| 73320       IF FLADSET THEN BEGIN ASSIGNFLAD; FLADSET := FALSE END;
 | |
| 73330     (*LOCRNGEXT - TO UNDO THE EFFECTS OF LOCRNGE*)
 | |
| 73340       IF DCLLOCRNG IN RGINFO THEN
 | |
| 73350         BEGIN
 | |
| 73380         IF DCLPARM IN RGINFO THEN PSCOUNT := RGPSCOUNT
 | |
| 73390         ELSE CGFIXRG;
 | |
| 73400         WITH ROUTNL^ DO RNLOCRG := RNLOCRG-1;
 | |
| 73410         IF DCLDELAY IN RGINFO THEN
 | |
| 73420           BEGIN
 | |
| 73430           IF BALFLAG THEN SEMP := SRSUBP+1 ELSE SEMP := SRSEMP;
 | |
| 73440           WHILE SEMP<=SRSEMP DO
 | |
| 73450             BEGIN
 | |
| 73460             WITH SRSTK[SEMP].SB^ DO
 | |
| 73462               BEGIN
 | |
| 73464               SBDELAYS :=SBDELAYS+1;
 | |
| 73466               IF DCLLOCGEN IN RGINFO THEN
 | |
| 73468                 SBINF := SBINF+[SBLOCGEN];
 | |
| 73470               IF DCLPILEDECS IN RGINFO THEN
 | |
| 73472                 SBINF := SBINF+[SBPILEDECS]
 | |
| 73476               END;
 | |
| 73478             SEMP := SEMP+1
 | |
| 73480             END
 | |
| 73490           END
 | |
| 73492         ELSE
 | |
| 73493           WITH SB^ DO BEGIN
 | |
| 73494             IF DCLLOCGEN IN RGINFO THEN
 | |
| 73496               SBINF := SBINF+[SBLOCGEN];
 | |
| 73498             IF DCLPILEDECS IN RGINFO THEN
 | |
| 73500               SBINF := SBINF+[SBPILEDECS];
 | |
| 73506             STACKSB(SB); CGRGXB(SB); UNSTACKSB
 | |
| 73508           END;
 | |
| 73510 (*-42() IF NOT FLADSET AND FLADNEEDED THEN BEGIN CGFLADJUMP; FLADSET := TRUE END; ()-42*)
 | |
| 73520 (*+42() IF DATASTATE=ENDDATA THEN DATASTATE := STARTDATA; ()+42*)
 | |
| 73530         CURID := CURLEB ; CURLEB := RGLEB;
 | |
| 73540         TODOCOUNT := RGTODOCOUNT;
 | |
| 73550         DCLDEFN := RGDEFN;
 | |
| 73560         DCLMODE := RGMODE;
 | |
| 73570         DCLPRVMODE := RGPRVMODE;
 | |
| 73580         END
 | |
| 73590       ELSE IF DCLLOCGEN IN RGINFO THEN
 | |
| 73600         RGINF := RGINF+[DCLLOCGEN];
 | |
| 73610       STB := DCIL;
 | |
| 73612       DUMMY := FIXUPM; (*TO FORCE ALIGNMENT OF RGIDBLK*)
 | |
| 73620       WHILE STB<>NIL DO WITH STB^ DO
 | |
| 73630         BEGIN
 | |
| 73640         IF STBLKTYP<=STBDEFOP THEN
 | |
| 73650           BEGIN (*DEFINING OCCURRENCE*)
 | |
| 73660           IF STLINK=NIL (*NO PREVIOUS INCARNATION*) THEN
 | |
| 73670             IF STBLKTYP=STBDEFMI THEN
 | |
| 73680               STLEX^.LXV := LXVTAB
 | |
| 73690             ELSE IF STBLKTYP=STBDEFPRIO THEN STLEX^.LXV := LXVTAB;
 | |
| 73700           IF DCLLOCRNG IN RGINFO THEN CGRGID(STB);
 | |
| 73710           END;
 | |
| 73720         STB := STTHREAD
 | |
| 73730         END;
 | |
| 73740       IF DCLLOCRNG IN RGINFO THEN IF DCLPARM IN RGINFO THEN ROUTNL^.RNIDBLK := FIXUPM ELSE FIXUPF(RGIDBLK);
 | |
| 73760       REDOJUMPS := ([DCLLOCRNG, DCLLOOP]*RGINFO<>[]) OR (RGLINK^.RGRTSTACK<>RTSTACK);
 | |
| 73770       RGLEV := RGLEV-1;
 | |
| 73780       R := RANGEL; RANGEL := RGLINK; (*CONSIDER OURSELVES TO BE OUTSIDE RANGE NOW*)
 | |
| 73790       STB := DCIL; CURDCL := RGDCIL;
 | |
| 73800       IF CURDCL=NIL THEN DCIL := NIL
 | |
| 73810       ELSE DCIL := CURDCL^.STTHREAD;  (*LEAVE THE FIRST BEAD ON THE THREAD FOR NOW*)
 | |
| 73820       WHILE STB<>NIL DO WITH STB^ DO
 | |
| 73830         BEGIN
 | |
| 73840         IF STBLKTYP>STBDEFOP THEN
 | |
| 73850           BEGIN (*APPLIED OCCURRENCE*)
 | |
| 73860           TRYPREVRANGE := STLINK=NIL;  (*IT WAS A LABEL NOT YET DEFINED*)
 | |
| 73870           IF NOT TRYPREVRANGE THEN
 | |
| 73880             TRYPREVRANGE := STLINK^.STRANGE<RGLEV;  (*IT WAS NOT SEEN IN PREVIOUS RANGE*)
 | |
| 73890           IF TRYPREVRANGE THEN
 | |
| 73900             BEGIN (*THREAD STB INTO PREVIOUS RANGE*)
 | |
| 73910             STRANGE := STRANGE-1;
 | |
| 73920             T := STTHREAD; STTHREAD := DCIL; DCIL := STB;
 | |
| 73930             END;
 | |
| 73940           IF STBLKTYP=STBAPPLAB THEN
 | |
| 73950             BEGIN
 | |
| 73960             IF REDOJUMPS THEN
 | |
| 73962               BEGIN
 | |
| 73964               IF STXPTR[0]<>0 THEN
 | |
| 73970                 BEGIN
 | |
| 73980                 IF NOT FLADSET AND FLADNEEDED THEN BEGIN CGFLADJUMP; FLADSET := TRUE END;
 | |
| 73990                 CGLABB(STB, 0); (*LABEL FOR EXISTING JUMP*)
 | |
| 74000                 IF (DCLLOCRNG IN RGINFO) THEN CGRGXA(DCLLOCGEN IN RGINFO); (*RANGE EXIT*)
 | |
| 74010                 IF DCLLOOP IN RGINFO THEN CGLPG;
 | |
| 74020                 IF TRYPREVRANGE THEN CGLABC(STB, ORD(DCLPARM IN RGINFO))
 | |
| 74030                 ELSE CGLABC(STB^.STLINK, ORD(DCLPARM IN RGINFO));
 | |
| 74040                 END
 | |
| 74041 (*-01() (*-02() (*FOR SYSTEMS WHICH CANNOT JUMP INTO OTHER ROUTINES - SEE ALSO CHANGES IN CGLABC*)
 | |
| 74042               ELSE IF (STXPTR[1]<>0) AND (DCLPARM IN RGINFO) THEN
 | |
| 74043                 BEGIN
 | |
| 74044                 CGLABB(STB, 1); (*LABEL FOR EXISTING JUMP*)
 | |
| 74045                 IF TRYPREVRANGE THEN CGLABC(STB, ORD(DCLPARM IN RGINFO))
 | |
| 74046                 ELSE CGLABC(STB^.STLINK, ORD(DCLPARM IN RGINFO));
 | |
| 74047                 END
 | |
| 74048 ()-02*) ()-01*)
 | |
| 74049               END;
 | |
| 74050             IF NOT TRYPREVRANGE THEN CGLABD(STB);
 | |
| 74060             IF DCLPARM IN RGINFO (*RANGE IS A ROUTINE*) THEN
 | |
| 74070               BEGIN
 | |
| 74080               INCROUTN(ROUTNL, STB);  (*ADD ROUTNL TO ITS STROUTN CHAIN*)
 | |
| 74090               STCURID := ROUTNL^.RNCURID
 | |
| 74100               END
 | |
| 74110             ELSE
 | |
| 74120               IF DCLLOCRNG IN RGINFO THEN STCURID := CURID; (*FOR CATCHING JUMPS OVER DECLARATIONS*)
 | |
| 74130             IF NOT TRYPREVRANGE THEN
 | |
| 74140               WITH STLINK^ (*OCCURRENCE IN PREVIOUS RANGE*) DO
 | |
| 74150                 IF STBLKTYP IN [STBDEFID,STBAPPID] THEN
 | |
| 74160                   SEMERRP(ESE+07, STLEX)
 | |
| 74170                 ELSE (*PRESENT STROUTN CHAIN TO PREVIOUS OCCURRENCE*)
 | |
| 74180                   IF STROUTN<>NIL THEN
 | |
| 74190                     BEGIN
 | |
| 74200                     PTR := STROUTN;
 | |
| 74210                     WHILE PTR^.LINK<>NIL DO PTR := PTR^.LINK;
 | |
| 74220                     PTR^.LINK := STB^.STROUTN;
 | |
| 74230                     END
 | |
| 74240                   ELSE STROUTN := STB^.STROUTN;
 | |
| 74250             END;
 | |
| 74260           END
 | |
| 74270         ELSE TRYPREVRANGE := FALSE;
 | |
| 74280         IF TRYPREVRANGE THEN STB := T
 | |
| 74290         ELSE
 | |
| 74300           BEGIN
 | |
| 74310         (*FREESTB*)
 | |
| 74320           STLEX^.LXV.LXPSTB := STLINK;
 | |
| 74330           T := STB; STB := STTHREAD;
 | |
| 74340           DISPOSE(T)
 | |
| 74350           END
 | |
| 74360         END;
 | |
| 74370       IF CURDCL<>NIL THEN
 | |
| 74380         BEGIN CURDCL^.STTHREAD := DCIL; DCIL := CURDCL END; (*DEAL WITH THAT FIRST BEAD*)
 | |
| 74390           (*DCIL IS NOW AS BEFORE THE RANGENT*)
 | |
| 74400       IF FLADSET THEN ASSIGNFLAD;
 | |
| 74410       IF NOT BALFLAG THEN STACKSB(SB); (*STOP PRETENDING*)
 | |
| 74420       RGINFO := RGINF; RGSTATE := RGSTAT;
 | |
| 74430       DISPOSE(R)
 | |
| 74440       END
 | |
| 74450     END;
 | |
| 74460 (**)
 | |
| 74470 (**)
 | |
| 74480 PROCEDURE ROUTNXT;
 | |
| 74490 (*FUNCTION: EXIT FROM ROUTINE. CALLS DECROUTN.*)
 | |
| 74500   VAR R: PROUTN;
 | |
| 74510     BEGIN
 | |
| 74520     WITH ROUTNL^ DO
 | |
| 74530       BEGIN
 | |
| 74540       RTSTACK := RNRTSTACK;
 | |
| 74550       RTSTKDEPTH := RNSTKDEPTH;
 | |
| 74560       CURID := RNCURID;
 | |
| 74570       R := ROUTNL; ROUTNL := RNLINK;
 | |
| 74580       DECROUTN(R, FALSE)
 | |
| 74590       END
 | |
| 74600     END;
 | |
| 74610 (**)
 | |
| 74620 (**)
 | |
| 74630 FUNCTION GETSTB(LEX: PLEX; DEF: DEFTYP; BLK: BLKTYP): PSTB;
 | |
| 74640 (*FUNCTION: CREATE A NEW STBLOCK FOR LEX*)
 | |
| 74650   VAR STB: PSTB;
 | |
| 74660     BEGIN
 | |
| 74670     NEW(STB); WITH STB^, LEX^.LXV, ROUTNL^ DO
 | |
| 74680       BEGIN
 | |
| 74690       STLINK := LXPSTB; LXPSTB := STB;
 | |
| 74700       STLEX := LEX;
 | |
| 74710       STTHREAD := DCIL; DCIL := STB;
 | |
| 74720       STDEFTYP := DEF; STBLKTYP := BLK;
 | |
| 74730       STRANGE := RGLEV;
 | |
| 74740       STLEVEL := RNLEVEL; STLOCRG := RNLOCRG;
 | |
| 74750       STMODE := NIL;
 | |
| 74760       GETSTB := STB
 | |
| 74770       END
 | |
| 74780     END;
 | |
| 74790 (**)
 | |
| 74800 (**)
 | |
| 74810 PROCEDURE FILLSTB(STB: PSTB);
 | |
| 74820 (*FUNCTION: SETS THE MODE AND OFFSET FIELDS OF THE STBLOCK STB*)
 | |
| 74830   CONST STDIDTY=STINIT;
 | |
| 74840     BEGIN WITH STB^ DO
 | |
| 74850       BEGIN
 | |
| 74860       STOFFSET := ALLOCIND(DCLMODE);
 | |
| 74870       IF DCLDEFN=[STDIDTY] THEN STMODE := DCLMODE
 | |
| 74880       ELSE STMODE := FINDREF(DCLMODE);
 | |
| 74890       END
 | |
| 74900     END;
 | |
| 74910 (**)
 | |
| 74920 (**)
 | |
| 74930 FUNCTION GETPRIO(LEX: PLEX): PSTB;
 | |
| 74940 (*FUNCTION: CREATE AND INITIALIZE A PRIORITY STBLOCK*)
 | |
| 74950   VAR STB,STB1: PSTB;
 | |
| 74960     BEGIN
 | |
| 74970     STB := GETSTB(LEX, [STCONST], STBDEFPRIO); WITH STB^, LEX^ DO
 | |
| 74980       BEGIN
 | |
| 74990       STSTDOP := 0; STUSERLEX := NIL;
 | |
| 75000       STB1 := LXV.LXPSTB; LXV := LXVOPR; LXV.LXPSTB := STB1;
 | |
| 75010       STDYPRIO := 11; (*FOR UNDECLARED OPS*)
 | |
| 75020       GETPRIO := STB
 | |
| 75030       END
 | |
| 75040     END;
 | |
| 75050 (**)
 | |
| 75060 (**)
 | |
| 75070 FUNCTION TESTSTB(LEX: PLEX): BLKTYP;
 | |
| 75080 (*FUNCTION: LOOKS FOR A DEFINITION OR APPLICATION IN THE CURRENT RANGE OF THE SYMBOL
 | |
| 75090     CORRESPONDING TO LEX. IF NONE IS FOUND, IT RETURNS STBNONE; IF ONE IS FOUND, IT RETURNS ITS BLKTYP
 | |
| 75100 *)
 | |
| 75110     BEGIN WITH LEX^.LXV DO
 | |
| 75120       IF LXPSTB=NIL THEN TESTSTB := STBNONE
 | |
| 75130       ELSE WITH LXPSTB^ DO
 | |
| 75140         IF STRANGE<>RGLEV THEN TESTSTB := STBNONE
 | |
| 75150         ELSE TESTSTB := STBLKTYP
 | |
| 75160     END;
 | |
| 75170 (**)
 | |
| 75180 (**)
 | |
| 75190 PROCEDURE NOLABELS;
 | |
| 75200 (*FUNCTION: COMPLAINS IF LABELS HAVE BEEN ENCOUNTERED IN THE CURRENT RANGE*)
 | |
| 75210     BEGIN
 | |
| 75220     IF DCLLABEL IN RGINFO THEN SEMERR(ESE+04)
 | |
| 75230     END;
 | |
| 75240 (**)
 | |
| 75250 (**)
 | |
| 75260 PROCEDURE DEFID(LEX: PLEX);
 | |
| 75270 (*FUNCTION: MAKE STBLOCK FOR DEFINING-IDENTIFIER*)
 | |
| 75280   VAR BLK: BLKTYP;
 | |
| 75290     BEGIN
 | |
| 75300     NOLABELS; LOCRNGE;
 | |
| 75310     BLK := TESTSTB(LEX);
 | |
| 75320     IF BLK=STBAPPID THEN SEMERRP(ESE+08, LEX);
 | |
| 75330     IF BLK<STBNONE THEN  (*STBDEFID OR STBDEF/APPLAB*)
 | |
| 75340       IF BLK=STBDEFID THEN SEMERRP(ESE+09, LEX)
 | |
| 75350       ELSE SEMERRP(ESE+15, LEX);
 | |
| 75360     FILLSTB(GETSTB(LEX, DCLDEFN, STBDEFID))
 | |
| 75370     END;
 | |
| 75380 (**)
 | |
| 75390 (**)
 | |
| 75400 (**)
 | |
| 75410 FUNCTION APPID(LEX: PLEX): PSTB;
 | |
| 75420 (*FUNCTION: CREATE STBLOCK FOR APPLIED-IDENTIFIER UNLESS ALREADY APPLIED IN CURRENT RANGE.
 | |
| 75430     RETURNS POINTER TO THE DEFINING OCCURRENCE
 | |
| 75440 *)
 | |
| 75450   VAR STB, NEWSTB: PSTB;
 | |
| 75460       BLK: BLKTYP;
 | |
| 75470     BEGIN
 | |
| 75480     STB := LEX^.LXV.LXPSTB;
 | |
| 75490     IF STB=NIL THEN
 | |
| 75500       BEGIN SEMERRP(ESE+16, LEX); STB := GETSTB(LEX, [STINIT], STBDEFID); STB^.STMODE := MDERROR END;
 | |
| 75510     WITH STB^ DO
 | |
| 75520       BEGIN
 | |
| 75530       BLK := STBLKTYP;
 | |
| 75540       IF BLK=STBAPPID THEN STB := STDEFPTR
 | |
| 75550       ELSE IF BLK<>STBDEFID THEN
 | |
| 75560         BEGIN SEMERRP(ESE+15, LEX); STB := GETSTB(LEXALEPH, [STINIT], STBDEFID); STB^.STMODE := MDERROR END;
 | |
| 75570       IF TESTSTB(LEX)=STBNONE (*NOT YET ENCOUNTERED IN CURRENT RANGE*) THEN
 | |
| 75580         BEGIN NEWSTB := GETSTB(LEX, [], STBAPPID); NEWSTB^.STDEFPTR := STB END;
 | |
| 75590       NECENV(STB)
 | |
| 75600       END;
 | |
| 75610     STB^.STDEFTYP:=STB^.STDEFTYP+[STUSED];
 | |
| 75620     APPID := STB
 | |
| 75630     END;
 | |
| 75640 (**)
 | |
| 75650 (**)
 | |
| 75660 PROCEDURE DEFLAB(LEX: PLEX);
 | |
| 75670 (*FUNCTION: MAKE STBLOCK FOR DEFINING-LABEL*)
 | |
| 75680   VAR STB: PSTB;
 | |
| 75690       BLK: BLKTYP;
 | |
| 75700     BEGIN
 | |
| 75710     RGINFO := RGINFO+[DCLLABEL];
 | |
| 75720     CGFIXRG;
 | |
| 75730     BLK := TESTSTB(LEX);
 | |
| 75740     IF BLK=STBAPPLAB THEN
 | |
| 75750       BEGIN
 | |
| 75760       STB := LEX^.LXV.LXPSTB; WITH STB^, ROUTNL^ DO
 | |
| 75770         BEGIN
 | |
| 75780         IF STCURID<CURID THEN SEMERRP(ESE+61, LEX);
 | |
| 75790         STDEFTYP := [STCONST]; STBLKTYP := STBDEFLAB;
 | |
| 75800         STLEVEL := RNLEVEL;
 | |
| 75810         CGLABB(STB, 0); CGLABA(STB) (*LABEL-DEFINITION WITH PREVIOUS APPLIED OCCURRENCES*)
 | |
| 75820         END
 | |
| 75830       END
 | |
| 75840     ELSE IF BLK=STBNONE THEN
 | |
| 75850       BEGIN
 | |
| 75860       STB := GETSTB(LEX, [STCONST], STBDEFLAB); WITH STB^ DO
 | |
| 75870         BEGIN STXPTR[1] := 0; STROUTN := NIL END;
 | |
| 75880       CGLABA(STB) (*LABEL-DEFINITION WITH NO PREVIOUS APPLIED OCCURRENCE*)
 | |
| 75890       END
 | |
| 75900     ELSE IF BLK=STBDEFLAB THEN SEMERRP(ESE+13, LEX)
 | |
| 75910     ELSE SEMERRP(ESE+07, LEX);
 | |
| 75920     WITH STB^, ROUTNL^ DO
 | |
| 75930       IF DCLLOCRNG IN RGINFO THEN STLOCRG := RNLOCRG
 | |
| 75940       ELSE STLOCRG := RNLOCRG+1;
 | |
| 75950     END;
 | |
| 75960 (**)
 | |
| 75970 (**)
 | |
| 75980 FUNCTION APPLAB(LEX: PLEX): PSTB;
 | |
| 75990 (*FUNCTION: CREATE STBLOCK FOR APPLIED-LABEL IF NO DEFINING OCCURRENCE YET EXISTS.
 | |
| 76000     RETURNS POINTER TO MOST RECENT OCCURRENCE (APPLIED OR DEFINING).
 | |
| 76010 *)
 | |
| 76020   VAR STB: PSTB;
 | |
| 76030       BLK: BLKTYP;
 | |
| 76040     BEGIN
 | |
| 76050     BLK := TESTSTB(LEX);
 | |
| 76060     IF BLK<>STBNONE THEN
 | |
| 76070       BEGIN
 | |
| 76080       STB := LEX^.LXV.LXPSTB;
 | |
| 76090       IF (BLK<>STBDEFLAB) AND (BLK<>STBAPPLAB) THEN SEMERRP(ESE+07, LEX)
 | |
| 76100       END
 | |
| 76110     ELSE
 | |
| 76120       BEGIN
 | |
| 76130       STB := GETSTB(LEX, [], STBAPPLAB); WITH STB^ DO
 | |
| 76140         BEGIN
 | |
| 76150         STCURID := CURID;
 | |
| 76160         STXPTR[0] := 0; STXPTR[1] := 0; STROUTN := NIL;
 | |
| 76170         END
 | |
| 76180      END;
 | |
| 76190     CGLABC(STB, 0);
 | |
| 76200     APPLAB := STB
 | |
| 76210     END;
 | |
| 76220 (**)
 | |
| 76230 (**)
 | |
| 76240 PROCEDURE DEFMI(LEX: PLEX);
 | |
| 76250 (*FUNCTION: MAKE STBLOCK FOR DEFINING-MODE-INDICATION*)
 | |
| 76260   VAR STB: PSTB;
 | |
| 76270       BLK: BLKTYP;
 | |
| 76280     BEGIN
 | |
| 76290     NOLABELS; LOCRNGE;
 | |
| 76300     BLK := TESTSTB(LEX);
 | |
| 76310     IF BLK=STBAPPMI THEN SEMERRP(ESE+12, LEX);
 | |
| 76320     IF BLK<STBNONE THEN SEMERRP(ESE+11, LEX)
 | |
| 76330     ELSE BEGIN
 | |
| 76340       LEX^.LXV := LXVMDIND;
 | |
| 76350       STB := GETSTB(LEX, [STINIT (*FOR STDIDTY*) (* , STDNONREC*)], STBDEFMI); STB^.STMODE := NIL;
 | |
| 76360       STB^.STOFFSET := 0
 | |
| 76370       END
 | |
| 76380     END;
 | |
| 76390 (**)
 | |
| 76400 (**)
 | |
| 76410 FUNCTION APPMI(LEX: PLEX): PSTB;
 | |
| 76420 (*FUNCTION: CREATE STBLOCK FOR APPLIED-MODE-INDICATION UNLESS ALREADY APPLIED IN CURRENT RANGE.
 | |
| 76430     RETURNS POINTER TO THE DEFINING OCCURRENCE.
 | |
| 76440 *)
 | |
| 76450   VAR STB, NEWSTB: PSTB;
 | |
| 76460       I: INTEGER; LXIO: LXIOTYPE; SAFE: SET OF (YIN, YANG);
 | |
| 76470     BEGIN
 | |
| 76480     STB := LEX^.LXV.LXPSTB;
 | |
| 76490     IF STB=NIL THEN BEGIN DEFMI(LEX); STB := LEX^.LXV.LXPSTB; STB^.STMODE := MDERROR; SEMERRP(ESE+46, LEX) END;
 | |
| 76500     WITH STB^ DO IF STBLKTYP=STBAPPMI THEN STB := STDEFPTR;
 | |
| 76510     IF TESTSTB(LEX)=STBNONE THEN WITH STB^ DO
 | |
| 76520       BEGIN
 | |
| 76530       IF STMODE=NIL THEN
 | |
| 76540         BEGIN SEMERRP(ESE+46, LEX); STMODE := MDERROR END;
 | |
| 76550       NEWSTB := GETSTB(LEX, [], STBAPPMI);
 | |
| 76560       NEWSTB^.STDEFPTR := STB
 | |
| 76570       END
 | |
| 76580     ELSE WITH STB^ DO
 | |
| 76590       IF STMODE=NIL THEN
 | |
| 76600         BEGIN
 | |
| 76610         STDEFTYP := [STINIT (*FOR STDIDTY*), STRECUR];
 | |
| 76620       (*WELLFORMED*)
 | |
| 76630         SAFE := []; I := PLSTKP+1;
 | |
| 76640         WHILE (SAFE<>[YIN, YANG]) AND (I<SRPLSTKSIZE) DO WITH SRPLSTK[I]^.LXV DO
 | |
| 76650           BEGIN
 | |
| 76660           IF (LXIO=LXIOREF) OR (LXIO=LXIOPROC) THEN
 | |
| 76670             SAFE := SAFE+[YIN]
 | |
| 76680           ELSE IF (LXIO=LXIOOPEN) OR (LXIO=LXIOSTRUCT) THEN
 | |
| 76690             SAFE := SAFE+[YANG]
 | |
| 76700           ELSE IF LXIO=LXIOMDIND THEN
 | |
| 76710             BEGIN SEMERR(ESE+03); SAFE := [YIN, YANG] END;
 | |
| 76720           I := I+1
 | |
| 76730           END;
 | |
| 76740         END;
 | |
| 76750     APPMI := STB
 | |
| 76760     END;
 | |
| 76770 (**)
 | |
| 76780 (**)
 | |
| 76790 PROCEDURE DEFPRIO(LEX, PRIO: PLEX);
 | |
| 76800 (*FUNCTION: MAKE STBLOCK FOR PRIORITY-DEFINITION*)
 | |
| 76810   VAR STB, OLDSTB: PSTB;
 | |
| 76820     BEGIN
 | |
| 76830     NOLABELS;
 | |
| 76840     OLDSTB := LEX^.LXV.LXPSTB;
 | |
| 76850     IF OLDSTB<>NIL THEN
 | |
| 76860       IF OLDSTB^.STDYPRIO<>10 THEN SEMERRP(ESE+42, LEX);
 | |
| 76870     WITH PRIO^ DO
 | |
| 76880       IF (LXDENMD<>MDINT) OR (LXDENRP<=0) OR (LXDENRP>9) THEN SEMERR(ESE+41)
 | |
| 76890       ELSE
 | |
| 76900         BEGIN
 | |
| 76910         STB := GETPRIO(LEX); WITH STB^ DO
 | |
| 76920           BEGIN
 | |
| 76930           IF OLDSTB<>NIL THEN
 | |
| 76940             BEGIN STSTDOP := OLDSTB^.STSTDOP; STUSERLEX := OLDSTB^.STUSERLEX END;
 | |
| 76950           STDYPRIO := (*-04() LXDENRP ()-04*)(*+04() SHRINK(LXDENRP) ()+04*)
 | |
| 76960           END
 | |
| 76970         END
 | |
| 76980     END;
 | |
| 76990 (**)
 | |
| 77000 (**)
 | |
| 77010 PROCEDURE DEFOP(LEX: PLEX);
 | |
| 77020 (*FUNCTION: MAKE STBLOCK FOR USER OPERATION-DEFINITION*)
 | |
| 77030   VAR STB: PSTB;
 | |
| 77040       LX: PLEX;
 | |
| 77050     BEGIN
 | |
| 77060     NOLABELS; LOCRNGE;
 | |
| 77070     WITH LEX^.LXV DO
 | |
| 77080       IF LXPSTB=NIL THEN (*NO PRIORITY-DEFINITION EXISTS*)
 | |
| 77090         BEGIN STB := GETPRIO(LEX); STB^.STDYPRIO := 10 (*FOR MONADICS*) END
 | |
| 77100       ELSE STB := LXPSTB;
 | |
| 77110     WITH STB^ DO
 | |
| 77120       BEGIN
 | |
| 77130       IF STUSERLEX=NIL THEN (*NO PREVIOUS OPERATION-DEFINITION*)
 | |
| 77140         BEGIN
 | |
| 77150         ENEW(LX, LEX1SIZE); STUSERLEX := LX; (*CREATE DUMMY LEXEME*)
 | |
| 77160         STUSERLEX^.LXV := LXVOPR; STUSERLEX^.LINK := LEX;
 | |
| 77170         END;
 | |
| 77180       FILLSTB(GETSTB(STUSERLEX, [STINIT](*FOR STDIDTY*), STBDEFOP))
 | |
| 77190       END
 | |
| 77200     END;
 | |
| 77210 (**)
 | |
| 77220 (**)
 | |
| 77230 FUNCTION APPOP(STB: PSTB): PSTB;
 | |
| 77240 (*FUNCTION: HANDLE APPLIED-OPERATOR; NO NEED TO CREATE AN APPLIED STBLOCK IN THE SUBLANGUAGE*)
 | |
| 77250     BEGIN
 | |
| 77260     NECENV(STB);
 | |
| 77270     STB^.STDEFTYP := STB^.STDEFTYP + [STUSED] ;
 | |
| 77280     APPOP := STB
 | |
| 77290     END;
 | |
| 77300 (**)
 | |
| 77310 (**)
 | |
| 77320 PROCEDURE PUTDEN(LEX: PLEX);
 | |
| 77330 (*FUNCTION: CREATES A SEMANTIC BLOCK FOR A DENOTATION*)
 | |
| 77340   VAR SB: PSB;
 | |
| 77350     BEGIN WITH LEX^  DO
 | |
| 77360       BEGIN
 | |
| 77370       IF LXV.LXIO=LXIOBOOLDEN THEN SB := PUSHSB(MDBOOL)
 | |
| 77380       ELSE SB := PUSHSB(LXDENMD);
 | |
| 77390       WITH SB^ DO
 | |
| 77400         BEGIN
 | |
| 77410         SBLEX := LEX;
 | |
| 77420         SBINF := [SBMORF,SBVOIDWARN]; SBTYP := SBTDEN
 | |
| 77430         END
 | |
| 77440       END
 | |
| 77450     END;
 | |
| 77460 (**)
 | |
| 77470 (**)
 | |
| 77480 PROCEDURE PUTIND(STB: PSTB);
 | |
| 77490 (*FUNCTION: CREATES A SEMANTIC BLOCK FOR AN APPLIED-INDICATOR*)
 | |
| 77500   VAR SB: PSB;
 | |
| 77510     BEGIN
 | |
| 77520     WITH STB^ DO
 | |
| 77530       BEGIN
 | |
| 77540       IF STBLKTYP<>STBDEFMI THEN
 | |
| 77550         SB := PUSHSB(STMODE)
 | |
| 77560       ELSE IF STMODE^.MDV.MDID=MDIDROW THEN
 | |
| 77570         SB := PUSHSB(PRCBNDS)
 | |
| 77580       ELSE SB := PUSHSB(MDABSENT);
 | |
| 77590       WITH SB^ DO
 | |
| 77600         BEGIN
 | |
| 77610         IF NOT (STCONST IN STDEFTYP) THEN
 | |
| 77620            BEGIN SBLEVEL := STLEVEL; SBOFFSET := STOFFSET; SBLOCRG := STLOCRG ;
 | |
| 77630            IF NOT (STVAR IN STDEFTYP) THEN
 | |
| 77640               SBTYP := SBTID
 | |
| 77650            ELSE WITH SBMODE^.MDPRRMD^ DO
 | |
| 77660               IF (MDV.MDID=MDIDSTRUCT) OR (MDV.MDID=MDIDROW) THEN
 | |
| 77670                  SBTYP := SBTIDV
 | |
| 77680               ELSE SBTYP := SBTVAR;
 | |
| 77690            END
 | |
| 77700         ELSE
 | |
| 77710            IF (STMODE^.MDV.MDID=MDIDPROC) OR (STBLKTYP=STBDEFMI) THEN
 | |
| 77720               BEGIN
 | |
| 77730               IF STRCONST IN STDEFTYP THEN SBTYP := SBTRPROC
 | |
| 77740               ELSE  SBTYP:=SBTPROC;
 | |
| 77750               SBLEVEL:=STLEVEL;
 | |
| 77760               SBOFFSET:=0;
 | |
| 77770               SBXPTR:=STPTR;
 | |
| 77780               END
 | |
| 77790            ELSE
 | |
| 77800               BEGIN
 | |
| 77810               SBLEX:=STVALUE;
 | |
| 77820               SBTYP := SBTDEN;
 | |
| 77830               END;
 | |
| 77840         SBINF := [SBMORF,SBVOIDWARN];
 | |
| 77850         END
 | |
| 77860       END
 | |
| 77870     END;
 | |
| 77880 (**)
 | |
| 77890 (**)
 | |
| 77900 PROCEDURE PUTLOOP(LEX: PLEX);
 | |
| 77910 (*FUNCTION: CREATES A SEMANTIC BLOCK FOR A LOOP*)
 | |
| 77920   VAR SB: PSB;
 | |
| 77930     BEGIN
 | |
| 77940     SB := MAKESUBSTACK(0, MDINT);
 | |
| 77950     SB^.SBLEX := LEX;
 | |
| 77960     END;
 | |
| 77970 (**)
 | |
| 77980 (**)
 | |
| 77990 (**)
 | |
| 78000 PROCEDURE ELABMI(LEX: PLEX);
 | |
| 78010 (*FUNCTION: ELABORATE MODE-INDICATION*)
 | |
| 78020   VAR STB: PSTB;
 | |
| 78030     BEGIN WITH LEX^ DO
 | |
| 78040       BEGIN
 | |
| 78050       STB := LXV.LXPSTB;
 | |
| 78060       WITH STB^ DO IF STBLKTYP=STBAPPMI THEN STB := STDEFPTR;
 | |
| 78070       NECENV(STB);
 | |
| 78080       PUTIND(STB);
 | |
| 78090       WITH SRSTK[SRSEMP] DO BEGIN CGDEPROC(SB); SB^.SBMODE:=MDBNDS END;
 | |
| 78100       SRSEMP := SRSEMP+1; SRSTK[SRSEMP].MD := STB^.STMODE
 | |
| 78110       END
 | |
| 78120     END;
 | |
| 78130 (**)
 | |
| 78140 (**)
 | |
| 78150 PROCEDURE PARMSC;
 | |
| 78160 (*FUNCTION: PUT MODE OF NEXT ACTUAL-PARAMETER ONTO SCCHAIN*)
 | |
| 78170   VAR SB: PSB;
 | |
| 78180     BEGIN
 | |
| 78190     SB := SRSTK[SRSUBP+1].SB;
 | |
| 78200     WITH SB^ DO
 | |
| 78210       WITH SBMODE^ DO
 | |
| 78220         BEGIN
 | |
| 78230         IF SBCNT>=MDV.MDCNT THEN
 | |
| 78240           BEGIN
 | |
| 78250           SCPUSH(MDERROR);
 | |
| 78260           IF SBCNT=MDV.MDCNT THEN MODERR(SBMODE, ESE+30);
 | |
| 78270           END
 | |
| 78280         ELSE SCPUSH(MDPRCPRMS[SBCNT]);
 | |
| 78290         SBCNT := SBCNT+1
 | |
| 78300         END
 | |
| 78310     END;
 | |
| 78320 (**)
 | |
| 78330 (**)
 | |
| 78340 PROCEDURE OPDSAVE(M: MODE);
 | |
| 78350 (*FUNCTION: SAVES MODE OF OPERAND AND BALFLAG ON SRSTACK*)
 | |
| 78360   VAR SB: PSB;
 | |
| 78370     BEGIN
 | |
| 78380     SB := PUSHSB(M); WITH SB^ DO
 | |
| 78390       BEGIN
 | |
| 78400       RTSTACK := SBRTSTK;
 | |
| 78410       IF BALFLAG THEN SBBALSTR := BALSTR
 | |
| 78420       ELSE SBBALSTR := STRNONE;
 | |
| 78430       BALFLAG := FALSE
 | |
| 78440       END
 | |
| 78450     END;
 | |
| 78460 (**)
 | |
| 78470 (**)
 | |
| 78480 FUNCTION OPDREST: MODE;
 | |
| 78490 (*FUNCTION: RESTORES MODE AND BALFLAG FROM SRSTACK*)
 | |
| 78500   VAR SB: PSB;
 | |
| 78510     BEGIN
 | |
| 78520     SB := SRSTK[SRSEMP].SB; SRSEMP := SRSEMP-1; WITH SB^ DO
 | |
| 78530       BEGIN OPDREST := SBMODE; BALFLAG := SBBALSTR<>STRNONE; DISPOSE(SB) END
 | |
| 78540     END;
 | |
| 78550 (**)
 | |
| 78560 (**)
 | |
| 78570 PROCEDURE BALOPR;
 | |
| 78580 (*FUNCTION: PERFORMS COERCION OF OPERANDS*)
 | |
| 78590   VAR SBLH,SBRH: PSB;
 | |
| 78600       LHM,M: MODE;
 | |
| 78610     BEGIN
 | |
| 78620     M := COERCE(OPDREST); (*COERCE RH OPERAND*)
 | |
| 78630     IF LHFIRM=MDABSENT THEN (*MONADIC OPERATOR*)
 | |
| 78640       CGOPDA (*TOTAL RH OPERAND*)
 | |
| 78650     ELSE (*DYADIC OPERATOR*)
 | |
| 78660       BEGIN
 | |
| 78670       IF SRSTK[SRSEMP-1].SB^.SBBALSTR<>STRNONE THEN (*LH OPERAND WAS BALANCED OR DELAYED*)
 | |
| 78680         BEGIN
 | |
| 78690         (*CONTENTS OF SRSTK:
 | |
| 78700             RH OPERAND (COERCED AND TOTALLED); = RTSTACK.
 | |
| 78710             LOCUM TENENS REPRESENTING LH OPERAND AFTER COERCION AND AFTER RH CODE; ON RTSTACK.
 | |
| 78720             SUBSTACK CONTAINING CONSTITUENTS (MAYBE ONLY 1) OF LH BALANCE
 | |
| 78730         *)
 | |
| 78740         CGOPDD; (*JUMP OVER LH COERCION*)
 | |
| 78750         UNSTACKSB; SBRH := SRSTK[SRSEMP].SB; SRSEMP := SRSEMP-1; (*FORGET RH RESULTS TEMPORARILY*)
 | |
| 78760         LHM := OPDREST; (*BALFLAG IS NOW SET*)
 | |
| 78770         UNSTACKSB; SBLH := SRSTK[SRSEMP].SB; SRSEMP := SRSEMP-1; (*FORGET LOCUM TENENS*)
 | |
| 78780         M := COERCE(COFIRM(SRSTK[SRSEMP].SB^.SBMODE, LHM)); (*COERCE LH BALANCE FIRMLY*)
 | |
| 78790         CGOPDE(SBLH); (*JUMP BACK TO RH CODE; SET LABEL FOR RH EXIT*)
 | |
| 78800         DISPOSE(SBLH);
 | |
| 78810         STACKSB(SBRH);
 | |
| 78820         M := COERCE(LHM); (*WIDEN RESULT OF LH BALANCE, IF REQUIRED*)
 | |
| 78830         SRSEMP := SRSEMP+1; SRSTK[SRSEMP].SB := SBRH; (*REMEMBER RH RESULTS AGAIN*)
 | |
| 78840         END
 | |
| 78850       ELSE
 | |
| 78860         BEGIN
 | |
| 78870         CGOPDA; (*TOTAL RH OPERAND*)
 | |
| 78880         SBRH := SRSTK[SRSEMP].SB; SRSEMP := SRSEMP-1;
 | |
| 78890         M := COERCE(OPDREST); (*COERCE LH OPERAND*)
 | |
| 78900         SRSEMP := SRSEMP+1; SRSTK[SRSEMP].SB := SBRH
 | |
| 78910         END;
 | |
| 78920       END;
 | |
| 78930     END;
 | |
| 78940 (**)
 | |
| 78950 (**)
 | |
| 78960 (*
 | |
| 78970             LHOPBAL                                BALOPR
 | |
| 78980            1------!           !--------------------------------------------!
 | |
| 78990              CGOPDC                    CGOPDD                CGOPDE
 | |
| 79000               !--!                     !----!                !----!
 | |
| 79010              --------------->---------------
 | |
| 79020              !                             !
 | |
| 79030              !                          ---+---------->-----------
 | |
| 79040              !                          !  !                     !
 | |
| 79050   COMPUTE LH--  ->COMPUTE RH  COERCE RH--  ->FIRMLY COERCE LH--  ->WIDEN LH  CGOPR/CGOPAB
 | |
| 79060                 !                                             !
 | |
| 79070                 ------------------------<----------------------
 | |
| 79080 *)
 | |
| 79090 (**)
 | |
| 79100 (**)
 | |
| 79110 PROCEDURE LHOPBAL(M: MODE);
 | |
| 79120 (*FOR LH OPERAND WHICH IS BALANCED OR DELAYED*)
 | |
| 79130   VAR SB: PSB;
 | |
| 79140     BEGIN
 | |
| 79150     IF NOT BALFLAG THEN
 | |
| 79160       BEGIN
 | |
| 79170       SB := SRSTK[SRSEMP].SB; SRSEMP := SRSEMP-1; SUBSAVE; SRSEMP := SRSEMP+1; SRSTK[SRSEMP].SB := SB;
 | |
| 79180       CGIBAL; BALFLAG := TRUE
 | |
| 79190       END;
 | |
| 79200     SB := PUSHSB(M); (*PUT LOCUM TENENS; M HAS THE LARGEST POSSIBLE LEN (BAR WIDENING) FOR THE LH MODE*)
 | |
| 79210     CGOPDC (*LABEL FOR START OF RH CODE; PUSHES LOCUM TENENS TO REPRESENT LH DURING RH CODE*)
 | |
| 79220     END;
 | |
| 79230 (**)
 | |
| 79240 (**)
 | |
| 79250 PROCEDURE PUTMD(LHM,RHM: MODE);
 | |
| 79260 (*FUNCTION: SETS A POSTERIORI MODES OF OPERANDS*)
 | |
| 79270     BEGIN
 | |
| 79280     SRSTK[SRSEMP].SB^.SBMODE := RHM;
 | |
| 79290     IF LHFIRM<>MDABSENT THEN (*NOT MONADIC OPERATOR*)
 | |
| 79300       IF SRSTK[SRSEMP].SB^.SBBALSTR<>STRNONE THEN
 | |
| 79310         SRSTK[SRSUBP-1].SB^.SBMODE := LHM
 | |
| 79320       ELSE SRSTK[SRSEMP-2].SB^.SBMODE := LHM
 | |
| 79330     END;
 | |
| 79340 (**)
 | |
| 79350 (**)
 | |
| 79360 FUNCTION OPIDSTD(STB: PSTB): BOOLEAN;
 | |
| 79370 (*FUNCTION: RETURNS TRUE IF OPERATOR STB CAN BE IDENTIFIED AS A STANDARD OPERATOR*)
 | |
| 79380   VAR FOUND: BOOLEAN;
 | |
| 79390       LHX, RHX: XTYPE;
 | |
| 79400     BEGIN OPBLK := STB^.STSTDOP-1;
 | |
| 79410     IF OPBLK<0 THEN OPIDSTD := FALSE
 | |
| 79420     ELSE
 | |
| 79430       BEGIN
 | |
| 79440       REPEAT OPBLK := OPBLK+1; WITH OPTABL[OPBLK] DO
 | |
| 79450         BEGIN
 | |
| 79460         CASE OPIDNDX OF
 | |
| 79470           IDAA:  (*REQUIRES L AND R WITHIN GIVEN RANGE*)
 | |
| 79480             BEGIN LHX := TX(LHFIRM); RHX := TX(RHFIRM);
 | |
| 79490             IF LHX>RHX THEN COMMX := LHX ELSE COMMX := RHX;
 | |
| 79500             FOUND := (LHX>=OPMIN) AND (RHX>=OPMIN) AND (LHX<=OPMAX) AND (RHX<=OPMAX)
 | |
| 79510 (*+61()       AND ((COMMX>XLCOMPL) OR (ODD(LHX)=ODD(RHX))) ()+61*)  (*SAME LENGTH*)
 | |
| 79520             END;
 | |
| 79530           IDAAL:  (*REQUIRES L AND R WITHIN GIVEN RANGE*)
 | |
| 79540             BEGIN LHX := TX(LHFIRM); RHX := TX(RHFIRM);
 | |
| 79550 (*-61()     COMMX := OPMAX-1; ()-61*)
 | |
| 79560 (*+61()     IF ODD(LHX) THEN COMMX := OPMAX ELSE COMMX := OPMAX-1; ()+61*)
 | |
| 79570             FOUND := (LHX>=OPMIN) AND (RHX>=OPMIN) AND (LHX<=OPMAX) AND (RHX<=OPMAX)
 | |
| 79572 (*+61()       AND ((COMMX>XLCOMPL) OR (ODD(LHX)=ODD(RHX))) ()+61*)  (*SAME LENGTH*)
 | |
| 79580             END;
 | |
| 79590           IDRA:  (*REQUIRES L WITHIN L AND R <= GIVEN RANGE*)
 | |
| 79600             BEGIN LHX := TX(LHFIRM); RHX := TX(RHFIRM);
 | |
| 79610             COMMX := LHX;
 | |
| 79620             FOUND := (LHX>=OPMIN) AND (LHX<=OPMAX) AND (LHX>=RHX)
 | |
| 79630           (*      AND (ODD(LHX)=ODD(RHX)) *)  (*SAME LENGTH*)
 | |
| 79640             END;
 | |
| 79650           IDBB:  (*REQUIRES L AND R WITHIN GIVEN RANGE, AND L=R*)
 | |
| 79660             BEGIN LHX := TX(LHFIRM); RHX := TX(RHFIRM);
 | |
| 79670             COMMX := LHX;
 | |
| 79680             FOUND := (LHX=RHX) AND (COMMX>=OPMIN) AND (COMMX<=OPMAX)
 | |
| 79690             END;
 | |
| 79700           IDBI,IDSI:  (*REQUIRES L WITHIN RANGE ANDR=INT*)
 | |
| 79710             BEGIN COMMX := TX(LHFIRM);
 | |
| 79720             FOUND := (RHFIRM=MDINT) AND (COMMX>=OPMIN) AND (COMMX<=OPMAX)
 | |
| 79730             END;
 | |
| 79740           IDIB:  (*REQUIRES L=INT AND R WITHIN RANGE*)
 | |
| 79750             BEGIN COMMX := TX(RHFIRM);
 | |
| 79760             FOUND := (LHFIRM=MDINT) AND (COMMX>=OPMIN) AND (COMMX<=OPMAX)
 | |
| 79770             END;
 | |
| 79780           IDSC:  (*REQUIRES L=STRNG AND R WITHIN RANGE*)
 | |
| 79790             BEGIN COMMX := TX(RHFIRM);
 | |
| 79800             FOUND := (LHFIRM=MDSTRNG) AND (COMMX>=OPMIN) AND (COMMX<=OPMAX)
 | |
| 79810             END;
 | |
| 79820           IDCS:  (*REQUIRES L WITHIN RANGE AND R=STRNG*)
 | |
| 79830             BEGIN COMMX := TX(LHFIRM);
 | |
| 79840             FOUND := (RHFIRM=MDSTRNG) AND (COMMX>=OPMIN) AND (COMMX<=OPMAX)
 | |
| 79850             END;
 | |
| 79860           IDMON,IDMONL:  (*MONADIC OPERATORS*)
 | |
| 79870             BEGIN COMMX := TX(RHFIRM);
 | |
| 79880             FOUND := (LHFIRM=MDABSENT) AND (COMMX>=OPMIN) AND (COMMX<=OPMAX)
 | |
| 79890             END;
 | |
| 79900           IDIBR, IDIBRM:  (*.LWB AND .UPB*)
 | |
| 79910             BEGIN LHX := TX(LHFIRM); COMMX := LHX;
 | |
| 79920             FOUND := ((RHFIRM^.MDV.MDID=MDIDROW) OR (RHFIRM=MDROWS))
 | |
| 79930                  AND (LHX>=OPMIN) AND (LHX<=OPMAX)
 | |
| 79940                  AND ((LHX<>-1) OR (LHFIRM=MDABSENT))
 | |
| 79950             END;
 | |
| 79960           END;
 | |
| 79970         END;
 | |
| 79980       UNTIL FOUND OR (NOT OPTABL[OPBLK].OPMORE);
 | |
| 79990       OPIDSTD := FOUND
 | |
| 80000       END
 | |
| 80010     END;
 | |
| 80020 (**)
 | |
| 80030 (**)
 | |
| 80040 PROCEDURE OPDOSTD;
 | |
| 80050 (*FUNCTION: GENERATES CODE FOR APPLICATION OF STANDARD OPERATOR*)
 | |
| 80060   VAR RESMODE: MODE;
 | |
| 80070       LENGS: INTEGER;
 | |
| 80080     BEGIN WITH OPTABL[OPBLK] DO
 | |
| 80090       BEGIN
 | |
| 80100       CASE OPIDNDX OF
 | |
| 80110         IDAA:
 | |
| 80120           BEGIN RESMODE := XMODES[COMMX];
 | |
| 80130           PUTMD(RESMODE, RESMODE);
 | |
| 80140           IF OPMODE<>MDABSENT THEN RESMODE := OPMODE
 | |
| 80150           END;
 | |
| 80160         IDAAL:
 | |
| 80170           BEGIN
 | |
| 80180 (*+61()   IF ODD(COMMX) THEN LENGS := 1 ELSE LENGS := 0; ()+61*)
 | |
| 80190           RESMODE := XMODES[COMMX];
 | |
| 80200           PUTMD(RESMODE, RESMODE);
 | |
| 80210           RESMODE := (*-61() OPMODE ()-61*)(*+61() LENGTHEN(OPMODE, LENGS) ()+61*);
 | |
| 80220           END;
 | |
| 80230         IDRA:
 | |
| 80240           BEGIN RESMODE := FINDREF(XMODES[COMMX]);
 | |
| 80250           PUTMD(RESMODE, XMODES[COMMX])
 | |
| 80260           END;
 | |
| 80270         IDBI:
 | |
| 80280           BEGIN IF OPMODE=MDABSENT THEN RESMODE := XMODES[COMMX] ELSE RESMODE := OPMODE;
 | |
| 80290           PUTMD(XMODES[COMMX], MDINT)
 | |
| 80300           END;
 | |
| 80310         IDBB,IDIB:
 | |
| 80320           BEGIN IF OPMODE=MDABSENT THEN RESMODE := XMODES[COMMX] ELSE RESMODE := OPMODE;
 | |
| 80330           PUTMD(LHFIRM, RHFIRM)
 | |
| 80340           END;
 | |
| 80350         IDSI:
 | |
| 80360           BEGIN RESMODE := OPMODE;
 | |
| 80370           PUTMD(REFSTRNG, RHFIRM)
 | |
| 80380           END;
 | |
| 80390         IDSC:
 | |
| 80400           BEGIN RESMODE := OPMODE;
 | |
| 80410           PUTMD(REFSTRNG, MDSTRNG)
 | |
| 80420           END;
 | |
| 80430         IDCS:
 | |
| 80440           BEGIN RESMODE := OPMODE;
 | |
| 80450           PUTMD(MDSTRNG, REFSTRNG)
 | |
| 80460           END;
 | |
| 80470         IDMON:
 | |
| 80480           BEGIN IF OPMODE=MDABSENT THEN RESMODE := XMODES[COMMX] ELSE RESMODE := OPMODE;
 | |
| 80490           PUTMD(NIL, RHFIRM)
 | |
| 80500           END;
 | |
| 80510         IDMONL:
 | |
| 80520           BEGIN IF ODD(COMMX) THEN LENGS := 1 ELSE LENGS := 0;
 | |
| 80530           RESMODE := LENGTHEN(OPMODE, LENGS);
 | |
| 80540           PUTMD(NIL, RHFIRM)
 | |
| 80550           END;
 | |
| 80560         IDIBR, IDIBRM:
 | |
| 80570           BEGIN RESMODE := OPMODE;
 | |
| 80580           PUTMD(LHFIRM, MDROWS)
 | |
| 80590           END;
 | |
| 80600         END;
 | |
| 80610       BALOPR;
 | |
| 80620       IF (OPIDNDX=IDRA) AND NOT(COMMX IN [XCOMPL,XLCOMPL]) (*NOT COMPLEX*) THEN
 | |
| 80630         CGOPAB(OPOPCOD-COMMX+OPMIN, RESMODE)
 | |
| 80640       ELSE CGOPR(OPOPCOD-COMMX+OPMIN, RESMODE, OPIDNDX>IDMONL);
 | |
| 80650       IF OPIDNDX>IDMONL THEN (*DYADIC*)
 | |
| 80660         BEGIN DISPOSE(SRSTK[SRSEMP].SB); SRSEMP := SRSEMP-1 END;
 | |
| 80670       WITH SRSTK[SRSEMP].SB^ DO
 | |
| 80680         IF OPIDNDX IN [IDRA,IDSI,IDCS,IDSC] THEN SBINF := SBINF+[SBMORF]-[SBVOIDWARN]
 | |
| 80690         ELSE SBINF := SBINF+[SBMORF,SBVOIDWARN];
 | |
| 80700       END
 | |
| 80710     END;
 | |
| 80720 (**)
 | |
| 80730 (**)
 | |
| 80740 (**)
 | |
| 80750 FUNCTION OPIDUSER(STB: PSTB): BOOLEAN;
 | |
| 80760 (*FUNCTION: RETURNS TRUE IF OPERATOR STB CAN BE IDENTIFIED AS A USER OPERATOR*)
 | |
| 80770   LABEL 9;
 | |
| 80780   VAR PROCM: MODE;
 | |
| 80790     BEGIN WHILE STB<>NIL DO
 | |
| 80800       BEGIN
 | |
| 80810       PROCM := STB^.STMODE; GETOPDM(PROCM);
 | |
| 80820       IF (LHFIRM=COFIRM(LHMODE,NIL)) AND (RHFIRM=COFIRM(RHMODE,NIL)) THEN
 | |
| 80830         BEGIN OPCOD := APPOP(STB); OPIDUSER := TRUE; GOTO 9 END;
 | |
| 80840       STB := STB^.STLINK
 | |
| 80850       END;
 | |
| 80860     OPIDUSER := FALSE;
 | |
| 80870  9: END;
 | |
| 80880 (**)
 | |
| 80890 (**)
 | |
| 80900 (**)
 | |
| 80910 (**)
 | |
| 80920 PROCEDURE OPDOUSER;
 | |
| 80930 (*FUNCTION: GENERATES CODE FOR APPLICATION OF USER-DEFINED OPERATOR*)
 | |
| 80940   VAR SB:PSB;
 | |
| 80942       ADIC: 1..2;
 | |
| 80944 (*+05() OFFST, I: INTEGER; ()+05*)
 | |
| 80950     BEGIN
 | |
| 80952     ADIC := 1+ORD(LHFIRM<>MDABSENT);
 | |
| 80960     PUTMD(LHMODE, RHMODE);
 | |
| 80970     BALOPR;
 | |
| 80972     SB := MAKESUBSTACK(ADIC, OPCOD^.STMODE^.MDPRRMD);
 | |
| 80974 (*+05()
 | |
| 80975     OFFST := 0;
 | |
| 80976     FOR I := 0 TO ADIC-1 DO WITH OPCOD^.STMODE^.MDPRCPRMS[I]^ DO
 | |
| 80978       IF MDV.MDPILE THEN OFFST := OFFST+SZADDR ELSE OFFST := OFFST+MDV.MDLEN;
 | |
| 80979     CLEAR(RTSTACK);
 | |
| 80980     ADJUSTSP := 0; HOIST(SUBSTLEN([SBTSTK..SBTDL]), OFFST, FALSE);
 | |
| 80981     IF ADJUSTSP<>0 THEN
 | |
| 80982       BEGIN
 | |
| 80983       FOR I := 0 TO ADIC-1 DO
 | |
| 80984         BEGIN SRSTK[SRSEMP+1-I] := SRSTK[SRSEMP-I]; UNSTACKSB END;
 | |
| 80985       SRSEMP := SRSEMP-ADIC; FILL(SBTSTK, PUSHSB(MDINT));
 | |
| 80986       SRSEMP := SRSEMP+ADIC;
 | |
| 80987       FOR I := ADIC-1 DOWNTO 0 DO STACKSB(SRSTK[SRSEMP-I].SB);
 | |
| 80988       END;
 | |
| 80989 ()+05*)
 | |
| 80990     PUTIND(OPCOD); CGOPCALL; POPUNITS;
 | |
| 81000     WITH SB^ DO SBINF := SBINF+[SBMORF]-[SBVOIDWARN];
 | |
| 81010     END;
 | |
| 81020 (**)
 | |
| 81030 (**)
 | |
| 81040 PROCEDURE OPIDENT(MONADIC: BOOLEAN);
 | |
| 81050 (*FUNCTION: IDENTIFIES APPLIED-OPERATOR AND ELABORATES FORMULA*)
 | |
| 81060   LABEL 9;
 | |
| 81070   VAR STB: PSTB;
 | |
| 81080       LEX: PLEX;
 | |
| 81090     BEGIN
 | |
| 81100     RHFIRM := SRSTK[SRSEMP].SB^.SBMODE;
 | |
| 81110     IF MONADIC THEN LHFIRM := MDABSENT
 | |
| 81120     ELSE IF SRSTK[SRSEMP].SB^.SBBALSTR<>STRNONE THEN
 | |
| 81130       LHFIRM := SRSTK[SRSUBP-1].SB^.SBMODE
 | |
| 81140     ELSE
 | |
| 81150       LHFIRM := SRSTK[SRSEMP-2].SB^.SBMODE;
 | |
| 81160     LEX := SRPLSTK[PLSTKP+1];
 | |
| 81170     STB := LEX^.LXV.LXPSTB;
 | |
| 81180     IF STB=NIL THEN STB := GETPRIO(LEX);
 | |
| 81190     IF OPIDSTD(STB) THEN OPDOSTD
 | |
| 81200     ELSE WITH STB^ DO
 | |
| 81210       BEGIN
 | |
| 81220         IF STUSERLEX<>NIL THEN
 | |
| 81230           IF OPIDUSER(STUSERLEX^.LXV.LXPSTB) THEN GOTO 9;
 | |
| 81240         IF MONADIC THEN
 | |
| 81250           BEGIN IF RHFIRM<>MDERROR THEN SEMERRP(ESE+23, LEX); OPCOD := MONADUMMY END
 | |
| 81260         ELSE
 | |
| 81270           BEGIN IF (LHFIRM<>MDERROR) AND (RHFIRM<>MDERROR) THEN SEMERRP(ESE+24, LEX); OPCOD := DYADUMMY END;
 | |
| 81280         GETOPDM(OPCOD^.STMODE);
 | |
| 81290    9: OPDOUSER
 | |
| 81300       END;
 | |
| 81310     END;
 | |
| 81320 (**)
 | |
| 81330 (**)
 | |
| 81340 PROCEDURE DEFOPM(OP: PSTB; M: MODE);
 | |
| 81350 (*FUNCTION: PROVIDES MODE FOR STBLOCK CREATED IN DEFOP*)
 | |
| 81360   VAR PRIO: PSTB;
 | |
| 81370     BEGIN
 | |
| 81380     WITH M^ DO IF (MDV.MDCNT<=0) OR (MDV.MDCNT>2) THEN
 | |
| 81390       BEGIN SEMERR(ESE+54); M := MONADUMMY^.STMODE END;
 | |
| 81400     GETOPDM(M);
 | |
| 81410     LHFIRM := COFIRM(LHMODE,NIL); RHFIRM := COFIRM(RHMODE,NIL);
 | |
| 81420     PRIO := OP^.STLEX^.LINK^.LXV.LXPSTB;
 | |
| 81430     IF (LHFIRM<>MDABSENT) AND (PRIO^.STDYPRIO=0) THEN SEMERR(ESE+55);
 | |
| 81440     OP^.STMODE := M;
 | |
| 81450     IF OPIDSTD(PRIO) OR OPIDUSER(OP^.STLINK) THEN SEMERR(ESE+56)
 | |
| 81460     END;
 | |
| 81470 (**)
 | |
| 81480 (**)
 | |
| 81490 PROCEDURE COLLSC(SB: PSB);
 | |
| 81500 (*PUTS MODE OF NEXT UNIT OF DISPLAY ON SC CHAIN*)
 | |
| 81510     BEGIN
 | |
| 81520     WITH SB^ DO WITH SBMODE^ DO
 | |
| 81530       BEGIN
 | |
| 81540       IF MDV.MDID=MDIDROW THEN
 | |
| 81550         SCPUSH(FINDROW(MDPRRMD, MDV.MDCNT-1))
 | |
| 81560       ELSE IF MDV.MDID=MDIDSTRUCT THEN
 | |
| 81570         BEGIN
 | |
| 81580         IF SBLEVEL>=MDV.MDCNT THEN
 | |
| 81590           BEGIN SEMERR(ESE+59); SCPUSH(MDERROR) END
 | |
| 81600         ELSE SCPUSH(MDSTRFLDS[SBLEVEL].MDSTRFMD)
 | |
| 81610         END
 | |
| 81620       ELSE SCPUSH(MDERROR);
 | |
| 81630       SBLEVEL := SBLEVEL+1
 | |
| 81640       END
 | |
| 81650     END;
 | |
| 81660 (**)
 | |
| 81670 (**)
 | |
| 81680 (**)
 | |
| 81690 (**)
 | |
| 81700 ()+85*)
 |