1061 lines
40 KiB
OpenEdge ABL
1061 lines
40 KiB
OpenEdge ABL
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 ERRPTR<ERRLXPTR THEN ERRPTR := ERRLXPTR-1;
|
|
82400 OUTERR(SRTN-ESY01+ESY+1, ERRORR, NIL);
|
|
82410 END
|
|
82420 ELSE BEGIN
|
|
82430 (*+21()
|
|
82440 MONITORSEMANTIC(SRTN);
|
|
82450 ()+21*)
|
|
82460 CASE SRTN OF
|
|
82470 (**)
|
|
82480 10: (*SR01*)
|
|
82490 BEGIN SRSEMP := SRSEMP+1; SRSTK[SRSEMP].SB := SRPLSTK[PLSTKP]^.LXV.LXPSB END;
|
|
82500 (**)
|
|
82510 11: (*SR02*)
|
|
82520 (*LONG/SHORT*)
|
|
82530 SRSTK[SRSEMP].MD := LENGTHEN(INP^.LXV.LXPMD, SRSTK[SRSEMP].SUBP);
|
|
82540 (**)
|
|
82550 12: (*SR03A*)
|
|
82560 (*LONG*)
|
|
82570 BEGIN SRSEMP := SRSEMP+1; SRSTK[SRSEMP].SUBP := 1 END;
|
|
82580 (**)
|
|
82590 13: (*SR03B*)
|
|
82600 (*SHORT*)
|
|
82610 BEGIN SRSEMP := SRSEMP+1; SRSTK[SRSEMP].SUBP := -1 END;
|
|
82620 (**)
|
|
82630 14: (*SR04A*)
|
|
82640 (*LONG AND FORMAL-ROWERS*)
|
|
82650 WITH SRSTK[SRSEMP] DO SUBP := SUBP+1;
|
|
82660 (**)
|
|
82670 15: (*SR04B*)
|
|
82680 (*SHORT*)
|
|
82690 WITH SRSTK[SRSEMP] DO SUBP := SUBP-1;
|
|
82700 (**)
|
|
82710 16: (*SR05*)
|
|
82720 (*FUNCTION: CREATES A MODE TABLE ENTRY HAVING PARSED A .REF TO MODE DECLARATOR*)
|
|
82730 WITH SRSTK[SRSEMP] DO MD := FINDREF(MD);
|
|
82740 (**)
|
|
82750 17: (*SR06*)
|
|
82760 (*FUNCTION: EXECUTED AFTER ROUTINE-SPECIFICATION OF ROUTINE-TEXT WITHOUT PARAMETERS*)
|
|
82770 BEGIN
|
|
82780 ROUTNNT;
|
|
82790 CGRTA;
|
|
82800 M := SRPOPMD;
|
|
82810 SUBSAVE (*BECAUSE FINDPRC DOES A SUBREST*);
|
|
82820 FINDPRC(M, 0, PROC);
|
|
82830 END;
|
|
82840 (**)
|
|
82850 18: (*SR07A*)
|
|
82860 (*FIRST FIELD-SELECTOR AFTER DECLARER*)
|
|
82870 NEWFIELD(SRPLSTK[PLSTKP]);
|
|
82880 (**)
|
|
82890 19: (*SR07B*)
|
|
82900 (*SUBSEQUENT FIELD-SELECTORS*)
|
|
82910 BEGIN
|
|
82920 SRSTK[SRSEMP+1] := SRSTK[SRSEMP-1]; SRSEMP := SRSEMP+1;
|
|
82930 NEWFIELD(INP)
|
|
82940 END;
|
|
82950 (**)
|
|
82960 20: (*SR08A*)
|
|
82970 BEGIN
|
|
82980 DCLMODE := SRSTK[SRSEMP].MD;
|
|
82990 DCLDEFN := [STINIT (*FOR STDIDTY*)];
|
|
83000 DEFID(SRPLSTK[PLSTKP])
|
|
83010 END;
|
|
83020 (**)
|
|
83030 21: (*SR08B*)
|
|
83040 BEGIN
|
|
83050 SRSEMP := SRSEMP+1; SRSTK[SRSEMP] := SRSTK[SRSEMP-1];
|
|
83060 DEFID(INP)
|
|
83070 END;
|
|
83080 (**)
|
|
83090 22: (*SR10*)
|
|
83100 (*FUNCTION: BEFORE FIELD(PARAMETER) OF .STRUCT (.PROC) DECLARER*)
|
|
83110 SUBSAVE;
|
|
83120 (**)
|
|
83130 23: (*SR11*)
|
|
83140 (*FUNCTION: CREATES A MODE TABLE ENTRY HAVING PARSED A STRUCTURED
|
|
83150 WITH FIELDS MODE DECLARATOR
|
|
83160 *)
|
|
83170 FINSTRUCT((SRSEMP-SRSUBP) DIV 2);
|
|
83180 (**)
|
|
83190 24: (*SR12*)
|
|
83200 (*FUNCTION: START ROWED-ACTUAL-DECLARER IN VARIABLE-DECLARATION OR SOME GENERATORS*)
|
|
83210 BEGIN BRKASCR; SB:=MAKESUBSTACK(0, MDBNDS) END;
|
|
83220 (**)
|
|
83230 25: (*SR14A*)
|
|
83240 (*FORMAL*)
|
|
83250 BEGIN SRSEMP := SRSEMP-1; SRSTK[SRSEMP].MD := FINDROW(SRSTK[SRSEMP+1].MD, SRSTK[SRSEMP].SUBP) END;
|
|
83260 (**)
|
|
83270 26: (*SR14B*)
|
|
83280 (*FUNCTION: EXECUTED AFTER AN ACTUAL-ROWER-LIST-BRACKET*)
|
|
83290 BEGIN
|
|
83300 J := (SRSEMP-SRSUBP) DIV 2;
|
|
83310 CGACTBNDS(SRSTK[SRSUBP-1].SB,J); (*LOADS BOUNDS INTO SB*)
|
|
83320 POPUNITS
|
|
83330 END;
|
|
83340 (**)
|
|
83350 27: (*SR14C*)
|
|
83360 (*FUNCTION: EXECUTED AFTER AN ACTUAL-DECLARER*)
|
|
83370 WITH SRSTK[SRSEMP] DO
|
|
83380 MD := FINDROW(MD, SRSTK[SRSEMP-1].SB^.SBLOCRG);
|
|
83390 (**)
|
|
83400 28: (*SR15*)
|
|
83410 (*FUNCTION: CREATES A MODE TABLE ENTRY HAVING PARSED A PROCEDURE DECLARATOR*)
|
|
83420 BEGIN
|
|
83430 M := SRPOPMD;
|
|
83440 FINDPRC(M, SRSEMP-SRSUBP, PROC);
|
|
83450 END;
|
|
83460 (**)
|
|
83470 29: (*SR16A*)
|
|
83480 BEGIN DCLMODE := SRPOPMD; DCLDEFN := [STINIT (*FOR STDIDTY*)] END;
|
|
83490 (**)
|
|
83500 30: (*SR16B*)
|
|
83510 (*FUNCTION: EXECUTED AFTER DECLARER IN VARIABLE-DECLARATION*)
|
|
83520 BEGIN DCLMODE := SRPOPMD; DCLDEFN := [STVAR] END;
|
|
83530 (**)
|
|
83540 31: (*SR16C*)
|
|
83550 BEGIN DCLMODE := MDROUT; DCLDEFN := [STINIT (*FOR STDIDTY*)] END;
|
|
83560 (**)
|
|
83570 32: (*SR16D*)
|
|
83580 BEGIN DCLMODE := PRCBNDS; DCLDEFN := [STINIT (*FOR STDIDTY*)] END;
|
|
83590 (**)
|
|
83600 33: (*SR17*)
|
|
83610 (*FUNCTION: EXECUTED WHEN A VARIABLE-DEFINITION IS NOT PRECEDED BY .LOC*)
|
|
83620 OUTERR(ESE+73, WARNING, NIL);
|
|
83630 (**)
|
|
83640 34: (*SR20A*)
|
|
83650 (*FUNCTION: EXECUTED AT THE BEGINNING OF ANY RANGE EXCEPT A ROUTINE-TEXT.
|
|
83660 PERFORMS RANGE ENTRY FUNCTIONS. MARKS STACK FOR BEGINNING OF A BALANCE.
|
|
83670 THE BALANCE IS THE ESTABLISHING-CLAUSE WHICH STARTS ALL SUCH RANGES.
|
|
83680 *)
|
|
83690 BEGIN RANGENT; SUBSAVE END;
|
|
83700 (**)
|
|
83710 35: (*SR20B*)
|
|
83720 (*FUNCTION: EXECUTED AT THE END OF A CONDITIONAL- OR CASE-CHOOSER*)
|
|
83730 BEGIN RGINFO := RGINFO+[DCLDELAY]; RANGEXT; SEMANTICROUTINE(43) (*SR22A*) END;
|
|
83740 (**)
|
|
83750 36: (*SR20C*)
|
|
83760 (*FUNCTION: EXECUTED WHEN AN ELSE-PART-OPTION OR OUT-PART-OPTION IS EMPTY.
|
|
83770 THE NET EFFECT IS TO ACT AS THOUGH THE OMITTED OPTION WAS .SKIP.
|
|
83780 *)
|
|
83790 BEGIN SB := PUSHSB(MDSKIP);
|
|
83800 SEMANTICROUTINE(43) (*SR22A*)
|
|
83810 END;
|
|
83820 (**)
|
|
83830 37: (*SR20DB*)
|
|
83840 (*FUNCTION: EXECUTED AFTER ENQUIRY-CLAUSE OF CONDITIONAL-CHOOSER*)
|
|
83850 BEGIN
|
|
83860 IF DCLLABEL IN RGINFO THEN SEMERR(ESE+02);
|
|
83870 MEEKLOAD(MDBOOL, ESE+34);
|
|
83880 CGIFA;
|
|
83890 DISPOSE(SRSTK[SRSEMP].SB); SRSEMP := SRSEMP-1; SUBSAVE;
|
|
83900 SEMANTICROUTINE(34) (*SR20A*)
|
|
83910 END;
|
|
83920 (**)
|
|
83930 38: (*SR20DI*)
|
|
83940 (*FUNCTION: EXECUTED AFTER ENQUIRY-CLAUSE OF CASE-CHOOSER*)
|
|
83950 BEGIN
|
|
83960 IF DCLLABEL IN RGINFO THEN SEMERR(ESE+02);
|
|
83970 MEEKLOAD(MDINT, ESE+35);
|
|
83980 CGCASA;
|
|
83990 DISPOSE(SRSTK[SRSEMP].SB); SRSEMP := SRSEMP-1; SUBSAVE;
|
|
84000 (*SEMANTICROUTINE(34) (*SR20A *)
|
|
84010 END;
|
|
84020 (**)
|
|
84030 39: (*SR20EB*)
|
|
84040 (*FUNCTION: EXECUTED AFTER A THEN-PART OF A CONDITIONAL-ALTERNATIVES*)
|
|
84050 BEGIN
|
|
84060 RGINFO := RGINFO+[DCLDELAY]; RANGEXT;
|
|
84070 INNERBAL;
|
|
84080 ASSIGNFLAD;
|
|
84090 CGFLINE;
|
|
84100 SEMANTICROUTINE(34) (*SR20A*)
|
|
84110 END;
|
|
84120 (**)
|
|
84130 40: (*SR20EI*)
|
|
84140 (*FUNCTION: START ROWED-ACTUAL-DECLARER IN GENERATOR*)
|
|
84150 SB:=MAKESUBSTACK(0, MDBNDS);
|
|
84160 (**)
|
|
84170 41: (*SR20F*)
|
|
84180 (*FUNCTION: EXECUTED AFTER EACH UNIT IN THE IN-PART OF A CASE-ALTERNATIVES*)
|
|
84190 BEGIN INNERBAL; MARK(FIXUPM); CGFLINE END;
|
|
84200 (**)
|
|
84210 42: (*SR20G*)
|
|
84220 (*FUNCTION: PERFORMS FINAL PROCESSING OF CASE-CLAUSE*)
|
|
84230 BEGIN SEMANTICROUTINE(35) (*SR20B*); CGCASC END;
|
|
84240 (**)
|
|
84250 43: (*SR22A*)
|
|
84260 (*FUNCTION: EXECUTED AFTER PROCESSING THE LAST UNIT OF A BALANCE.
|
|
84270 NOTE THAT HERE BALANCES INCLUDE CONDITIONAL-, CASE- AND ESTABLISHING-CLAUSES.
|
|
84280 AN ENQUIRY-CLAUSE DOES NOT REALLY REQUIRE BALANCING BUT THE PARSER DOES NOT DISTINGUISH
|
|
84290 BETWEEN THE TWO KINDS OF ESTABLISHING-CLAUSES (ENQUIRY- AND SERIAL-).
|
|
84300 THUS, ENQUIRY-CLAUSES ARE TREATED AS SERIAL-CLAUSES EVEN THOUGH THE YIELD IS
|
|
84310 ALWAYS THE LAST UNIT.
|
|
84320 *)
|
|
84330 BEGIN LASTIBAL; SETBALFLAG END;
|
|
84340 (**)
|
|
84350 44: (*SR22B*)
|
|
84360 (*FUNCTION: EXECUTED AFTER ENCLOSED-CLAUSE OF PROGRAM OR PRIMARY.
|
|
84370 *)
|
|
84380 BEGIN RGINFO := RGINFO+[DCLDELAY]; RANGEXT END;
|
|
84390 (**)
|
|
84400 45: (*SR23*)
|
|
84410 (*FUNCTION: EXECUTED AFTER ENCLOSED-CLAUSE OF A CAST*)
|
|
84420 BEGIN STRONG;
|
|
84430 WITH SRSTK[SRSEMP].SB^ DO SBINF := SBINF-[SBMORF, SBVOIDWARN, SBCOLL];
|
|
84440 RANGEXT
|
|
84450 END;
|
|
84460 (**)
|
|
84470 46: (*SR24*)
|
|
84480 (*FUNCTION: EXECUTED AFTER UNIT FOLLOWED BY A COMPLETER IN A SERIAL-CLAUSE*)
|
|
84490 INNERBAL;
|
|
84500 (**)
|
|
84510 47: (*SR25A1*)
|
|
84520 (*FUNCTION: EXECUTED AFTER NON-EMPTY FOR-PART.*)
|
|
84530 PUTLOOP(INP);
|
|
84540 (**)
|
|
84550 48: (*25A2*)
|
|
84560 (*FUNCTION: EXECUTED AFTER EMPTY FOR-PART WHEN COUNTING-PART IS NON-EMPTY.*)
|
|
84570 PUTLOOP(LEXALEPH);
|
|
84580 (**)
|
|
84590 49: (*SR25B1*)
|
|
84600 (*FUNCTION: EXECUTED AFTER NON-EMPTY FROM- BY- OR TO-PART.*)
|
|
84610 MEEKLOAD(MDINT, ESE+39);
|
|
84620 (**)
|
|
84630 50: (*SR25B2*)
|
|
84640 (*FUNCTION: EXECUTED AFTER EMPTY FROM-PART WHEN COUNTING-PART IS NON-EMPTY.*)
|
|
84650 BEGIN PUTDEN(LEXONE); SEMANTICROUTINE(49) (*SR25B1*) END;
|
|
84660 (**)
|
|
84670 51: (*SPARE*);
|
|
84680 (**)
|
|
84690 52: (*SR25B3*)
|
|
84700 (*FUNCTION: EXECUTED AFTER EMPTY TO-PART WHEN COUNTING PART IS NON-EMPTY*)
|
|
84710 BEGIN
|
|
84720 WITH SRSTK[SRSUBP-1].SB^ DO SBINF := SBINF+[SBEMPTYTO]
|
|
84730 END;
|
|
84740 (**)
|
|
84750 53: (*SR25B5*)
|
|
84760 (*FUNCTION: EXECUTED AFTER EMPTY BY-PART WHEN COUNTING PART IS NON-EMPTY*)
|
|
84770 WITH SRSTK[SRSUBP-1].SB^ DO SBINF := SBINF+[SBEMPTYBY];
|
|
84780 (**)
|
|
84790 54: (*SR26A*)
|
|
84800 (*FUNCTION: EXECUTED BEFORE WHILE-PART, OR BEFORE DO-PART IF NONE.*)
|
|
84810 BEGIN WITH SRSTK[SRSUBP-1] DO WITH SB^ DO
|
|
84820 BEGIN
|
|
84830 RANGENT; (*START RANGE OF LOOPCLAUSE - MATCHED IN S-44*)
|
|
84840 LEX1 := SBLEX;
|
|
84850 IF LEX1<>NIL 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^.SBCNT<SB^.SBMODE^.MDV.MDCNT THEN SEMERR(ESE+72);
|
|
89340 SBB := SRSTK[SRSUBP-1].SB; (*FOR RESULT*)
|
|
89350 IF MDV.MDID=MDIDPROC THEN CGCALL(SB, SBB)
|
|
89360 ELSE (*MDV.MDID=MDIDPASC*) CGPASC(SB, SBB);
|
|
89370 IF SBB^.SBMODE=MDVOID THEN FILL(SBTVOID, SBB);
|
|
89380 POPUNITS;
|
|
89390 UNSTACKSB;
|
|
89400 WITH ROUTNL^ DO RNLOCRG := RNLOCRG-1;
|
|
89410 RGINFO := RGINFO-[DCLLOCRNG];
|
|
89420 SB := PUSHSB(MDVOID); (*RANGEXT EXPECTS SBB FOR ITS YIELD*)
|
|
89430 RANGEXT; (*FROM PARAMETERS RANGE*)
|
|
89440 UNSTACKSB; DISPOSE(SRSTK[SRSEMP].SB);SRSEMP := SRSEMP-1;
|
|
89450 STACKSB(SBB);
|
|
89460 SBB^.SBINF := SBB^.SBINF+[SBMORF]-[SBVOIDWARN]
|
|
89470 END
|
|
89480 END;
|
|
89490 (**)
|
|
89500 98: (*SR62*)
|
|
89510 (*FUNCTION: EXECUTED AFTER LEAP-GENERATOR.*)
|
|
89520 BEGIN
|
|
89530 M := SRPOPMD;
|
|
89540 IF M^.MDV.MDID=MDIDROW THEN
|
|
89550 SRSTK[SRSEMP].SB^.SBMODE := FINDREF(M)
|
|
89560 ELSE BEGIN SB := PUSHSB(FINDREF(M)); UNSTACKSB END;
|
|
89570 IF SRPLSTK[PLSTKP+1]^.LXV.LXIO=LXIOLOC THEN
|
|
89580 BEGIN
|
|
89590 RGINFO := RGINFO+[DCLLOCGEN];
|
|
89600 CGLEAPGEN(FALSE)
|
|
89610 END
|
|
89620 ELSE CGLEAPGEN(TRUE);
|
|
89630 WITH SRSTK[SRSEMP].SB^ DO SBINF := SBINF+[SBMORF,SBVOIDWARN]
|
|
89640 END;
|
|
89650 (**)
|
|
89660 99: (*SR63A*)
|
|
89670 (*FUNCTION: EXECUTED AT THE BEGINNING OF ROUTINE-TEXT WITH A NON-EMPTY
|
|
89680 FORMAL-DECLARATIVE-PACK-OPTION.
|
|
89690 *)
|
|
89700 BEGIN
|
|
89710 ROUTNNT;
|
|
89720 CGRTA;
|
|
89730 SUBSAVE
|
|
89740 END;
|
|
89750 (**)
|
|
89760 100: (*SR63B*)
|
|
89770 (*FUNCTION: EXECUTED AFTER ROUTINE-SPECIFICATION IN A ROUTINE-TEXT.
|
|
89780 SAVES THE MODE OF THE ROUTINE-TEXT AND ESTABLISHES THE MODE OF THE
|
|
89790 STRONG CONTEXT OF THE UNIT WHICH FOLLOWS.
|
|
89800 *)
|
|
89810 BEGIN
|
|
89820 ROUTNL^.RNPARAMS:=CURID;
|
|
89830 STB1:=DCIL;
|
|
89840 WHILE STB1<>NIL 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*)
|