82000 (* COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER *) 82010 (*+83() 82020 (**) 82030 (*+21() 82040 PROCEDURE MONITORSEMANTIC(SRTN: RTNTYPE); 82050 BEGIN 82060 WRITE(OUTPUT, LSTLINE:5, PLSTKP:3, RTSTKDEPTH:4, ' S ', SRTN:3); 82070 (*+01() WRITELN(OUTPUT, SRSEMP:4,SRSUBP:4,' ', ORD(SRSTK[SRSEMP].SB):6OCT, ' ', ORD(RTSTACK):6OCT) ()+01*) 82080 (*-01() IF SRSEMP<0 THEN WRITELN(OUTPUT) 82090 ELSE WRITELN(OUTPUT, SRSEMP:4,SRSUBP:4,' ',ORD(SRSTK[SRSEMP].SB):6,' ',ORD(RTSTACK):6) ()-01*) 82100 END; 82110 ()+21*) 82120 (**) 82130 (**) 82140 PROCEDURE SEMANTICROUTINE(SRTN: RTNTYPE); 82150 (*FUNCTION: CALLS THE SEMANTIC ROUTINE SPECIFIED BY THE PARSER*) 82160 (*-53() 82170 LABEL 759; 82180 ()-53*) 82190 VAR STB1: PSTB; 82200 LEX1: PLEX; 82210 SB, SBB: PSB; 82220 R: PRANGE; 82230 M, FLDM: MODE; 82240 SECDRY: 0..3; 82250 OFFST: OFFSETR; 82260 ROWCOUNT: CNTR; 82270 I, J: INTEGER; 82280 L: LABL; 82290 PTR: PTRIMCHAIN; 82300 REFED: BOOLEAN; 82310 (*+53() 82320 PROCEDURE MONITOR1; 82330 VAR I: INTEGER; 82340 ()+53*) 82350 BEGIN 82360 IF SRTN>=ESY01 THEN 82370 BEGIN 82380 FOR I := ERRPTR+1 TO ERRLXPTR-1 DO ERRBUF[I] := ERRCHAR; 82390 IF ERRPTRNIL THEN 84860 BEGIN 84870 RGINFO := RGINFO+[DCLLOOP]; 84880 CGFIXRG; 84890 SBOFFSET := ALLOC(SZWORD); (*DECMARKER*) 84900 IF NOT(SBEMPTYBY IN SBINF) THEN I := ALLOC(SZINT); (*BY PART*) 84910 STB1 := GETSTB(LEX1, [STINIT (*FOR STDIDTY*)], STBDEFID); 84920 WITH STB1^ DO 84930 BEGIN STMODE := MDINT; STOFFSET := ALLOC(SZINT); (*FROM PART*) 84932 (*+41() SBOFFSET := STOFFSET+SZINT; (*OFFSET OF 'TO' PART*) ()+41*) 84940 IF SBEMPTYTO IN SBINF THEN 84950 CGLPC(SB) 84960 ELSE 84970 BEGIN I := ALLOC(SZINT) (*TO PART*); CGLPB(SB) END 84980 END 84990 END 85000 ELSE CGLPA(SB); 85010 POPUNITS; 85020 CGFLINE; 85030 SEMANTICROUTINE(34) (*SR20A*) (*START RANGE OF WHILE-PART ( OR DO-PART ) *) 85040 END 85050 END; 85060 (**) 85070 55: (*SR26B*) 85080 (*FUNCTION: EXECUTED BEFORE WHILE-PART AFTER EMPTY COUNTING-PART.*) 85090 BEGIN PUTLOOP(NIL); SEMANTICROUTINE(54) (*SR26A*) END; 85100 (**) 85110 56: (*SR26C*) 85120 (*FUNCTION: EXECUTED AFTER WHILE-DO-PART WITH NON-EMPTY WHILE-PART.*) 85130 BEGIN ASSIGNFLAD; RANGEXT END; (*END RANGE OF WHILE-PART*) 85140 (**) 85150 57: (*SR27A*) 85160 (*FUNCTION: EXECUTED BEFORE DO-PART AFTER NON-EMPTY WHILE-PART.*) 85170 BEGIN 85180 IF DCLLABEL IN RGINFO THEN SEMERR(ESE+02); 85190 MEEKLOAD(MDBOOL, ESE+36); 85200 CGLPD; 85210 DISPOSE(SRSTK[SRSEMP].SB); SRSEMP := SRSEMP-1; 85220 SCPUSH(MDVOID); 85230 SEMANTICROUTINE(34) (*SR20A*) (*START RANGE OF DO-PART*) 85240 END; 85250 (**) 85260 58: (*SR27B1*) 85270 (*FUNCTION: EXECUTED BEFORE DO-PART AFTER EMPTY WHILE-PART AND NON-EMPTY COUNTING-PART.*) 85280 BEGIN SEMANTICROUTINE(54) (*SR26A*); SCPUSH(MDVOID) END; 85290 (**) 85300 59: (*SR27B2*) 85310 (*FUNCTION: EXECUTED BEFORE DO-PART AFTER EMPTY-WHILE-PART AND EMPTY COUNTING-PART.*) 85320 BEGIN PUTLOOP(NIL); SEMANTICROUTINE(58) (*SR27B1*) END; 85330 (**) 85340 60: (*SR27C*) 85350 (*FUNCTION: EXECUTED AFTER DO-PART.*) 85360 BEGIN 85370 STRONG; RANGEXT; (*END RANGE OF DO-PART*) 85380 UNSTACKSB; 85390 DISPOSE(SRSTK[SRSEMP].SB); SRSEMP := SRSEMP-1; 85400 CGLPE; 85405 SRSTK[SRSEMP].SB^.SBMODE:=MDVOID; 85410 STACKSB(SRSTK[SRSEMP].SB); (*THE .VOID RESULT OF THE DO-PART*) 85420 END; 85430 (**) 85440 (*+53() 85450 END; 85460 END END; 85470 PROCEDURE MONITOR2; 85480 LABEL 759; 85490 VAR I: INTEGER; 85500 BEGIN 85510 (*+21() MONITORSEMANTIC(SRTN); ()+21*) 85520 CASE SRTN OF 85530 ()+53*) 85540 61: (*SR28*) 85550 (*FUNCTION: EXECUTED AFTER LOOP-CLAUSE*) 85560 WITH SRSTK[SRSEMP].SB^ DO 85570 IF SBLEX<>NIL THEN 85580 BEGIN CURID := CURID-SZWORD-(3-ORD(SBEMPTYBY IN SBINF)-ORD(SBEMPTYTO IN SBINF))*SZINT; 85590 IF NOT(SBEMPTYTO IN SBINF) THEN ASSIGNFLAD; 85600 CGLPG 85610 END; 85620 (**) 85630 62: (*SR29*) 85640 (*FUNCTION: VOIDS A UNIT FOLLOWED BY A SEMICOLON IN AN ESTABLISHING-CLAUSE.*) 85650 BEGIN 85660 SCPUSH(MDVOID); STRONG; 85670 UNSTACKSB; 85680 DISPOSE(SRSTK[SRSEMP].SB); SRSEMP := SRSEMP-1; 85690 END; 85700 (**) 85710 63: (*SR33*) 85720 (*APPLIED-LABEL*) 85730 STB1 := APPLAB(SRPLSTK[PLSTKP]); 85740 (**) 85750 64: (*SR34A*) 85760 (*FUNCTION: EXECUTED WHEN APPLIED-IDENTIFIER IS FOUND. 85770 PLACES SEMANTIC BLOCK FOR THE IDENTIFIER ON THE STACK. 85780 *) 85790 PUTIND(APPID(SRPLSTK[PLSTKP])); 85800 (**) 85810 65: (*SR34B1*) 85820 (*FUNCTION: EXECUTED WHEN DENOTATION IS ENCOUNTERED. 85830 PLACES SEMANTIC BLOCK FOR THE DENOTATION ON THE STACK. 85840 *) 85850 BEGIN PUTDEN(SRPLSTK[PLSTKP]) END; 85860 (**) 85870 66: (*SR34B2*) 85880 (*FUNCTION: AS SR34B1, BUT TAKES DENOTATION FROM INP*) 85890 BEGIN SRSEMP := SRSEMP-1; PUTDEN(INP) END; 85900 (**) 85910 67: (*SR34C*) 85920 (*FUNCTION: EXECUTED WHEN A HIP IS ENCOUNTERED. 85930 PLACES SEMANTIC BLOCK FOR IT ON STACK. 85940 *) 85950 SB := PUSHSB(SRPLSTK[PLSTKP]^.LXV.LXPMD); (*COMORF*) 85960 (**) 85970 68: (*SR35*) 85980 (*FUNCTION: EXECUTED AT START OF MODE-DEFINITION*) 85990 BEGIN 86000 DEFMI(SRPLSTK[PLSTKP]); 86010 END; 86020 (**) 86030 69: (*SR36*) 86040 (*FUNCTION: EXECUTED AT START OF ACTUAL-ROWED-DECLARER IN MODE-DEFINITION*) 86050 BEGIN 86060 ROUTNNT; 86070 CGRTA; 86080 SRSEMP := SRSEMP+1; SRSTK[SRSEMP].MD := PRCBNDS; 86090 SEMANTICROUTINE(100) (*SR63B*); 86100 SB:=MAKESUBSTACK(0,MDBNDS) 86110 END; 86120 (**) 86130 70: (*SR37A*) 86140 (*FUNCTION: EXECUTED WHEN "ROWED" MODE-INDICATION IS APPLIED IN AN ACTUAL-DECLARER 86150 IN A GENERATOR. 86160 *) 86170 BEGIN 86180 SRSEMP := SRSEMP-1; 86190 ELABMI(SRPLSTK[PLSTKP]); 86200 END; 86210 (**) 86220 71: (*SR37B*) 86230 (*FUNCTION: EXECUTED WHEN A "ROWED" MODE-INDICATION ISAPPLIED IN AN ACTUAL-DECLARER 86240 IN A VARIABLE-DEFINITION OR SOME GENERATORS. 86250 *) 86260 BEGIN 86270 SRSEMP := SRSEMP-1; 86280 BRKASCR; 86290 ELABMI(SRPLSTK[PLSTKP + ORD(SRPLSTK[PLSTKP]^.LXV.LXIO<>LXIOMDIND)]); 86300 END; 86310 (**) 86320 72: (*SR38A*) 86330 (*FUNCTION: EXECUTED WHEN MODE-DEFINITION IS COMPLETED BY ASCRIBING 86340 A USER DEFINED "ROWED" MODE-INDICATION. 86350 *) 86360 BEGIN 86370 STB1 := SRPLSTK[PLSTKP+1]^.LXV.LXPSTB; 86380 FILLSTB(STB1); STB1^.STMODE := SRPOPMD; 86390 NECENV(SRPLSTK[PLSTKP]^.LXV.LXPSTB); 86400 PUTIND(SRPLSTK[PLSTKP]^.LXV.LXPSTB); 86410 CGFIRM 86420 END; 86430 (**) 86440 73: (*SR38B*) 86450 (*FUNCTION: EXECUTED AFTER MODE-DEFINITION IN CASES NOT COVERED BY SR38A.*) 86460 BEGIN 86470 M := SRPOPMD; 86480 STB1 := SRPLSTK[PLSTKP+1]^.LXV.LXPSTB; 86490 IF M=NIL THEN M := MDERROR; (*FOR .MODE .A = .A*) 86500 IF M=NIL THEN M:=MDERROR; 86510 WITH STB1^, SRSTK[SRSEMP].SB^ DO 86520 BEGIN 86530 IF M^.MDV.MDID=MDIDROW THEN (*ROWED MODE*) 86540 BEGIN 86550 UNSTACKSB; 86560 STPTR := SBXPTR ; STLEVEL := SBLEVEL; 86570 RGSTATE := 13; 86580 END; 86590 STDEFTYP := STDEFTYP+[STCONST]; 86600 IF STRECUR IN STDEFTYP THEN RECURFIX(M); 86610 STMODE := M; 86620 END; 86630 END; 86640 (**) 86650 (**) 86660 74: (*SR39*) 86670 (*FUNCTION: EXECUTED AFTER DEFINING-LABEL*) 86680 BEGIN 86690 DEFLAB(SRPLSTK[PLSTKP]); 86700 CGFLINE 86710 END; 86720 (**) 86730 75: (*SR41*) 86740 (*FUNCTION: EXECUTED AFTER SECONDARY OF SELECTION*) 86750 BEGIN 86760 M := WEAK; 86770 SECDRY := 0; 86780 WITH M^ DO IF MDV.MDID=MDIDREF THEN 86790 BEGIN M := MDPRRMD; SECDRY := 1 END; 86800 WITH M^ DO IF MDV.MDID=MDIDROW THEN 86810 BEGIN ROWCOUNT := MDV.MDCNT; M := MDPRRMD; SECDRY := SECDRY+2 END; 86820 IF M^.MDV.MDID<>MDIDSTRUCT THEN SEMERR(ESE+43) 86830 ELSE WITH M^ DO 86840 BEGIN OFFST := 0; 86850 LEX1 := SRPLSTK[PLSTKP+2]; 86860 FOR I := 0 TO MDV.MDCNT-1 DO WITH MDSTRFLDS[I] DO 86870 BEGIN 86880 FLDM := MDSTRFMD; 86890 IF MDSTRFLEX=LEX1 THEN GOTO 759; 86900 OFFST := OFFST+FLDM^.MDV.MDLEN 86910 END; 86920 SEMERRP(ESE+44, LEX1); 86930 759: CGSELECT(OFFST, FLDM, SECDRY); 86940 WITH SRSTK[SRSEMP].SB^ DO 86950 BEGIN 86960 IF SECDRY>=2 THEN FLDM := FINDROW(FLDM, ROWCOUNT); 86970 IF ODD(SECDRY) THEN SBMODE := FINDREF(FLDM) 86980 ELSE SBMODE := FLDM; 86990 SBINF := SBINF+[SBMORF,SBVOIDWARN]; 87000 END; 87010 END 87020 END; 87030 (**) 87040 (**) 87050 76: (*SR42*) 87060 (*FUNCTION: EXECUTED AFTER PRIMARY OF CALL*) 87070 BEGIN 87080 M := MEEK; 87090 SBB := MAKESUBSTACK(1,M^.MDPRRMD); 87100 WITH M^, SRSTK[SRSEMP] DO WITH SB^ DO BEGIN 87102 (*-02() CGFIRM; (*LOAD ANY DELAYED STUFF*) 87104 SBINF := SBINF-[SBSTKDELAY]; (*BUT NOT NECESSARILY THIS STUFF*) 87106 ()-02*) 87110 IF (MDV.MDID=MDIDPASC) AND (SBTYP<>SBTDEN) THEN M := COERCE(COFIRM(M, NIL)); 87120 IF NOT (SBTYP IN [SBTDEN,SBTPROC,SBTRPROC]) THEN LOADSTK(RTSTACK); 87130 IF NOT (MDV.MDID IN [MDIDPASC,MDIDPROC]) THEN 87140 BEGIN MODERR(M, ESE+25); SBMODE := PRCERROR END; 87150 UNSTACKSB; (*PRIMARY OF CALL*) 87160 RANGENT; (*FOR PARAMETERS*) 87170 STACKSB(SB); (*SO IT IS PART OF THE PARAMETERS RANGE*) 87171 (*+05() 87172 IF M^.MDV.MDID<>MDIDPASC THEN 87173 BEGIN 87174 OFFST := 0; 87175 FOR I := 0 TO MDV.MDCNT-1 DO WITH MDPRCPRMS[I]^ DO 87178 IF MDV.MDPILE THEN OFFST := OFFST+SZADDR ELSE OFFST := OFFST+MDV.MDLEN; 87179 CLEAR(RTSTACK); 87180 ADJUSTSP := 0; HOIST(0, OFFST, FALSE); 87182 IF ADJUSTSP<>0 THEN FILL(SBTSTK, PUSHSB(MDINT)); 87183 END; 87184 ()+05*) 87186 RGINFO := RGINFO+[DCLLOCRNG]; 87190 WITH ROUTNL^ DO RNLOCRG := RNLOCRG+1; 87200 SBCNT := 0; 87210 PARMSC 87220 END 87230 END; 87240 (**) 87250 77: (*SR43*) 87260 (*FUNCTION: EXECUTED FOR EVERY OPERAND WHICH MAY POSSIBLY BE A LEFT-DYADIC-OPERAND. 87270 CHECKS THAT THE OPERATOR TO THE RIGHT OF THE OPERAND IS A LEGAL DYADIC-OPERATOR. 87280 *) 87290 WITH INP^.LXV DO 87300 IF LXPSTB<>NIL THEN 87310 IF LXPSTB^.STDYPRIO=10 THEN SEMERRP(ESE+22, INP); 87320 (**) 87330 78: (*SR44*) 87340 (*FUNCTION: AFTER MONADIC-OPERATOR*) 87350 BEGIN OPDSAVE(FIRMBAL); OPIDENT(TRUE) END; 87360 (**) 87370 79: (*SR45*) 87380 (*FUNCTION: EXECUTED IN ORDER TO REDUCE OPRAND OPR OPRAND TO OPRAND*) 87390 BEGIN OPDSAVE(FIRMBAL); OPIDENT(FALSE) ; 87400 END; 87410 (**) 87420 80: (*SR46*) 87430 (*FUNCTION: EXECUTED FOR EACH LEFT-HAND-OPERAND OF A DYADIC-OPERATOR*) 87440 BEGIN 87450 M := FIRMBAL; 87460 IF BALFLAG OR (SRSTK[SRSEMP].SB^.SBDELAYS<>0) THEN LHOPBAL(M); 87470 OPDSAVE(M) 87480 END; 87490 (**) 87500 (**) 87510 81: (*SR48A*) 87520 (*FUNCTION: EXECUTED AFTER LEFT HAND TERTIARY OF IDENTITY-RELATION*) 87530 BEGIN 87540 M := BALANCE(STRSTRONG); 87550 IF BALFLAG OR (SRSTK[SRSEMP].SB^.SBDELAYS<>0) THEN LHOPBAL(M); 87560 OPDSAVE(M) 87570 END; 87580 (**) 87590 82: (*SR48B*) 87600 (*FUNCTION: EXECUTED AFTER RIGHT HAND TERTIARY OF IDENTITY-RELTION*) 87610 BEGIN 87620 OPDSAVE(BALANCE(STRSTRONG)); 87630 IF SRSTK[SRSEMP].SB^.SBBALSTR=STRNONE THEN SB := SRSTK[SRSEMP-2].SB 87640 ELSE SB := SRSTK[SRSUBP-1].SB; 87650 (*SB IS RESULT OF BALANCING LHS*) 87660 M := BALMOIDS(SRSTK[SRSEMP].SB^.SBMODE, SB^.SBMODE); 87670 WITH SRSTK[SRSEMP].SB^ DO 87680 IF SBBALSTR>M1COERC THEN M1COERC := SBBALSTR; 87690 WITH SB^ DO 87700 IF SBBALSTR>M2COERC THEN M2COERC := SBBALSTR; 87710 IF (M1COERC>STRSOFT) AND (M2COERC>STRSOFT) THEN SEMERR(ESE+26) 87720 ELSE IF M^.MDV.MDID<>MDIDREF THEN MODERR(M, ESE+57); 87730 LHFIRM := NIL; (*SO THAT PUTMD AND BALOPR DO NOT THINK IT IS MONADIC*) 87740 PUTMD(M, M); 87750 BALOPR; 87760 CGOPR(PIDTYREL+SRPLSTK[PLSTKP+1]^.LXV.LXP, MDBOOL, TRUE); 87770 DISPOSE(SRSTK[SRSEMP].SB); SRSEMP := SRSEMP-1; 87780 WITH SRSTK[SRSEMP].SB^ DO SBINF := SBINF+[SBMORF,SBVOIDWARN] 87790 END; 87800 (**) 87810 (**) 87820 83: (*SR49A*) 87830 (*FUNCTION: EXECUTED AFTER DESTINATION OF ASSIGNATION.*) 87840 BEGIN M := SOFT; 87850 WITH M^ DO 87860 BEGIN 87870 IF MDV.MDID<>MDIDREF THEN 87880 BEGIN MODERR(M, ESE+20); SRSTK[SRSEMP].SB^.SBMODE := MDREFERROR; SCPUSH(MDERROR) END 87890 ELSE SCPUSH(MDPRRMD); 87900 CGDEST; 87910 END 87920 END; 87930 (**) 87940 (**) 87950 84: (*SR49B*) 87960 (*FUNCTION: EXECUTED AFTER SOURCE OF ASSIGNATION.*) 87970 BEGIN 87980 STRONG; CGASSIGN; DISPOSE(SRSTK[SRSEMP].SB);SRSEMP := SRSEMP-1; 87990 WITH SRSTK[SRSEMP].SB^ DO SBINF := SBINF-[SBMORF,SBVOIDWARN] 88000 END; 88010 (**) 88020 85: (*SR50*) 88030 (*FUNCTION: EXECUTED AFTER PRIMARY OF SLICE*) 88040 BEGIN M:= WEAK; 88050 WITH M^ DO IF MDV.MDID=MDIDREF THEN M := MDPRRMD; 88060 WITH M^ DO 88070 IF M=MDSTRNG THEN BEGIN FLDM := COERCE(M); ROWCOUNT := 1 END 88080 ELSE IF MDV.MDID=MDIDROW THEN ROWCOUNT:=MDV.MDCNT 88090 ELSE BEGIN MODERR(M, ESE+47); ROWCOUNT := 63 (*MAX CNTR*) END; 88100 SBB := MAKESUBSTACK(1, M); 88110 WITH SBB^ DO 88120 BEGIN 88130 SBTRIMCNT := ROWCOUNT; SBSLICEDIM := ROWCOUNT; SBPRIMDIM := ROWCOUNT; 88140 SBTRIMS := NIL; SBUNITS := 0 END; 88150 CGFIRM; 88160 SEMANTICROUTINE(86) (*SR51*) 88170 END; 88180 (**) 88190 86: (*SR51*) 88200 (*FUNCTION: EXECUTED AT START OF NEW TRIMSCRIPT*) 88210 BEGIN 88220 SB := SRSTK[SRSUBP-1].SB; 88230 WITH SB^ DO 88240 BEGIN 88250 IF SBTRIMCNT=0 THEN SEMERR(ESE+48); (*TOO MANY TRIMSCRIPTS*) 88260 SBTRIMCNT := SBTRIMCNT-1; 88270 NEW(PTR); WITH PTR^ DO BEGIN LINK := SBTRIMS; TRTYPE := 0 END; 88280 SBTRIMS := PTR 88290 END 88300 END; 88310 (**) 88320 87: (*SR52*) 88330 (*FUNCTION: EXECUTED AFTER LOWER-BOUND OF TRIMMER*) 88340 WITH SRSTK[SRSUBP-1].SB^ DO 88350 BEGIN SBUNITS := SBUNITS+1; WITH SBTRIMS^ DO TRTYPE := TRTYPE+4 END; 88360 (**) 88370 88: (*SR53*) 88380 (*FUNCTION: EXECUTED AFTER UPPER-BOUND OF TRIMMER*) 88390 WITH SRSTK[SRSUBP-1].SB^ DO 88400 BEGIN SBUNITS := SBUNITS+1; WITH SBTRIMS^ DO TRTYPE := TRTYPE+2 END; 88410 (**) 88420 89: (*SR54A*) 88430 (*FUNCTION: EXECUTED BEFORE UNIT IN REVISED-LOWER-BOUND*) 88440 IF SRSTK[SRSUBP-1].SB^.SBMODE=MDSTRNG THEN SEMERR(ESE+32); 88450 (**) 88460 90: (*SR54B*) 88470 (*FUNCTION: EXECUTED AFTER REVISED-LOWER-BOUND OF TRIMMER*) 88480 BEGIN 88490 MEEKLOAD(MDINT, ESE+50); 88494 WITH SRSTK[SRSUBP-1].SB^ DO 88500 BEGIN SBUNITS := SBUNITS+1; WITH SBTRIMS^ DO TRTYPE := TRTYPE+1 END; 88510 END; 88520 (**) 88530 (*+53() 88540 END END ; 88550 PROCEDURE MONITOR3; 88560 VAR I: INTEGER; 88570 BEGIN 88580 (*+21() MONITORSEMANTIC(SRTN); ()+21*) 88590 CASE SRTN OF 88600 ()+53*) 88610 91: (*SR55*) 88620 (*FUNCTION: EXECUTED WHEN DEFAULT TRIMMER IS ENCOUNTERED. 88630 A DEFAULT TRIMMER CONSISTS OF A COLON (NO UMITS) *) 88640 WITH SRSTK[SRSUBP-1].SB^.SBTRIMS^ DO TRTYPE := TRTYPE+8; 88650 (**) 88660 92: (*SR56*) 88670 (*FUNCTION: EXECUTED AFTER SUBSCRIPT*) 88672 BEGIN 88674 IF BALFLAG THEN I := SRSTK[SRSUBP].SUBP ELSE I := SRSUBP; 88680 WITH SRSTK[I-1].SB^ DO 88690 BEGIN 88700 IF (SBSLICEDIM=1) AND (SBPRIMDIM<3) THEN WITH SRSTK[I+1].SB^ DO 88710 SBINF := SBINF-[SBSTKDELAY]; (*TO SAVE UNNECESSARY STACKING*) 88720 MEEKLOAD(MDINT, ESE+51); 88730 SBSLICEDIM := SBSLICEDIM-1; 88740 SBUNITS := SBUNITS+1; WITH SBTRIMS^ DO TRTYPE := TRTYPE+9 88750 END; 88752 END; 88760 (**) 88770 93: (*SR57*) 88780 (*FUNCTION: EXECUTED AFTER SLICE*) 88790 BEGIN 88800 SB := SRSTK[SRSUBP-1].SB; 88810 WITH SB^ DO 88820 BEGIN 88830 M := SRSTK[SRSUBP+1].SB^.SBMODE; 88840 IF SBTRIMCNT>0 THEN MODERR(M, ESE+49); (*TOO FEW TRIMSCRIPTS*) 88850 WITH M^ DO 88860 BEGIN REFED := MDV.MDID=MDIDREF; IF REFED THEN M := MDPRRMD END; 88870 WITH M^ DO 88880 IF MDV.MDID=MDIDROW THEN 88890 BEGIN M := FINDROW(MDPRRMD, SBSLICEDIM); 88900 IF REFED THEN M := FINDREF(M) 88910 END 88920 ELSE IF SBSLICEDIM=0 THEN 88930 M := MDCHAR; 88940 CGSLICE(SB, REFED); 88950 POPUNITS; 88960 SBMODE := M; SBINF := SBINF+[SBMORF,SBVOIDWARN]; 88970 END 88980 END; 88990 (**) 89000 (**) 89010 (**) 89020 (**) 89030 94: (*SR58*) 89040 (*FUNCTION: EXECUTED AFTER LOWER-BOUND OF TRIMMER OR ACTUAL-ROWER.*) 89050 MEEKLOAD(MDINT, ESE+52); 89060 (**) 89070 95: (*SR59*) 89080 (*FUNCTION: EXECUTED AFTER UPPER-BOUND OF TRIMMER OR ACTUAL-ROWER.*) 89090 MEEKLOAD(MDINT, ESE+53); 89100 (**) 89110 96: (*SR60*) 89120 (*FUNCTION: EXECUTED AFTER ALL BUT LAST ACTUAL-PARAMETER IN ACTUAL-PARAMETER-LIST.*) 89130 BEGIN STRONG; 89140 CGFIRM; 89150 PARMSC 89160 END; 89170 (**) 89180 97: (*SR61*) 89190 (*FUNCTION: EXECUTED AFTER A CALL*) 89200 BEGIN 89210 STRONG; 89220 SB := SRSTK[SRSUBP+1].SB; 89230 WITH SB^.SBMODE^ DO 89240 BEGIN 89250 (*+01() IF (MDV.MDID=MDIDPASC) AND (SB^.SBCNT<3) THEN 89260 BEGIN 89270 IF SB^.SBCNT>1 THEN WITH SRSTK[SRSEMP-1].SB^ DO SBINF := SBINF-[SBSTKDELAY]; 89280 GETTOTAL(SRSTK[SRSEMP].SB) 89290 END 89300 ELSE 89310 ()+01*) 89320 CGFIRM; 89330 IF SB^.SBCNTNIL DO 89850 WITH ROUTNL^ ,STB1^ DO 89860 BEGIN 89870 IF STBLKTYP=STBDEFID THEN 89880 BEGIN 89890 STOFFSET := STOFFSET -PARAMOFFSET -RNPARAMS; 89910 CGPARM(STB1); 89920 END; 89930 STB1:=STTHREAD 89940 END; 89950 CURID:=0;I:=ALLOC(SIZIBBASE+SIZLEBBASE); 89960 CGFLINE; 89970 SCPUSH(SRSTK[SRSEMP].MD^.MDPRRMD); 89980 ROUTNL^.RNMODE := SRPOPMD 89990 END; 90000 (**) 90010 101: (*SR63C*) 90020 (*FUNCTION: EXECUTED AFTER ROUTINE-TEXT.*) 90030 BEGIN 90040 STRONG; 90050 RANGEXT; 90060 CGRTB; 90070 (*CURRENTLY, SRSTK[SRSEMP].SB REPRESENTS THE FINAL UNIT OF THE ROUTINE-TEXT, AND ITS 90080 YIELD SITS UPON THE CONCEPTUAL RTSTACK. NOW, SRSTK[SRSEMP].SB IS MODIFIED TO REPRESENT 90090 THE ROUTINE-TEXT ITSELF. 90100 *) 90102 WITH SRSTK[SRSEMP] DO WITH SB^, ROUTNL^ DO 90104 BEGIN 90110 IF ((RGSTATE MOD 16)=0) OR (STVAR IN DCLDEFN) THEN (*ANONYMOUS ROUTINE*) RNLEX := NIL 90120 ELSE WITH DCIL^ DO 90130 IF STBLKTYP=STBDEFOP THEN RNLEX := STLEX^.LINK 90140 ELSE RNLEX := STLEX; 90142 CGRTC; 90150 UNSTACKSB; 90180 SBMODE := RNMODE; SBINF := SBINF+[SBMORF,SBVOIDWARN]; 90190 IF (RNNONIC=1) OR (RGLEV=2) THEN 90200 BEGIN 90210 SBXPTR := RNPROCBLK; 90220 SBLEVEL:=RNNECLEV; 90230 SBOFFSET:=0; 90240 SBLEN := SZADDR; 90250 SBTYP:=SBTPROC; 90260 ROUTNXT; 90270 STACKSB(SB); 90280 (*-05()(*-02()ASSIGNFLAD; ()-02*) ()-05*) 90290 END 90300 ELSE 90310 BEGIN 90320 ROUTNXT; 90330 CGRTD(RNPROCBLK); 90340 END 90350 END 90360 END; 90370 (**) 90380 102: (*SR65A*) 90390 (*FUNCTION: EXECUTED AFTER DEFINING-IDENTIFIER IN ROUTINE-IDENTITY-DEFINITION.*) 90400 BEGIN DEFID(SRPLSTK[PLSTKP]); SRSEMP := SRSEMP+1; SRSTK[SRSEMP].STB := DCIL END; 90410 (**) 90420 103: (*SR65B*) 90430 (*FUNCTION: EXECUTED AFTER DEFINING-IDENTIFIER IN ROUTINE-VARIABLE-DEFINITION.*) 90440 BEGIN DCLDEFN := [STVAR,STINIT]; SEMANTICROUTINE(102) (*SR65A*) END; 90450 (**) 90460 104: (*SR65C*) 90470 (*FUNCTION: EXECUTED AFTER DEFINING-OPERATOR IN ROUTINE-OPERATION-DEFINITION*) 90480 BEGIN DEFOP(SRPLSTK[PLSTKP]); SRSEMP := SRSEMP+1; SRSTK[SRSEMP].STB := DCIL END; 90490 (**) 90500 105: (*SR66A*) 90510 (*FUNCTION: EXECUTED AFTER ROUTINE-SPECIFICATION IN ROUTINE-IDENTITY-DEFINITION 90520 OR ROUTINE-VARIABLE-DEFINITION.*) 90530 BEGIN 90540 SEMANTICROUTINE(100) (*SR63B*); 90550 STB1 := SRSTK[SRSEMP].STB; SRSEMP := SRSEMP-1; 90560 WITH STB1^ DO 90570 IF STMODE=MDROUT THEN 90580 BEGIN 90590 IF RGLEV=3 THEN 90600 BEGIN 90610 STPTR := ROUTNL^.RNPROCBLK ; 90620 STLEVEL :=0 ; STDEFTYP := STDEFTYP+[STRCONST,STCONST]; 90630 END; 90640 STMODE := ROUTNL^.RNMODE 90650 END 90660 ELSE STMODE := FINDREF(ROUTNL^.RNMODE) 90670 END; 90680 (**) 90690 106: (*SR66C*) 90700 (*FUNCTION: EXECUTED AFTER ROUTINE-SPECIFICATION IN ROUTINE-OPERATION-DEFINITION*) 90710 BEGIN 90720 SEMANTICROUTINE(100) (*SR63B*); 90730 STB1 := SRSTK[SRSEMP].STB; SRSEMP := SRSEMP-1; 90740 DEFOPM(STB1, ROUTNL^.RNMODE) 90750 END; 90760 (**) 90770 107: (*SR67A*) 90780 (*FUNCTION: EXECUTED AFTER DEFINING-IDENTIFIER IN A VARIABLE-DEFINITION WHICH HAS NO INITIALIZING UNIT.*) 90790 BEGIN DCLDEFN := [STVAR]; DEFID(SRPLSTK[PLSTKP]) END; 90800 (**) 90810 108: (*SR67B*) 90820 (*FUNCTION: EXECUTED AFTER DEFINING-IDENTIFIER IN AN IDENTITY-DEFINITION OR A VARIABLE-DEFINITION 90830 WHICH INCLUDES AN INITIALIZING UNIT. ENTERS THE IDENTIFIER IN THE SYMBOL TABLE AND 90840 ESTABLISHES THE MODE OF THE STRONG CONTEXT OF THE UNIT WHICH FOLLOWS. 90850 *) 90860 BEGIN SCPUSH(DCLMODE); DCLDEFN := DCLDEFN+[STINIT]; DEFID(SRPLSTK[PLSTKP]) END; 90870 (**) 90880 109: (*SR67C*) 90890 (*FUNCTION: EXECUTED AFTER THE DEFINING-OPERATOR IN AN OPERATION-DEFINITION*) 90900 BEGIN 90910 SCPUSH(DCLMODE); 90920 DEFOP(SRPLSTK[PLSTKP]); 90930 DEFOPM(DCIL, DCLMODE) 90940 END; 90950 (**) 90960 110: (*SR68A*) 90970 (*FUNCTION: EXECUTED AFTER UNIT IN IDENTITY- OR VARIABLE-DEFINITION*) 90980 BEGIN STRONG; 90990 WITH SRSTK[SRSEMP].SB^ DO 91000 IF NOT(STVAR IN DCLDEFN) AND 91010 ((SBTYP=SBTDEN) AND NOT(STUSED IN DCIL^.STDEFTYP) 91020 OR ((SBTYP=SBTPROC) AND (NOT(STUSED IN DCIL^.STDEFTYP) OR (ROUTNL^.RNLEVEL=0)))) 91030 THEN 91040 DISALLOCIND 91050 ELSE CGFIRM; 91060 END; 91070 (**) 91080 111: (*SR68B*) 91090 (*FUNCTION: EXECUTED AFTER ROUTINE-TEXT IN ROUTINE-IDENTITY, 91100 -VARIABLE OR -OPERATION DEFINITION. 91110 *) 91120 WITH SRSTK[SRSEMP].SB^ DO 91130 IF NOT(STVAR IN DCLDEFN) AND ((SBTYP=SBTPROC) AND (NOT(STUSED IN DCIL^.STDEFTYP) OR (RGLEV=2))) 91140 THEN 91150 DISALLOCIND 91160 ELSE CGFIRM; 91170 (**) 91180 112: (*SR69*) 91190 (*FUNCTION: EXECUTED AFTER A DECLARATION-LIST.*) 91200 BEGIN 91210 BRKASCR;CGFIXRG; 91220 END; 91230 (**) 91240 113: (*SR70*) 91250 (*FUNCTION: EXECUTED AFTER FIRST UNIT OF COLLATERAL-CLAUSE*) 91260 BEGIN 91270 RGINFO := RGINFO+[DCLCOLL]; 91280 (*FINDTOPCOLL*) 91290 J := PLSTKP+2; 91300 R := RANGEL; 91310 WHILE (SRPLSTK[J]=LEXBEGIN) OR (SRPLSTK[J]=LEXOPEN) DO 91320 BEGIN 91330 J := J+1; 91340 WITH R^ DO 91350 BEGIN RGINF := RGINF+[DCLCOLL]; R := RGLINK END 91360 END; 91370 I := J-PLSTKP-1; 91380 (*FINDCOLLM*) 91390 M := SCL^.SCMODE; 91400 WITH M^ DO 91410 IF MDV.MDID=MDIDROW THEN 91420 BEGIN 91430 I := I-MDV.MDCNT; 91440 IF I>0 THEN M := MDPRRMD 91450 ELSE M := FINDROW(MDPRRMD, -I+1) 91460 END; 91470 WHILE I>0 DO WITH M^ DO 91480 BEGIN 91490 I := I-1; 91500 IF MDV.MDID<>MDIDSTRUCT THEN SEMERR(ESE+60) 91510 ELSE IF I>0 THEN M := MDSTRFLDS[0].MDSTRFMD 91520 END; 91530 NEW(SB); 91540 WITH SB^ DO 91550 BEGIN SBMODE := M; SBLEVEL := 0; SBDELAYS := 0; SBTYP := SBTVOID; SBINF := [SBCOLL] END; 91560 COLLSC(SB); STRONG; 91570 (*AT THIS POINT, THERE IS AN UNWANTED SUBSTACK MARKER AS SRSEMP-1, PUT THERE 91580 BY S-34. WE SHALL INSERT SB BELOW IT*) 91590 SRSTK[SRSEMP+1].SB := SRSTK[SRSEMP].SB; SRSEMP := SRSEMP+1; 91600 SRSTK[SRSUBP+1].SUBP := SRSTK[SRSUBP].SUBP; SRSUBP := SRSUBP+1; 91610 SRSTK[SRSUBP-1].SB := SB; 91620 IF NOT (DCLCOLL IN R^.RGINF) OR (SRPLSTK[J]^.LXV.LXIO<>LXIOUNLC) THEN CGLEFTCOLL(SB); 91630 CGCOLLUNIT; 91640 COLLSC(SB) 91650 END; 91660 (**) 91670 114: (*SR71*) 91680 (*FUNCTION: EXECUTED AFTER MIDDLE UNITS OF COLLATERAL-CLAUSE*) 91690 BEGIN STRONG; CGCOLLUNIT; COLLSC(SRSTK[SRSUBP-1].SB) END; 91700 (**) 91710 115: (*SR72*) 91720 (*FUNCTION: EXECUTED AFTER LAST UNIT OF COLLATERAL-CLAUSE*) 91730 BEGIN 91740 STRONG; 91750 CGCOLLUNIT; 91760 WITH SRSTK[SRSUBP-1].SB^ DO WITH SBMODE^ DO 91770 IF MDV.MDID=MDIDSTRUCT THEN 91780 IF MDV.MDCNT>SBLEVEL THEN SEMERR(ESE+58); 91790 J := PLSTKP+2; I := 0; 91800 WHILE (SRPLSTK[J]=LEXBEGIN) OR (SRPLSTK[J]=LEXOPEN) OR (SRPLSTK[J]^.LXV.LXIO=LXIOUNLC) DO 91810 BEGIN I := I+ORD(SRPLSTK[J]^.LXV.LXIO<>LXIOUNLC); J := J+1 END; 91820 CGFINCOLL(I); 91830 END; 91840 (**) 91850 116: (*SR73*) 91860 (*FUNCTION: EXECUTED AFTER MOID-DECLARER OF CAST*) 91870 SCPUSH(SRPOPMD); 91880 (**) 91890 117: (*SR74*) 91900 (*FUNCTION: EXECUTED AFTER A PRIORITY-DEFINITION*) 91910 BEGIN DEFPRIO(SRPLSTK[PLSTKP+1], SRPLSTK[PLSTKP]) END; 91920 (**) 91930 118: (*SR80*) 91940 BEGIN 91950 SEMANTICROUTINE(62) (*SR29*); 91960 DEFLAB(LEXLSTOP); 91970 STB1 := DCIL; 91980 WHILE STB1<>NIL DO WITH STB1^ DO 91990 BEGIN 92000 IF STBLKTYP=STBAPPLAB THEN SEMERRP(ESE+38, STLEX); 92010 STB1 := STTHREAD 92020 END; 92030 SBB := PUSHSB(MDVOID);(*RANGEXT EXPECTS IT*) 92040 RANGEXT; 92050 CGEND; 92060 ROUTNXT 92070 END; 92080 (**) 92090 119: (*SR81*) 92100 (*FUNCTION: EXECUTED AFTER SYNTACTIC ERROR, BEFORE START OF IGNORED SYMBOLS*) 92110 BEGIN 92120 ERRCHAR := '='; 92130 END; 92140 (**) 92150 120: (*SR00*) 92160 BEGIN 92170 I := CURID; 92180 ROUTNNT; 92190 CURID := I; 92200 ROUTNL^.RNLEVEL := 0; 92210 ROUTNL^.RNLENIDS := CURID; 92220 CGINIT; 92230 CGFLINE 92240 END; 92250 (**) 92252 121: (*FINISH*) (*INVOKED: AFTER END OF PROGRAM TO INDICATE TO THE PARSER THAT 92254 ITS JOB IS DONE*) 92256 ENDOFPROG := TRUE; 92260 END 92270 END 92280 (*+53() 92290 ; BEGIN 92300 IF (SRTN>120) OR (SRTN<61) THEN MONITOR1 92310 ELSE IF SRTN<91 THEN MONITOR2 92320 ELSE MONITOR3 92330 ()+53*) 92340 END; 92350 (**) 92360 ()+83*)