583 lines
		
	
	
	
		
			31 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			583 lines
		
	
	
	
		
			31 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
| 50000 (*  COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER  *)
 | |
| 50010  (**)
 | |
| 50020  (**)
 | |
| 50030  (*+82()
 | |
| 50040  (**)
 | |
| 50050  (*+01()   (*+31()   (*$P+,T+*)   ()+31*)   ()+01*)
 | |
| 50060  (*+25()   (*+31()   (*$P+,T+*)   ()+31*)   ()+25*)
 | |
| 50070  (**)
 | |
| 50080  PROCEDURE PARSEPARSER;
 | |
| 50090    VAR ACOUNT, BCOUNT: INTEGER; CCOUNT: 0..10000;
 | |
| 50100        HTCOPY: HASHTAB;
 | |
| 50110        THIS, THAT: PLEX;
 | |
| 50120        BPRODTBL: ARRAY [1..40] OF PROD;
 | |
| 50130        SEXFR,FEXFR:ARRAY[0..PRODLEN] OF 0..PRODLEN;
 | |
| 50140        TEMP:INTEGER;
 | |
| 50150        I: INTEGER;
 | |
| 50160        J: INTEGER;
 | |
| 50165  (* MAP: RECORD CASE BOOLEAN OF
 | |
| 50166        TRUE : (INT:ADDRINT);
 | |
| 50167        FALSE : (POINT:^INTEGER);
 | |
| 50168   END; *)
 | |
| 50170  (*+01()
 | |
| 50180        FRED: PLEX;
 | |
| 50190        FRIG: RECORD CASE SEVERAL OF
 | |
| 50200                     1:(INT: INTEGER); 2:(POINT: PINTEGER) END;
 | |
| 50210   ()+01*)
 | |
| 50220  (*+25()
 | |
| 50230        FRIG: RECORD CASE SEVERAL OF
 | |
| 50240                     1:(INT: INTEGER); 2:(POINT: PINTEGER) END;
 | |
| 50250   ()+25*)
 | |
| 50260  (*+04()
 | |
| 50270    PROCEDURE INITIO;
 | |
| 50280    (*+01()   VAR AW66: PW66; ()+01*)
 | |
| 50290        BEGIN
 | |
| 50300        ERRDEV := FALSE;
 | |
| 50310    (*+23()   NUMPARAMS:=0;  (* TO COUNT NO OF P-OP PARAMETERS OUTPUT TO LSTFILE *)  ()+23*)
 | |
| 50320        LSTLINE := -1;  (*FOR FIRST TIME OF OUTSRC*)
 | |
| 50330        LSTCNT := 100;         (*TO FORCE NEWPAGE*)
 | |
| 50340        LSTPAGE := 0;
 | |
| 50350    (*-03() (*-04()
 | |
| 50360        RESET(INPUT);
 | |
| 50370        REWRITE(LSTFILE);
 | |
| 50380    ()-04*) ()-03*)
 | |
| 50390    (*+03()
 | |
| 50400    WRITE('SOURCE-FILE: ');
 | |
| 50410    OPEN(INPUT,'','SYMB',SEQRD);
 | |
| 50420    WRITE('LIST-FILE: ');
 | |
| 50430    OPEN(LSTFILE,'','DATA',SEQWR);
 | |
| 50440    OPEN(OUTPUT,'TERMINAL','SYMB',SEQWR);
 | |
| 50450    ()+03*)
 | |
| 50460        RESET(INPUT, 'INPUT');
 | |
| 50470        REWRITE(OUTPUT, 'CONSOLE');
 | |
| 50480        REWRITE(LSTFILE, 'LSTFILE');
 | |
| 50490        SRCBUF[0] := ' ';  (*IT WILL NEVER BE WRITTEN TO AGAIN*)
 | |
| 50500    (*+01()
 | |
| 50510        LINELIMIT(OUTPUT, 100000);
 | |
| 50520        AW66 := ASPTR(66B);
 | |
| 50530        ONLINE := AW66^.JOPR=3;
 | |
| 50540     ()+01*)
 | |
| 50550    (*+02() ONLINE := TRUE; ()+02*)
 | |
| 50560    (*+03() ONLINE := FILENR(LSTFILE)<>1; ()+03*)
 | |
| 50570        ONLINE := TRUE;
 | |
| 50580    (*-04() (*-02() DATE(DAT); TIME(TIM); ()-02*) ()-04*)
 | |
| 50590        END;
 | |
| 50600  ()+04*)
 | |
| 50610    PROCEDURE CLASS(TAG: ALFA);
 | |
| 50620      VAR DUMMY: PLEX;
 | |
| 50630          I: INTEGER;
 | |
| 50640        BEGIN WITH CURRENTLEX DO
 | |
| 50650          BEGIN
 | |
| 50660          LXV := LXVTAB;  LXTOKEN := TKTAG;
 | |
| 50670  (*+11() S10:=TAG; LXCOUNT:=1;   ()+11*)
 | |
| 50680  (*-11() STASHLEX(TAG); ()-11*)
 | |
| 50690          DUMMY := HASHIN
 | |
| 50700          END
 | |
| 50710        END;
 | |
| 50720    PROCEDURE TLEX(TAG: ALFA; SLEX: LXIOTYPE);
 | |
| 50730      VAR DUMMY: PLEX;
 | |
| 50740          I: INTEGER;
 | |
| 50750        BEGIN WITH CURRENTLEX DO
 | |
| 50760          BEGIN
 | |
| 50770          LXV := LXVTAG;  LXTOKEN := TKTAG;  LXV.LXPIO := SLEX;
 | |
| 50780  (*+11() S10:=TAG; LXCOUNT:=1;   ()+11*)
 | |
| 50790  (*-11() STASHLEX(TAG); ()-11*)
 | |
| 50800          DUMMY := HASHIN;
 | |
| 50810          END
 | |
| 50820        END;
 | |
| 50830    PROCEDURE SEMANTICROUTINE(SRTN: RTNTYPE);
 | |
| 50840      VAR C: INTEGER;
 | |
| 50850          SAE:  CHAR;
 | |
| 50860      PROCEDURE LABL(SEX, FEX, VALUE: INTEGER);
 | |
| 50870        VAR TEMP: INTEGER;
 | |
| 50880          BEGIN
 | |
| 50890          WHILE SEX<>0 DO
 | |
| 50900            BEGIN TEMP := PRODTBL[SEX].SEXIT; PRODTBL[SEX].SEXIT := VALUE; SEX := TEMP END;
 | |
| 50910          WHILE FEX<>0 DO
 | |
| 50920            BEGIN TEMP := PRODTBL[FEX].FEXIT; PRODTBL[FEX].FEXIT := VALUE; FEX := TEMP END
 | |
| 50930          END;
 | |
| 50940        BEGIN WITH SRPLSTK[PLSTKP]^ DO WITH PRODTBL[(BCOUNT-1) MOD PRODLEN + 1] DO CASE SRTN OF
 | |
| 50950            10: (*SR01*) (*START OF EACH RULE*)
 | |
| 50960              ACOUNT := 0;
 | |
| 50970            11: (*SR02*) (*TAG*)
 | |
| 50980              IF ACOUNT=0 THEN BEGIN PRSTKC := S; SYLXV.LX1IO := LXV.LXPIO END
 | |
| 50990              ELSE IF ACOUNT=1 THEN BEGIN PRSTKA := 2; PRINPC := SSA; SYLXV.LX2IO := LXV.LXPIO; ACOUNT := -99 END
 | |
| 51000              ELSE (*ACOUNT<0*) BEGIN PRINPC := S; SYLXV.LX2IO := LXV.LXPIO END;
 | |
| 51010            12: (*SR03A*) (*TAB*)
 | |
| 51020              BEGIN C := ORD(S10[4])-ORD('0');
 | |
| 51030              IF (C<0) OR (C>9) THEN C := ORD(S10[4])-ORD('A')+10;
 | |
| 51040              IF S10[1]='C' THEN WITH SYLXV DO
 | |
| 51050                IF ACOUNT=0 THEN CASE S10[3] OF
 | |
| 51060                  '0': BEGIN PRSTKC:=C0; LX1CL0:=C END; '1': BEGIN PRSTKC:=C1; LX1CL1:=C END;
 | |
| 51070                  '2': BEGIN PRSTKC:=C2; LX1CL2:=C END; END
 | |
| 51080                ELSE CASE S10[3] OF
 | |
| 51090                  '0': BEGIN PRINPC:=C0; LX2CL0:=C END; '1': BEGIN PRINPC:=C1; LX2CL1:=C END;
 | |
| 51100                  '2': BEGIN PRINPC:=C2; LX2CL2:=C END; END END;
 | |
| 51110            35: (*SR20B)* (*NO 2ND TAG OR TAB*)
 | |
| 51120              IF ACOUNT=-1 THEN BEGIN PRINPC := A; SYLXV.LX2IO := LXIODUMMY END;
 | |
| 51130            13: (*SR03B*) (*NO 1ST TAG OR TAB*)
 | |
| 51140              BEGIN ACOUNT := -1; PRSTKC := S; SYLXV.LX1IO := LXIODUMMY; PRSTKA := 3 END;
 | |
| 51150            14: (*SR04A*) (*AFTER COMMA*)
 | |
| 51160              ACOUNT := ACOUNT+1;
 | |
| 51170            15: (*SR04B*) (*AFTER STICK*)
 | |
| 51180              IF ACOUNT>=0 THEN
 | |
| 51190                BEGIN PRSTKA := ACOUNT; ACOUNT := -1 END;
 | |
| 51200            16: (*SR05*) (*RTN PRESENT*)
 | |
| 51210              BEGIN
 | |
| 51220                SAE := SRPLSTK[PLSTKP]^.S10[1];
 | |
| 51230                IF (SAE = 'S') OR (SAE = 'A') THEN C := 0
 | |
| 51240                ELSE IF SAE = 'E' THEN C := ESY01-1
 | |
| 51250                     ELSE SEMERR(ESE+16);
 | |
| 51260                RTN := C + (*-04() INP^.LXDENRP ()-04*)(*+04() SHRINK(INP^.LXDENRP) ()+04*)
 | |
| 51270              END;
 | |
| 51280            17: (*SR06*) (*RTN ABSENT*)
 | |
| 51290              RTN := DUMMY;
 | |
| 51300            18: (*SR07A*) (*POP PRESENT*)
 | |
| 51310              PRPOP := (*-04() INP^.LXDENRP ()-04*)(*+04() SHRINK(INP^.LXDENRP) ()+04*);
 | |
| 51320            19: (*SR07B*) (*POP ABSENT*)
 | |
| 51330              BEGIN PRPOP := 0; PRPUSH := LXIODUMMY END;
 | |
| 51340            20: (*SR08A*) (*PUSH PRESENT*)
 | |
| 51350              PRPUSH := INP^.LXV.LXPIO;
 | |
| 51360            21: (*SR08B*) (*PUSH ABSENT*)
 | |
| 51370              PRPUSH := LXIODUMMY;
 | |
| 51380            22: (*SR10*) (*SKIP PRESENT*)
 | |
| 51390              PRSKIP := TRUE;
 | |
| 51400            23: (*SR11*) (*SKIP ABSENT*)
 | |
| 51410              PRSKIP := FALSE;
 | |
| 51420            24: (*SR12*) (*SCAN=++*)
 | |
| 51430              PRSCAN := 2;
 | |
| 51440            25: (*SR14A)* (*SCAN=+*)
 | |
| 51450              PRSCAN := 1;
 | |
| 51460            26: (*SR14B*) (*SCAN ABSENT*)
 | |
| 51470              PRSCAN := 0;
 | |
| 51480            28: (*SR15*) (*SEX*)
 | |
| 51490              IF (LXV.LXP<PRODLEN) AND (LXV.LXPSTB<>NIL) THEN
 | |
| 51500                SEXIT := LXV.LXP
 | |
| 51510              ELSE
 | |
| 51520                BEGIN
 | |
| 51530                IF LXV.LXPSTB=NIL THEN
 | |
| 51540                  BEGIN
 | |
| 51550                  CCOUNT:=CCOUNT+1; LXV.LXP:=PRODLEN+CCOUNT;
 | |
| 51560                  SEXFR[CCOUNT]:=0; FEXFR[CCOUNT]:=0
 | |
| 51570                  END;
 | |
| 51580                TEMP:=LXV.LXP-PRODLEN;
 | |
| 51590                SEXIT:=SEXFR[TEMP]; SEXFR[TEMP]:=BCOUNT
 | |
| 51600                END;
 | |
| 51610            29: (*SR16A*) (*FEX*)
 | |
| 51620              IF (INP^.LXV.LXP<PRODLEN) AND (INP^.LXV.LXPSTB<>NIL) THEN
 | |
| 51630                FEXIT := INP^.LXV.LXP
 | |
| 51640              ELSE
 | |
| 51650                BEGIN
 | |
| 51660                IF INP^.LXV.LXPSTB=NIL THEN
 | |
| 51670                  BEGIN
 | |
| 51680                  CCOUNT:=CCOUNT+1; INP^.LXV.LXP:=PRODLEN+CCOUNT;
 | |
| 51690                  SEXFR[CCOUNT]:=0; FEXFR[CCOUNT]:=0
 | |
| 51700                  END;
 | |
| 51710                TEMP:=INP^.LXV.LXP-PRODLEN;
 | |
| 51720                FEXIT:=FEXFR[TEMP];FEXFR[TEMP]:=BCOUNT
 | |
| 51730                END;
 | |
| 51740            30: (*SR16B*) (*FEX ABSENT*)
 | |
| 51750              FEXIT := BCOUNT+1;
 | |
| 51760            31: (*SR16C*) (*END OF RULE*)
 | |
| 51770              BCOUNT := BCOUNT+1;
 | |
| 51780            32: (*SR16D*) (*ERROR*)
 | |
| 51790              OUTERR(ELX+7, ERRORR, NIL);
 | |
| 51800            34: (*SR20A*) (*AT LABEL*)
 | |
| 51810              BEGIN
 | |
| 51820              IF LXV.LXPSTB<>NIL THEN
 | |
| 51830                  BEGIN
 | |
| 51840                  TEMP:=LXV.LXP-PRODLEN;
 | |
| 51850                  LABL(SEXFR[TEMP],FEXFR[TEMP],BCOUNT);
 | |
| 51860                  SEXFR[TEMP]:=0; FEXFR[TEMP]:=0;
 | |
| 51870                  WHILE (CCOUNT>0) AND (SEXFR[CCOUNT]=0) AND (FEXFR[CCOUNT]=0)
 | |
| 51880                  DO CCOUNT:=CCOUNT-1
 | |
| 51890                  END;
 | |
| 51900              LXV.LXP := BCOUNT END;
 | |
| 51910            36: (*SR20C*) (*END OF FILE*)
 | |
| 51920              ENDOFPROG := TRUE;
 | |
| 51930            END
 | |
| 51940        END;
 | |
| 51950  ()+82*)
 | |
