584 lines
31 KiB
OpenEdge ABL
584 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*)
|