| 51960    (*OLD VERSION OF SEMANTICROUTINE WHICH WAS USED TO PRODUCE THE CALLS OF MPROD AND BLABL WHICH FOLLOW*)
 | |
| 51970    (*
 | |
| 51980                      PROCEDURE SEMANTICROUTINE(SRTN: RTNTYPE);
 | |
| 51990                        VAR C: INTEGER;
 | |
| 52000                            SAR:  CHAR;
 | |
| 52010                          BEGIN WITH SRPLSTK[PLSTKP]^ DO CASE SRTN OF
 | |
| 52020                          10: (*SR01+) BEGIN WRITE(LSTFILE, '      BMPROD(', BCOUNT:3, ', '); ACOUNT:=0; END;
 | |
| 52030                          11: (*SR02+): IF ACOUNT<>1 THEN WRITE(LSTFILE, 'S , LXIO', S1, ',  0, ')
 | |
| 52040                                      ELSE BEGIN WRITE(LSTFILE, '2, SSA,LXIO', S1, ',  0, '); ACOUNT:=-99 END;
 | |
| 52050                          12: (*SR03A+) BEGIN C := ORD(S1[4])-ORD('0');
 | |
| 52060                            IF (C<0) OR (C>9) THEN C := ORD(S1[4])-ORD('A')+10;
 | |
| 52070                            IF S1[1]='C' THEN WRITE(LSTFILE, 'C', S1[3], ', LXIODUMMY     , ', C:2, ', ') END;
 | |
| 52080                          35: (*SR20B+) IF ACOUNT=-1 THEN WRITE(LSTFILE, 'A , LXIODUMMY     ,  0, ');
 | |
| 52090                          13: (*SR03B+) BEGIN ACOUNT:=-1; WRITE(LSTFILE, 'S , LXIODUMMY     ,  0, 3, ') END;
 | |
| 52100                          14: (*SR04A+) ACOUNT := ACOUNT+1;
 | |
| 52110                          15: (*SR04B+) IF ACOUNT>=0 THEN
 | |
| 52120                            BEGIN WRITE(LSTFILE, ACOUNT:1, ', '); ACOUNT:=-1 END;
 | |
| 52130                          16: (*SR05+) BEGIN SAE := SRPLSTK[PLSTKP].S1[1];
 | |
| 52140                                       IF (SAE='S') OR (SAE = 'A') THEN C:=0
 | |
| 52150                                       ELSE IF SAE='E' THEN C:=ESY01-1
 | |
| 52160                                       ELSE SEMERR(ESE+16);
 | |
| 52170                                       WRITE(LSTFILE,C+INP^.LXDENRP:4)
 | |
| 52180                                       END;
 | |
| 52190                          17: (*SR06+) WRITE(LSTFILE, 'DUMMY     , ');
 | |
| 52200                          18: (*SR07A+) WRITE(LSTFILE, INP^.LXDENRP:1, ', ');
 | |
| 52210                          19: (*SR07B+) WRITE(LSTFILE, '0, LXIODUMMY     , ');
 | |
| 52220                          20: (*SR08A+) WRITE(LSTFILE, 'LXIO', INP^.S1, ', ');
 | |
| 52230                          21: (*SR08B+) WRITE(LSTFILE, 'LXIODUMMY     , ');
 | |
| 52240                          22: (*SR10+) WRITE(LSTFILE, 'TRUE , ');
 | |
| 52250                          23: (*SR11+) WRITE(LSTFILE, 'FALSE, ');
 | |
| 52260                          24: (*SR12+) WRITE(LSTFILE, '2, ');
 | |
| 52270                          25: (*SR14A+) WRITE(LSTFILE, '1, ');:
 | |
| 52280                          26: (*SR14B+) WRITE(LSTFILE, '0, ');:
 | |
| 52290                          28: (*SR15+) IF (LXV.LXP<PRODLEN) AND (LXV.LXPSTB<>NIL) THEN
 | |
| 52300                            WRITE(LSTFILE, LXV.LXP:4, ', ')
 | |
| 52310                            ELSE BEGIN
 | |
| 52320                              IF LXV.LXPSTB=NIL THEN BEGIN LXV.LXP := PRODLEN; CCOUNT := CCOUNT+1 END;
 | |
| 52330                              WRITE(LSTFILE, -(LXV.LXP DIV PRODLEN-1):4, ', ');
 | |
| 52340                              LXV.LXP := LXV.LXP MOD PRODLEN + (BCOUNT+1)*PRODLEN END;
 | |
| 52350                          29: (*SR16A+) IF (INP^.LXV.LXP<PRODLEN) AND (INP^.LXV.LXPSTB<>NIL) THEN
 | |
| 52360                            WRITE(LSTFILE, INP^.LXV.LXP:4)
 | |
| 52370                            ELSE BEGIN
 | |
| 52380                              IF INP^.LXV.LXPSTB=NIL THEN BEGIN INP^.LXV.LXP := PRODLEN; CCOUNT := CCOUNT+1 END;
 | |
| 52390                              WRITE(LSTFILE, -(INP^.LXV.LXP MOD PRODLEN):4);
 | |
| 52400                              INP^.LXV.LXP := INP^.LXV.LXP DIV PRODLEN * PRODLEN + BCOUNT END;
 | |
| 52410                          30: (*SR16B+) WRITE(LSTFILE, BCOUNT+1:4);
 | |
| 52420                          31: (*SR16C+) BEGIN WRITELN(LSTFILE,');'); BCOUNT := BCOUNT+1; END;
 | |
| 52430                          32: (*SR16D+) OUTERR(ELX+7, ERRORR, NIL);
 | |
| 52440                          34: (*SR20A+) BEGIN
 | |
| 52450                            IF LXV.LXPSTB<>NIL THEN BEGIN
 | |
| 52460                              WRITELN(LSTFILE, '        BLABL(', LXV.LXP DIV PRODLEN - 1:3, ', ',
 | |
| 52470                                LXV.LXP MOD PRODLEN:3, ', ', BCOUNT:3, ');');
 | |
| 52480                              CCOUNT := CCOUNT-1;
 | |
| 52490                              END;
 | |
| 52500                            LXV.LXP := BCOUNT END;
 | |
| 52510                          36: (*SR20C+) ENDOFPROG := TRUE;
 | |
| 52520                          END
 | |
| 52530                          END;
 | |
| 52540    *)
 | |
| 52550  (*+82()
 | |
| 52560    PROCEDURE INITPR;
 | |
| 52570        BEGIN
 | |
| 52580        PLINPQ := NIL;
 | |
| 52590        PLPTR := 1;
 | |
| 52600        SRPLSTK[SRPLSTKSIZE] := LEXSTOP;
 | |
| 52610        SRPLSTK[SRPLSTKSIZE-1] := LEXSTOP;
 | |
| 52620        PLSTKP := SRPLSTKSIZE-1;
 | |
| 52630        ENDOFPROG := FALSE;
 | |
| 52640        INP := LEXSTART
 | |
| 52650        END;
 | |
| 52660    PROCEDURE BMPROD(PTR: INTEGER;
 | |
| 52670                    CONFIG1: CONFIG; IO1: LXIOTYPE; CLA1: CL2TYPE; STKA: INTEGER;
 | |
| 52680                    CONFIG2: CONFIG; IO2: LXIOTYPE; CLA2: CL2TYPE;
 | |
| 52690                 SRTN: RTNTYPE; POP: INTEGER; PUSH: LXIOTYPE; SKIP: BOOLEAN; SCAN: INTEGER; SEX, FEX: INTEGER);
 | |
| 52700        BEGIN WITH BPRODTBL[PTR] DO
 | |
| 52710          BEGIN
 | |
| 52720          PRSTKA := STKA; PRSTKC := CONFIG1; PRINPC := CONFIG2;
 | |
| 52730          CASE CONFIG1 OF S: SYLXV.LX1IO := IO1;
 | |
| 52740                C0: SYLXV.LX1CL0 := CLA1; C1: SYLXV.LX1CL1 := CLA1; C2: SYLXV.LX1CL2 := CLA1 END;
 | |
| 52750          CASE CONFIG2 OF S, A, SSA: SYLXV.LX2IO := IO2;
 | |
| 52760                C0: SYLXV.LX2CL0 := CLA2; C1: SYLXV.LX2CL1 := CLA2; C2: SYLXV.LX2CL2 := CLA2 END;
 | |
| 52770          RTN := SRTN; PRPOP := POP; PRPUSH := PUSH; PRSKIP := SKIP; PRSCAN := SCAN;
 | |
| 52780          SEXIT := ABS(SEX); FEXIT := ABS(FEX);
 | |
| 52790          END
 | |
| 52800        END;
 | |
| 52810    PROCEDURE BLABL(SEX, FEX, VALUE: INTEGER);
 | |
| 52820      VAR TEMP: INTEGER;
 | |
| 52830        BEGIN
 | |
| 52840        WHILE SEX<>0 DO
 | |
| 52850          BEGIN TEMP := BPRODTBL[SEX].SEXIT; BPRODTBL[SEX].SEXIT := VALUE; SEX := TEMP END;
 | |
| 52860        WHILE FEX<>0 DO
 | |
| 52870          BEGIN TEMP := BPRODTBL[FEX].FEXIT; BPRODTBL[FEX].FEXIT := VALUE; FEX := TEMP END
 | |
| 52880        END;
 | |
| 52890    PROCEDURE PARSER;
 | |
| 52900      VAR MATCH: BOOLEAN;
 | |
| 52910      STK: PLEX;
 | |
| 52920      I: INTEGER;
 | |
| 52930        BEGIN
 | |
| 52940        WHILE NOT ENDOFPROG DO
 | |
| 52950          WITH BPRODTBL[PLPTR] DO
 | |
| 52960            BEGIN
 | |
| 52970            MATCH := TRUE;
 | |
| 52980            IF PRSTKA<3 THEN
 | |
| 52990              BEGIN
 | |
| 53000              STK := SRPLSTK[PLSTKP+PRSTKA];
 | |
| 53010              CASE PRSTKC OF
 | |
| 53020                S:  MATCH := SYLXV.LX1IO  = STK^.LXV.LXIO;
 | |
| 53030                C0: MATCH := SYLXV.LX1CL0 = STK^.LXV.LXCLASS0;
 | |
| 53040                C1: MATCH := SYLXV.LX1CL1 = STK^.LXV.LXCLASS1;
 | |
| 53050                C2: MATCH := SYLXV.LX1CL2 = STK^.LXV.LXCLASS2
 | |
| 53060                END
 | |
| 53070              END;
 | |
| 53080            IF MATCH THEN
 | |
| 53090              CASE PRINPC OF
 | |
| 53100                A:  ;
 | |
| 53110                S:  MATCH := SYLXV.LX2IO  = INP^.LXV.LXIO;
 | |
| 53120                C0: MATCH := SYLXV.LX2CL0 = INP^.LXV.LXCLASS0;
 | |
| 53130                C1: MATCH := SYLXV.LX2CL1 = INP^.LXV.LXCLASS1;
 | |
| 53140                C2: MATCH := SYLXV.LX2CL2 = INP^.LXV.LXCLASS2;
 | |
| 53150               SSA: MATCH := SYLXV.LX2IO = SRPLSTK[PLSTKP+1]^.LXV.LXIO
 | |
| 53160                END;
 | |
| 53170            IF MATCH THEN
 | |
| 53180              IF RTN>FINISH THEN
 | |
| 53190                SEMANTICROUTINE(RTN);
 | |
| 53200            IF MATCH THEN
 | |
| 53210              BEGIN
 | |
| 53220              PLSTKP := PLSTKP+PRPOP;
 | |
| 53230              IF PRPUSH<>LXIODUMMY THEN
 | |
| 53240                BEGIN PLSTKP := PLSTKP-1; SRPLSTK[PLSTKP] := PUSHTBL[PRPUSH] END;
 | |
| 53250              IF PRSKIP THEN
 | |
| 53260                INP := PARSIN;
 | |
| 53270              FOR I := 1 TO PRSCAN DO
 | |
| 53280                BEGIN PLSTKP := PLSTKP-1; SRPLSTK[PLSTKP] := INP; INP := PARSIN END;
 | |
| 53290              PLPTR := SEXIT
 | |
| 53300              END
 | |
| 53310            ELSE
 | |
| 53320              PLPTR := FEXIT
 | |
| 53330            END
 | |
| 53340        END;
 | |
| 53350  (*+01()   (*$T-+)   ()+01*)
 | |
| 53360  (*+25()   (*$T-+)   ()+25*)
 | |
| 53370    PROCEDURE CLASSES;
 | |
| 53380        BEGIN
 | |
| 53390        HTCOPY := HT;
 | |
| 53400  (*+01() ENEW(FRED, SZWORD); (*TO MARK THE PRESENT HEAP LIMIT*) ()+01*)
 | |
| 53410        CLASS('CL00      '); CLASS('CL01      ');
 | |
| 53420        CLASS('CL10      '); CLASS('CL11      ');
 | |
| 53430        CLASS('CL12      '); CLASS('CL13      ');
 | |
| 53440        CLASS('CL14      ');
 | |
| 53450        CLASS('CL20      '); CLASS('CL21      ');
 | |
| 53460        CLASS('CL22      '); CLASS('CL23      ');
 | |
| 53470        CLASS('CL24      '); CLASS('CL25      ');
 | |
| 53480        CLASS('CL26      '); CLASS('CL27      ');
 | |
| 53490        CLASS('CL28      '); CLASS('CL29      ');
 | |
| 53500        CLASS('CL2A      '); CLASS('CL2B      ');
 | |
| 53510        CLASS('CL2C      '); CLASS('CL2D      ');
 | |
| 53520        CLASS('CL2E      '); CLASS('CL2F      ');
 | |
| 53530        CLASS('ANY       ');
 | |
| 53540        END;
 | |
| 53550    PROCEDURE TLEXS;
 | |
| 53560        BEGIN
 | |
| 53570        TLEX('ACTPL     ', LXIOACTPL);
 | |
| 53580        TLEX('ACTRL     ', LXIOACTRL);
 | |
| 53590        TLEX('BOUNDS    ', LXIOBOUNDS);
 | |
| 53600        TLEX('BRINPT    ', LXIOBRINPT);
 | |
| 53610        TLEX('BRTHPT    ', LXIOBRTHPT);
 | |
| 53620        TLEX('CSTICK    ', LXIOCSTICK);
 | |
| 53630        TLEX('DCLL      ', LXIODCLL);
 | |
| 53640        TLEX('FLDSPL    ', LXIOFLDSPL);
 | |
| 53650        TLEX('FORDCL    ', LXIOFORDCL);
 | |
| 53660        TLEX('FORRLB    ', LXIOFORRLB);
 | |
| 53670        TLEX('IDEFL     ', LXIOIDEFL);
 | |
| 53680        TLEX('LABSQ     ', LXIOLABSQ);
 | |
| 53690        TLEX('MOIDDR    ', LXIOMOIDDR);
 | |
| 53700        TLEX('NONRDR    ', LXIONONRDR);
 | |
| 53710        TLEX('ODEFL     ', LXIOODEFL);
 | |
| 53720        TLEX('OPRAND    ', LXIOOPRAND);
 | |
| 53730        TLEX('PRIM      ', LXIOPRIM);
 | |
| 53740        TLEX('PRMDRL    ', LXIOPRMDRL);
 | |
| 53750        TLEX('RIDEFL    ', LXIORIDEFL);
 | |
| 53760        TLEX('RODEFL    ', LXIORODEFL);
 | |
| 53770        TLEX('RSPEC     ', LXIORSPEC);
 | |
| 53780        TLEX('RVDEFL    ', LXIORVDEFL);
 | |
| 53790        TLEX('TERT      ', LXIOTERT);
 | |
| 53800        TLEX('TRMSCL    ', LXIOTRMSCL);
 | |
| 53810        TLEX('UNITLC    ', LXIOUNLC);
 | |
| 53820        TLEX('UNITLP    ', LXIOUNLP);
 | |
| 53830        TLEX('UNITSR    ', LXIOUNSR);
 | |
| 53840        TLEX('VDEFL     ', LXIOVDEFL);
 | |
| 53850        TLEX('AGAIN     ', LXIOAGAIN);
 | |
| 53860        TLEX('AT        ', LXIOAT);
 | |
| 53870        TLEX('BEGIN     ', LXIOBEGIN);
 | |
| 53880        TLEX('BOOLDEN   ', LXIOBOOLDEN);
 | |
| 53890        TLEX('BUS       ', LXIOBUS);
 | |
| 53900        TLEX('BY        ', LXIOBY);
 | |
| 53910        TLEX('CASE      ', LXIOCASE);
 | |
| 53920        TLEX('COMMA     ', LXIOCOMMA);
 | |
| 53930        TLEX('COMMENT   ', LXIOCMMENT);
 | |
| 53940        TLEX('DO        ', LXIODO);
 | |
| 53950        TLEX('ELIF      ', LXIOELIF);
 | |
| 53960        TLEX('ELSE      ', LXIOELSE);
 | |
| 53970        TLEX('END       ', LXIOEND);
 | |
| 53980        TLEX('ERROR     ', LXIOERROR);
 | |
| 53990        TLEX('ESAC      ', LXIOESAC);
 | |
| 54000        TLEX('EXIT      ', LXIOEXIT);
 | |
| 54010        TLEX('FI        ', LXIOFI);
 | |
| 54020        TLEX('FOR       ', LXIOFOR);
 | |
| 54030        TLEX('FROM      ', LXIOFROM);
 | |
| 54040        TLEX('GO        ', LXIOGO);
 | |
| 54050        TLEX('GOTO      ', LXIOGOTO);
 | |
| 54060        TLEX('HEAP      ', LXIOHEAP);
 | |
| 54070        TLEX('IDTY      ', LXIOIDTY);
 | |
| 54080        TLEX('IF        ', LXIOIF);
 | |
| 54090        TLEX('IN        ', LXIOIN);
 | |
| 54100        TLEX('LOC       ', LXIOLOC);
 | |
| 54110        TLEX('LONG      ', LXIOLONG);
 | |
| 54120        TLEX('MDIND     ', LXIOMDIND);
 | |
| 54130        TLEX('MODE      ', LXIOMODE);
 | |
| 54140        TLEX('NIL       ', LXIONIL);
 | |
| 54150        TLEX('OD        ', LXIOOD);
 | |
| 54160        TLEX('OF        ', LXIOOF);
 | |
| 54170        TLEX('OP        ', LXIOOP);
 | |
| 54180        TLEX('OPR       ', LXIOOPR);
 | |
| 54190        TLEX('OTHDR     ', LXIOOTHDR);
 | |
| 54200        TLEX('OUSE      ', LXIOOUSE);
 | |
| 54210        TLEX('OUT       ', LXIOOUT);
 | |
| 54220        TLEX('PRAGMAT   ', LXIOPRAGMAT);
 | |
| 54230        TLEX('PRIMDR    ', LXIOPRDR);
 | |
| 54240        TLEX('PRIO      ', LXIOPRIO);
 | |
| 54250        TLEX('PROC      ', LXIOPROC);
 | |
| 54260        TLEX('REF       ', LXIOREF);
 | |
| 54270        TLEX('SHORT     ', LXIOSHORT);
 | |
| 54280        TLEX('SKIP      ', LXIOSKIP);
 | |
| 54290        TLEX('START     ', LXIOSTART);
 | |
| 54300        TLEX('STICK     ', LXIOSTICK);
 | |
| 54310        TLEX('STRGDEN   ', LXIOSTRGDEN);
 | |
| 54320        TLEX('STRUCT    ', LXIOSTRUCT);
 | |
| 54330        TLEX('SUB       ', LXIOSUB);
 | |
| 54340        TLEX('TAB       ', LXIOTAB);
 | |
| 54350        TLEX('TAG       ', LXIOTAG);
 | |
| 54360        TLEX('THEN      ', LXIOTHEN);
 | |
| 54370        TLEX('TO        ', LXIOTO);
 | |
| 54380        TLEX('VOID      ', LXIOVOID);
 | |
| 54390        TLEX('WHILE     ', LXIOWHILE);
 | |
| 54400        TLEX('BECOM     ', LXIOBECOM);
 | |
| 54410        TLEX('CLOSE     ', LXIOCLOSE);
 | |
| 54420        TLEX('COLON     ', LXIOCOLON);
 | |
| 54430        TLEX('EQUAL     ', LXIOEQUAL);
 | |
| 54440        TLEX('OPEN      ', LXIOOPEN);
 | |
| 54450        TLEX('PRIMDEN   ', LXIOPRDEN);
 | |
| 54460        TLEX('SEMIC     ', LXIOSEMIC);
 | |
| 54470        TLEX('STOP      ', LXIOSTOP);
 | |
| 54480        END;
 | |
| 54490  (*+01()   (*+31()   (*$T++)   ()+31+)   ()+01*)
 | |
| 54500  (*+25()   (*+31()   (*$T++)   ()+31+)   ()+25*)
 | |
| 54510      BEGIN (*PARSEPARSER*)
 | |
| 54520      CLASSES;
 | |
| 54530      TLEXS;
 | |
| 54540      (*FLOYD PRODUCTION RULES WHICH WERE USED WITH THE OLD VERSION OF SEMANTICROUTINE GIVEN ABOVE
 | |
| 54550        TO PRODUCE THE CALLS OF BMPROD AND BLABL WHICH FOLLOW*)
 | |
| 54560      (*
 | |
| 54570                        BEGIN:     !                    =>       ,          !     +  INIT;
 | |
| 54580                        INIT:      !                    =>       ,          !     +  PRODRL;
 | |
| 54590                        PRODRL:    STOP@!               => 36    ,1->       !        APRODRL;
 | |
| 54600                        APRODRL:   TAG@!COLON@          => 34    ,1->       ! (1) +  ALABEL;
 | |
| 54610                        ALABEL:    !                    => 10    ,          !        BLABEL;
 | |
| 54620                        BLABEL:    TAG@!AT@             => 11    ,1->       ! (1)    COMMA;
 | |
| 54630                                   TAB@!                => 12    ,1->       !        COMMA;
 | |
| 54640                                   TAG@!                => 11    ,1->       !        COMMA;
 | |
| 54650                                   STICK@!              => 13    ,1->       !     +  ASTICK,ERROR;
 | |
| 54660                        COMMA:     !COMMA@              => 14    ,          ! (1) +  BLABEL;
 | |
| 54670                        STICK:     !STICK@              => 15    ,          ! (1) +  ASTICK,ERROR;
 | |
| 54680                        ASTICK:    TAG@!AT@             => 11    ,1->       ! (1) +  EQUAL;
 | |
| 54690                                   TAB@!                => 12    ,1->       !     +  EQUAL;
 | |
| 54700                                   TAG@!                => 11    ,1->       !     +  EQUAL;
 | |
| 54710                                   EQUAL@!              => 35    ,          !        EQUAL;
 | |
| 54720                        EQUAL:     EQUAL@!OPR@          =>       ,1->       ! (1) +  AEQUAL,ERROR;
 | |
| 54730                        AEQUAL:    TAG@!OPR@            => 16    ,          ! (1)    FSEM;
 | |
| 54740                                   !                    => 17    ,          !        ASEM;
 | |
| 54750                        ASEM:      OPR@!                =>       ,1->       !     +  ASEM2;
 | |
| 54760                        ASEM2:     COMMA@!PRIMDEN@      => 18    ,1->       ! (1) ++ PUSH;
 | |
| 54770                        STICK2:    COMMA@!STICK@        => 19    ,1->       !     ++ ASTICK2,ERROR;
 | |
| 54780                        PUSH:      OPR@,ANY!TAG@        => 20    ,2->       ! (1) ++ ASTICK2;
 | |
| 54790                                   OPR@,ANY!STICK@      => 21    ,2->       !     ++ ASTICK2,ERROR;
 | |
| 54800                        ASTICK2:   OPEN@!PRIMDEN@       => 22    ,2->       ! (1) ++ STAR;
 | |
| 54810                                   !                    => 23    ,          !        STAR;
 | |
| 54820                        STAR:      OPR@!OPR@            => 24    ,1->       ! (1) +  SEX;
 | |
| 54830                                   OPR@!                => 25    ,1->       !     +  SEX;
 | |
| 54840                                   !                    => 26    ,          !        SEX;
 | |
| 54850                        SEX:       TAG@!                => 28    ,2->       !     +  FEX,ERROR;
 | |
| 54860                        FEX:       COMMA@!TAG@          => 29    ,1->       ! (1) +  SEMI;
 | |
| 54870                                   !                    => 30    ,          !        SEMI;
 | |
| 54880                        SEMI:      SEMIC@!              => 31    ,1->       !        INIT;
 | |
| 54890                        ERROR:     START@!              => 32    ,          !        ERR;
 | |
| 54900                                   !                    =>       ,1->       !        ERROR;
 | |
| 54910                        ERR:       !SEMIC@              => 31    ,          ! (1)    INIT;
 | |
| 54920                                   !STOP@               => 36    ,1->       !        ERROR;
 | |
| 54930                                   !                    =>       ,          ! (1)    ERR;
 | |
| 54940                        FSEM:      TAG@!PRSMDEN@        => 16    ,1->       ! (1) +  ASEM,ERROR;
 | |
| 54950      *)
 | |
| 54960      BMPROD(  1, S , LXIODUMMY  ,  0, 3, A , LXIODUMMY  ,  0,    00  , 0, LXIODUMMY  , FALSE, 1,    0,    2);
 | |
| 54970      BLABL(  1,   0,   2);
 | |
| 54980      BMPROD(  2, S , LXIODUMMY  ,  0, 3, A , LXIODUMMY  ,  0,    00  , 0, LXIODUMMY  , FALSE, 1,    0,    3);
 | |
| 54990      BLABL(  2,   0,   3);
 | |
| 55000      BMPROD(  3, S , LXIOSTOP   ,  0, 0, A , LXIODUMMY  ,  0,    36  , 1, LXIODUMMY  , FALSE, 0,    0,    4);
 | |
| 55010      BLABL(  3,   0,   4);
 | |
| 55020      BMPROD(  4, S , LXIOTAG    ,  0, 0, S , LXIOCOLON  ,  0,    34  , 1, LXIODUMMY  , TRUE , 1,    0,    5);
 | |
| 55030      BLABL(  4,   0,   5);
 | |
| 55040      BMPROD(  5, S , LXIODUMMY  ,  0, 3, A , LXIODUMMY  ,  0,    10  , 0, LXIODUMMY  , FALSE, 0,    0,    6);
 | |
| 55050      BLABL(  5,   0,   6);
 | |
| 55060      BMPROD(  6, S , LXIOTAG    ,  0, 0, S , LXIOAT     ,  0,    11  , 1, LXIODUMMY  , TRUE , 0,    0,    7);
 | |
| 55070      BMPROD(  7, S , LXIOTAB    ,  0, 0, A , LXIODUMMY  ,  0,    12  , 1, LXIODUMMY  , FALSE, 0,   -6,    8);
 | |
| 55080      BMPROD(  8, S , LXIOTAG    ,  0, 0, A , LXIODUMMY  ,  0,    11  , 1, LXIODUMMY  , FALSE, 0,   -7,    9);
 | |
| 55090      BMPROD(  9, S , LXIOSTICK  ,  0, 0, A , LXIODUMMY  ,  0,    13  , 1, LXIODUMMY  , FALSE, 1,    0,    0);
 | |
| 55100      BLABL(  8,   0,  10);
 | |
| 55110      BMPROD( 10, S , LXIODUMMY  ,  0, 3, S , LXIOCOMMA  ,  0,    14  , 0, LXIODUMMY  , TRUE , 1,    6,   11);
 | |
| 55120      BMPROD( 11, S , LXIODUMMY  ,  0, 3, S , LXIOSTICK  ,  0,    15  , 0, LXIODUMMY  , TRUE , 1,   -9,   -9);
 | |
| 55130      BLABL( 11,   0,  12);
 | |
| 55140      BMPROD( 12, S , LXIOTAG    ,  0, 0, S , LXIOAT     ,  0,    11  , 1, LXIODUMMY  , TRUE , 1,    0,   13);
 | |
| 55150      BMPROD( 13, S , LXIOTAB    ,  0, 0, A , LXIODUMMY  ,  0,    12  , 1, LXIODUMMY  , FALSE, 1,  -12,   14);
 | |
| 55160      BMPROD( 14, S , LXIOTAG    ,  0, 0, A , LXIODUMMY  ,  0,    11  , 1, LXIODUMMY  , FALSE, 1,  -13,   15);
 | |
| 55170      BMPROD( 15, S , LXIOEQUAL  ,  0, 0, A , LXIODUMMY  ,  0,    35  , 0, LXIODUMMY  , FALSE, 0,  -14,   16);
 | |
| 55180      BLABL( 15,   0,  16);
 | |
| 55190      BMPROD( 16, S , LXIOEQUAL  ,  0, 0, S , LXIOOPR    ,  0,    00  , 1, LXIODUMMY  , TRUE , 1,    0,  -11);
 | |
| 55200      BLABL( 16,   0,  17);
 | |
| 55210      BMPROD( 17, S , LXIOTAG    ,  0, 0, S , LXIOOPR    ,  0,    00 , 0, LXIODUMMY  , TRUE , 0,    0,   18);
 | |
| 55220      BMPROD( 18, S , LXIODUMMY  ,  0, 3, A , LXIODUMMY  ,  0,    17 , 0, LXIODUMMY  , FALSE, 0,    0,   19);
 | |
| 55230      BLABL( 18,   0,  19);
 | |
| 55240      BMPROD( 19, S , LXIOOPR    ,  0, 0, A , LXIODUMMY  ,  0,    00  , 1, LXIODUMMY  , FALSE, 1,    0,   20);
 | |
| 55250      BLABL( 19,   0,  20);
 | |
| 55260      BMPROD( 20, S , LXIOCOMMA  ,  0, 0, S , LXIOPRDEN  ,  0,    18  , 1, LXIODUMMY  , TRUE , 2,    0,   21);
 | |
| 55270      BMPROD( 21, S , LXIOCOMMA  ,  0, 0, S , LXIOSTICK  ,  0,    19  , 1, LXIODUMMY  , FALSE, 2,    0,  -16);
 | |
| 55280      BLABL( 20,   0,  22);
 | |
| 55290      BMPROD( 22, S , LXIOOPR    ,  0, 1, S , LXIOTAG    ,  0,    20  , 2, LXIODUMMY  , TRUE , 2,  -21,   23);
 | |
| 55300      BMPROD( 23, S , LXIOOPR    ,  0, 1, S , LXIOSTICK  ,  0,    21  , 2, LXIODUMMY  , FALSE, 2,  -22,  -21);
 | |
| 55310      BLABL( 23,   0,  24);
 | |
| 55320      BMPROD( 24, S , LXIOOPEN   ,  0, 0, S , LXIOPRDEN  ,  0,    22  , 2, LXIODUMMY  , TRUE , 2,    0,   25);
 | |
| 55330      BMPROD( 25, S , LXIODUMMY  ,  0, 3, A , LXIODUMMY  ,  0,    23  , 0, LXIODUMMY  , FALSE, 0,  -24,   26);
 | |
| 55340      BLABL( 25,   0,  26);
 | |
| 55350      BMPROD( 26, S , LXIOOPR    ,  0, 0, S , LXIOOPR    ,  0,    24 , 1, LXIODUMMY  , TRUE , 1,    0,   27);
 | |
| 55360      BMPROD( 27, S , LXIOOPR    ,  0, 0, A , LXIODUMMY  ,  0,    25  , 1, LXIODUMMY  , FALSE, 1,  -26,   28);
 | |
| 55370      BMPROD( 28, S , LXIODUMMY  ,  0, 3, A , LXIODUMMY  ,  0,    26  , 0, LXIODUMMY  , FALSE, 0,  -27,   29);
 | |
| 55380      BLABL( 28,   0,  29);
 | |
| 55390      BMPROD( 29, S , LXIOTAG    ,  0, 0, A , LXIODUMMY  ,  0,    28  , 2, LXIODUMMY  , FALSE, 1,    0,  -23);
 | |
| 55400      BLABL( 29,   0,  30);
 | |
| 55410      BMPROD( 30, S , LXIOCOMMA  ,  0, 0, S , LXIOTAG    ,  0,    29  , 1, LXIODUMMY  , TRUE , 1,    0,   31);
 | |
| 55420      BMPROD( 31, S , LXIODUMMY  ,  0, 3, A , LXIODUMMY  ,  0,    30  , 0, LXIODUMMY  , FALSE, 0,  -30,   32);
 | |
| 55430      BLABL( 31,   0,  32);
 | |
| 55440      BMPROD( 32, S , LXIOSEMIC  ,  0, 0, A , LXIODUMMY  ,  0,    31  , 1, LXIODUMMY  , FALSE, 0,    2,   33);
 | |
| 55450      BLABL(  0,  29,  33);
 | |
| 55460      BMPROD( 33, S , LXIOSTART  ,  0, 0, A , LXIODUMMY  ,  0,    32  , 0, LXIODUMMY  , FALSE, 0,    0,   34);
 | |
| 55470      BMPROD( 34, S , LXIODUMMY  ,  0, 3, A , LXIODUMMY  ,  0,    00  , 1, LXIODUMMY  , FALSE, 0,   33,   35);
 | |
| 55480      BLABL( 33,   0,  35);
 | |
| 55490      BMPROD( 35, S , LXIODUMMY  ,  0, 3, S , LXIOSEMIC  ,  0,    31  , 0, LXIODUMMY  , TRUE , 0,    2,   36);
 | |
| 55500      BMPROD( 36, S , LXIODUMMY  ,  0, 3, S , LXIOSTOP   ,  0,    36  , 1, LXIODUMMY  , FALSE, 0,   33,   37);
 | |
| 55510      BMPROD( 37, S , LXIODUMMY  ,  0, 3, A , LXIODUMMY  ,  0,    00  , 0, LXIODUMMY  , TRUE , 0,   35,   38);
 | |
| 55520      BLABL( 17,   0,  38);
 | |
| 55530      BMPROD( 38, S , LXIOTAG    ,  0, 0, S , LXIOPRDEN  ,  0,    16  , 1, LXIODUMMY  , TRUE , 1,   19,   33);
 | |
| 55540      ERRS := 0; INITIO; INITLX; INITPR;
 | |
| 55550      PRAGFLGS := PRAGFLGS + [PRGPOINT] - [PRGUPPER];
 | |
| 55560      BCOUNT := 1;
 | |
| 55570      CCOUNT := 0;
 | |
| 55580      PARSER;
 | |
| 55590      IF CCOUNT<>0 THEN WRITELN(LSTFILE,'CCOUNT ERROR', CCOUNT);
 | |
| 55600      WRITELN(LSTFILE,'LAST PROD', BCOUNT-1);
 | |
| 55610  (*+01() J := GETB(4); ()+01*)
 | |
| 55620      FOR I := 0 TO HTSIZE DO (*GET RID OF ALL UNWANTED LEXEMES*)
 | |
| 55630        BEGIN THIS := HT[I];
 | |
| 55640        WHILE THIS<>HTCOPY[I] DO
 | |
| 55650          BEGIN
 | |
| 55660          THAT := THIS^.LINK;
 | |
| 55670          EDISPOSE(THIS, THIS^.LXCOUNT*SZWORD+LEX1SIZE);
 | |
| 55680          THIS := THAT;
 | |
| 55690          END;
 | |
| 55700        END;
 | |
| 55710      HT := HTCOPY; (*RESTORE HT TO STATE BEFORE FRED*)
 | |
| 55720  (*+01()
 | |
| 55730      FOR I := J TO ORD(FRED) DO
 | |
| 55740        BEGIN FRIG.INT := I; FRIG.POINT^ := 0 END;
 | |
| 55750  ()+01*)
 | |
| 55760      END;
 | |
| 55770  (**)
 | |
| 55780  ()+82*)
 |