803 lines
36 KiB
OpenEdge ABL
803 lines
36 KiB
OpenEdge ABL
33000 (*+01() (*$P+,T-+) ()+01*)
|
|
33010 (*+25() (*$P+,T-+) ()+25*)
|
|
33020 (* COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER *)
|
|
33030 (**)
|
|
33040 (**)
|
|
33050 (**)
|
|
33060 (*+83()
|
|
33070 (**)
|
|
33080 (**)
|
|
33090 PROCEDURE INITIALIZE;
|
|
33100 (*FUNCTION: COMPILER INITIALIZATION TO SET UP LEXEMES, PARSER,
|
|
33110 STANDARD-PRELUDE, ETC. ULTIMATELY, THE COMPILER WILL BE FROZEN
|
|
33120 AFTER THE CALL OF INITIALIZE, AND HOPEFULLY THIS PROCEDURE CAN
|
|
33130 THEN BE MADE TO VANISH AWAY.
|
|
33140 *)
|
|
33150 VAR I: INTEGER;
|
|
33160 OTCOUNT: INTEGER;
|
|
33170 (*+84()
|
|
33180 (*MDMS*)
|
|
33190 MDVINT, MDVLINT, MDVREAL, MDVLREAL, MDVCHAR, MDVBITS, MDVBYTES, MDVSTRNG, MDVBOOL,
|
|
33200 MDVCHAN, MDVCOVER, MDVVOID, MDVSKIP, MDVJUMP, MDVNIL,
|
|
33210 MDVOUT, MDVIN, MDVOUTB, MDVINB, MDVNUMBER,
|
|
33220 MDVROWS, MDVBNDS, MDVABSENT, MDVERROR (*, MDVPROC, MDVREF, MDVSTRUCT, MDVROW*): MDM;
|
|
33230 ()+84*)
|
|
33240 (*+81()
|
|
33250 (*LXMS - NONTERMINALS*)
|
|
33260 LXVACTPL, LXVACTRL,
|
|
33270 LXVBOUNDS, LXVBRINPT, LXVBRTHPT,
|
|
33280 LXVCSTICK,
|
|
33290 LXVDCLL,
|
|
33300 LXVFLDSPL, LXVFORDCL, LXVFORRLB,
|
|
33310 LXVIDEFL,
|
|
33320 LXVLABSQ,
|
|
33330 LXVMOIDDR,
|
|
33340 LXVNONRDR,
|
|
33350 LXVODEFL, LXVOPRAND,
|
|
33360 LXVPRIM, LXVPRMDRL,
|
|
33370 LXVRIDEFL, LXVRODEFL, LXVRSPEC, LXVRVDEFL,
|
|
33380 LXVTERT, LXVTRMSCL,
|
|
33390 LXVUNLC, LXVUNLP, LXVUNSR,
|
|
33400 LXVVDEFL,
|
|
33410 (*LXMS - TERMINALS*)
|
|
33420 LXVAGAIN, LXVAT,
|
|
33430 LXVBECOM, LXVBEGIN, LXVBOOLDEN, LXVBUS, LXVBY,
|
|
33440 LXVCASE, LXVCLOSE, LXVCOLON, LXVCOMMA, LXVCMMENT,
|
|
33450 LXVDO,
|
|
33460 LXVELIF, LXVELSE, LXVEND, LXVEQUAL, LXVERROR, LXVESAC, LXVEXIT,
|
|
33470 LXVFI, LXVFOR, LXVFROM,
|
|
33480 LXVGO, LXVGOTO,
|
|
33490 LXVHEAP,
|
|
33500 LXVIDTY, LXVIF, LXVIN,
|
|
33510 LXVLOC, LXVLONG,
|
|
33520 (*LXVMDIND,*) LXVMODE,
|
|
33530 LXVNIL,
|
|
33540 LXVOD, LXVOF, LXVOP, LXVOPEN, (*LXVOPR,*) LXVOTHDR, LXVOUSE, LXVOUT,
|
|
33550 LXVPRAGMAT, (*LXVPRDEN,*) LXVPRDR, LXVPRIO, LXVPROC,
|
|
33560 LXVREF,
|
|
33570 LXVSEMIC, LXVSHORT, LXVSKIP, LXVSTART, LXVSTICK, LXVSTOP, (*LXVSTRGDEN*) LXVSTRUCT, LXVSUB,
|
|
33580 (*LXVTAB,*) (*LXVTAG,*) LXVTHEN, LXVTO,
|
|
33590 LXVVOID,
|
|
33600 LXVWHILE: LXM;
|
|
33610 (*PLEXES - NONTERMINALS*)
|
|
33620 LEXACTPL, LEXACTRL,
|
|
33630 LEXBOUNDS, LEXBRINPT, (*LEXBRTHPT,*)
|
|
33640 LEXCSTICK,
|
|
33650 LEXDCLL,
|
|
33660 LEXFLDSPL, LEXFORDCL, LEXFORRLB,
|
|
33670 LEXIDEFL,
|
|
33680 LEXLABSQ,
|
|
33690 LEXMOIDDR,
|
|
33700 LEXNONRDR,
|
|
33710 LEXODEFL, LEXOPRAND,
|
|
33720 LEXPRIM, LEXPRMDRL,
|
|
33730 LEXRIDEFL, LEXRODEFL, LEXRSPEC, LEXRVDEFL,
|
|
33740 LEXTERT, LEXTRMSCL,
|
|
33750 LEXUNLC, LEXUNLP, LEXUNSR,
|
|
33760 LEXVDEFL,
|
|
33770 (*PLEXES - TERMINALS*)
|
|
33780 LEXAGAIN, LEXAT, LEXATB,
|
|
33790 LEXBECOM, (*LEXBEGIN,*) LEXBUSB, LEXBY,
|
|
33800 (*LEXCASE,*) LEXCLOSE, LEXCOLON, LEXCOMMA, LEXCO, LEXCO2, LEXCMMENT,
|
|
33810 LEXDIV, LEXDO, LEXDVAB,
|
|
33820 LEXELIF, LEXELSE, LEXEMPTY, LEXEND, LEXEQUAL, (*LEXERROR,*) LEXESAC, LEXEXIT,
|
|
33830 (*LEXFALSE,*) LEXFI, LEXFLEX, LEXFOR, LEXFROM,
|
|
33840 LEXGE, LEXGO, LEXGOTO, LEXGT,
|
|
33850 LEXHEAP,
|
|
33860 (*LEXIF,*) LEXIN, LEXIS, LEXISB, LEXISNT, LEXISNTB,
|
|
33870 LEXLE, LEXLOC, LEXLONG, LEXLT,
|
|
33880 LEXMDAB, LEXMINUS, LEXMNAB, LEXMOD, LEXMODE,
|
|
33890 LEXNE, LEXNIL,
|
|
33900 LEXOD, LEXOF, LEXOP, (*LEXOPEN,*) LEXOUSE, LEXOUT, LEXOVAB, LEXOVER,
|
|
33910 LEXPAR, LEXPLAB, LEXPLTO, LEXPLUS, LEXPLITM, LEXPR, LEXPRAGMAT, LEXPRIO, LEXPROC,
|
|
33920 LEXREF,
|
|
33930 LEXSEMA, LEXSEMIC, LEXSHORT, LEXSKIP, (*LEXSTART,*) LEXSTICK, (*LEXLSTOP, LEXSTOP,*) LEXSTRUCT, LEXSUBB,
|
|
33940 LEXTHEN, LEXTIMES, LEXTMAB, LEXTO, (*LEXTRUE,*)
|
|
33950 LEXUP1, LEXUP2, LEXUNION,
|
|
33960 LEXVOID (*, LEXWHILE*)
|
|
33970 : PLEX;
|
|
33980 ()+81*)
|
|
33990 PROCEDURE LXVVAL(VAR LXVVAR: LXM; IO: LXIOTYPE; CL0: CL0TYPE; CL1: CL1TYPE; CL2: CL2TYPE);
|
|
34000 VAR WORD: RECORD CASE SEVERAL OF
|
|
34010 (*-02() (*-05() 1:(LXV: LXM); 2:(INT: INTEGER) END; ()-05*) ()-02*)
|
|
34020 (*+02() 1:(LXV:LXM); 2:(INT,INT2,INT3: INTEGER); 3,4,5,6,7,8,9,10:() END; ()+02*)
|
|
34030 (*+05() 1:(LXV:LXM); 2:(INT,INT2: INTEGER); 3,4,5,6,7,8,9,10:() END; ()+05*)
|
|
34040 BEGIN WORD.INT := 0; (*TO ENSURE THAT PARTS OF WORD NOT OCCUPIED BY THE LXM ARE CLEAR*)
|
|
34050 (*+02() WORD.INT2 := 0; WORD.INT3 := 0; ()+02*)
|
|
34060 (*+05() WORD.INT2 := 0; ()+05*)
|
|
34070 WITH WORD.LXV DO
|
|
34080 BEGIN LXIO := IO; LXCLASS0 := CL0; LXCLASS1 := CL1; LXCLASS2 := CL2; LXPSTB := NIL END;
|
|
34090 LXVVAR := WORD.LXV
|
|
34100 END;
|
|
34110 (*+81()
|
|
34120 PROCEDURE LOCNDEX(VAR LEX: PLEX; LXV: LXM);
|
|
34130 BEGIN
|
|
34140 ENEW(LEX, LEX1SIZE);
|
|
34150 LEX^.LXV := LXV;
|
|
34160 LEX^.LXCOUNT := 0;
|
|
34170 END;
|
|
34180 ()+81*)
|
|
34190 (*+84()
|
|
34200 FUNCTION DEFPRC0(YIELD: MODE; CP: CODEPROC): MODE;
|
|
34210 BEGIN SRSEMP := -1; SRSUBP := 0; SUBSAVE;
|
|
34220 FINDPRC(YIELD,0,CP); DEFPRC0 := SRSTK[SRSEMP].MD
|
|
34230 END;
|
|
34240 FUNCTION DEFPRC1(P1, YIELD: MODE; CP: CODEPROC): MODE;
|
|
34250 BEGIN SRSEMP := -1; SRSUBP := 0; SUBSAVE;
|
|
34260 SRSEMP := SRSEMP+1; SRSTK[SRSEMP].MD := P1;
|
|
34270 FINDPRC(YIELD,1,CP); DEFPRC1 := SRSTK[SRSEMP].MD
|
|
34280 END;
|
|
34290 FUNCTION DEFPRC2(P1, P2, YIELD: MODE; CP: CODEPROC): MODE;
|
|
34300 BEGIN SRSEMP := -1; SRSUBP := 0; SUBSAVE;
|
|
34310 SRSEMP := SRSEMP+1; SRSTK[SRSEMP].MD := P1;
|
|
34320 SRSEMP := SRSEMP+1; SRSTK[SRSEMP].MD := P2;
|
|
34330 FINDPRC(YIELD,2,CP); DEFPRC2 := SRSTK[SRSEMP].MD
|
|
34340 END;
|
|
34350 ()+84*)
|
|
34360 (*+81()
|
|
34370 PROCEDURE DEFSYMB(VAR LEX: PLEX; TLXV: LXM; SYMB: ALFA);
|
|
34380 VAR I: INTEGER;
|
|
34390 BEGIN WITH CURRENTLEX DO
|
|
34400 BEGIN
|
|
34410 LXV := TLXV; LXTOKEN := TKSYMBOL;
|
|
34420 (*+11() S10 := SYMB; LXCOUNT := 1; ()+11*)
|
|
34430 (*-11() STASHLEX(SYMB); ()-11*)
|
|
34440 ENEW(LEX, LEX1SIZE+LXCOUNT*SZWORD);
|
|
34450 FOR I := 1 TO LEX1SIZE DIV SZWORD + LXCOUNT DO
|
|
34460 LEX^.LEXWORDS[I] := LEXWORDS[I];
|
|
34470 END
|
|
34480 END;
|
|
34490 (**)
|
|
34500 ()+81*)
|
|
34510 (**)
|
|
34520 PROCEDURE INTAB(VAR LEX: PLEX; TAG: ALFA; LXVV: LXM);
|
|
34530 VAR I: INTEGER;
|
|
34540 BEGIN WITH CURRENTLEX DO
|
|
34550 BEGIN
|
|
34560 LXV := LXVV; LXTOKEN := TKBOLD;
|
|
34570 (*+11() S10:=TAG; LXCOUNT:=1; ()+11*)
|
|
34580 (*-11() STASHLEX(TAG); ()-11*)
|
|
34590 END;
|
|
34600 LEX := HASHIN
|
|
34610 END;
|
|
34620 (*+84()
|
|
34630 FUNCTION DEFTAG(TAG: ALFA): PLEX;
|
|
34640 BEGIN WITH CURRENTLEX DO
|
|
34650 BEGIN
|
|
34660 LXV := LXVTAG; LXTOKEN := TKTAG;
|
|
34670 (*+11() S10:=TAG; LXCOUNT:=1; ()+11*)
|
|
34680 (*-11() STASHLEX(TAG); ()-11*)
|
|
34690 END;
|
|
34700 DEFTAG := HASHIN
|
|
34710 END;
|
|
34720 ()+84*)
|
|
34730 (*+81()
|
|
34740 FUNCTION DEFLTAG(TAG1, TAG2: ALFA): PLEX;
|
|
34750 BEGIN WITH CURRENTLEX DO
|
|
34760 BEGIN
|
|
34770 LXV := LXVTAG; LXTOKEN := TKTAG;
|
|
34780 (*+11() S20 := TAG2; S10 := TAG1; LXCOUNT := 2; ()+11*)
|
|
34790 (*-11() STASHLLEX(TAG1, TAG2); ()-11*)
|
|
34800 DEFLTAG := HASHIN;
|
|
34810 END
|
|
34820 END;
|
|
34830 PROCEDURE OTPAIR(OTCOUNT: OPCHTABBOUND; TCHAR: CHAR; TNEXT, TALT: OPCHTABBOUND; TLEX: PLEX);
|
|
34840 BEGIN WITH OPCHTABLE[OTCOUNT] DO
|
|
34850 BEGIN OTCHAR := TCHAR; OTNEXT := TNEXT; OTALT := TALT; OTLEX := TLEX;
|
|
34860 END
|
|
34870 END;
|
|
34880 PROCEDURE INITLEXES;
|
|
34890 BEGIN
|
|
34900 (*SET UP LXV VALUES - NONTERMINALS*)
|
|
34910 LXVVAL(LXVACTPL , LXIOACTPL , 0, 0, 00); (*ACTUAL PARAMETER LIST*)
|
|
34920 LXVVAL(LXVACTRL , LXIOACTRL , 0, 0, 00); (*ACTUAL ROWER LIST*)
|
|
34930 LXVVAL(LXVBOUNDS , LXIOBOUNDS , 0, 0, 00); (*BOUNDS*)
|
|
34940 LXVVAL(LXVBRINPT , LXIOBRINPT , 0, 0, 02); (*BRIEF IN PART*)
|
|
34950 LXVVAL(LXVBRTHPT , LXIOBRTHPT , 0, 0, 02); (*BRIEF THEN PART*)
|
|
34960 LXVVAL(LXVCSTICK , LXIOCSTICK , 0, 3, 09); (*STICK IN CASE-CLAUSE*)
|
|
34970 LXVVAL(LXVDCLL , LXIODCLL , 0, 0, 00); (*DECLARATION LIST*)
|
|
34980 LXVVAL(LXVFLDSPL , LXIOFLDSPL , 0, 0, 07); (*FIELD SPECIFICATION LIST*)
|
|
34990 LXVVAL(LXVFORDCL , LXIOFORDCL , 0, 0, 00); (*FORMAL DECLARATIVE LIST*)
|
|
35000 LXVVAL(LXVFORRLB , LXIOFORRLB , 0, 0, 00); (*FORMAL ROWER LIST BRACKET*)
|
|
35010 LXVVAL(LXVIDEFL , LXIOIDEFL , 0, 0, 00); (*IDENTITY DEFINITION LIST*)
|
|
35020 LXVVAL(LXVLABSQ , LXIOLABSQ , 0, 0, 00); (*LABEL SEQUENCE*)
|
|
35030 LXVVAL(LXVMOIDDR , LXIOMOIDDR , 0, 0, 00); (*MOID DECLARER*)
|
|
35040 LXVVAL(LXVNONRDR , LXIONONRDR , 0, 0, 00); (*NONROWED DECLARER*)
|
|
35050 LXVVAL(LXVODEFL , LXIOODEFL , 0, 0, 00); (*OPERATION DEFINITION LIST*)
|
|
35060 LXVVAL(LXVOPRAND , LXIOOPRAND , 0, 0, 00); (*OPERAND*)
|
|
35070 LXVVAL(LXVPRIM , LXIOPRIM , 0, 0, 00); (*PRIMARY*)
|
|
35080 LXVVAL(LXVPRMDRL , LXIOPRMDRL , 0, 0, 00); (*PARAMETER DECLARER LIST*)
|
|
35090 LXVVAL(LXVRIDEFL , LXIORIDEFL , 0, 0, 00); (*ROUTINE IDENTITY DEFINITION LIST*)
|
|
35100 LXVVAL(LXVRODEFL , LXIORODEFL , 0, 0, 00); (*ROUTINE OPERATION DEFINITION LIST*)
|
|
35110 LXVVAL(LXVRSPEC , LXIORSPEC , 0, 0, 00); (*ROUTINE SPECIFICATION*)
|
|
35120 LXVVAL(LXVRVDEFL , LXIORVDEFL , 0, 0, 00); (*ROUTINE VARIABLE DEFINITION LIST*)
|
|
35130 LXVVAL(LXVTERT , LXIOTERT , 0, 0, 00); (*TERTIARY*)
|
|
35140 LXVVAL(LXVTRMSCL , LXIOTRMSCL , 0, 0, 00); (*TRIMSCRIPT LIST*)
|
|
35150 LXVVAL(LXVUNLC , LXIOUNLC , 0, 0, 00); (*UNIT LIST PROPER IN COLLATERAL*)
|
|
35160 LXVVAL(LXVUNLP , LXIOUNLP , 0, 0, 00); (*UNIT LIST PROPER*)
|
|
35170 LXVVAL(LXVUNSR , LXIOUNSR , 0, 3, 00); (*UNIT SERIES*)
|
|
35180 LXVVAL(LXVVDEFL , LXIOVDEFL , 0, 0, 00); (*VARIABLE DEFINITION LIST*)
|
|
35190 (*SET UP LXV VALUES - TERMINALS*)
|
|
35200 LXVVAL(LXVAGAIN , LXIOAGAIN , 1, 3, 09);
|
|
35210 LXVVAL(LXVAT , LXIOAT , 1, 1, 05);
|
|
35220 LXVVAL(LXVBECOM , LXIOBECOM , 1, 0, 00);
|
|
35230 LXVVAL(LXVBEGIN , LXIOBEGIN , 0, 3, 02);
|
|
35240 LXVVAL(LXVBOOLDEN, LXIOBOOLDEN, 0, 0, 10);
|
|
35250 LXVBOOLDEN.LXPYPTR := 0;
|
|
35260 LXVVAL(LXVBUS , LXIOBUS , 1, 1, 00);
|
|
35270 LXVVAL(LXVBY , LXIOBY , 0, 0, 01);
|
|
35280 LXVVAL(LXVCASE , LXIOCASE , 0, 3, 02);
|
|
35290 LXVVAL(LXVCLOSE , LXIOCLOSE , 1, 1, 15);
|
|
35300 LXVVAL(LXVCOLON , LXIOCOLON , 1, 0, 05);
|
|
35310 LXVVAL(LXVCOMMA , LXIOCOMMA , 1, 1, 13);
|
|
35320 LXVVAL(LXVCMMENT , LXIOCMMENT , 0, 0, 00);
|
|
35330 LXVVAL(LXVDO , LXIODO , 0, 3, 01);
|
|
35340 LXVVAL(LXVELIF , LXIOELIF , 1, 3, 04);
|
|
35350 LXVVAL(LXVELSE , LXIOELSE , 1, 3, 04);
|
|
35360 LXVVAL(LXVEND , LXIOEND , 1, 0, 15);
|
|
35370 LXVVAL(LXVEQUAL , LXIOEQUAL , 0, 4, 00);
|
|
35380 LXVVAL(LXVERROR , LXIOERROR , 0, 0, 00);
|
|
35390 LXVVAL(LXVESAC , LXIOESAC , 1, 0, 15);
|
|
35400 LXVVAL(LXVEXIT , LXIOEXIT , 1, 0, 00);
|
|
35410 LXVVAL(LXVFI , LXIOFI , 1, 0, 15);
|
|
35420 LXVVAL(LXVFOR , LXIOFOR , 0, 0, 01);
|
|
35430 LXVVAL(LXVFROM , LXIOFROM , 0, 0, 01);
|
|
35440 LXVVAL(LXVGO , LXIOGO , 0, 0, 00);
|
|
35450 LXVVAL(LXVGOTO , LXIOGOTO , 0, 0, 00);
|
|
35460 LXVVAL(LXVHEAP , LXIOHEAP , 0, 0, 14);
|
|
35470 LXVVAL(LXVIDTY , LXIOIDTY , 1, 0, 00);
|
|
35480 LXVVAL(LXVIF , LXIOIF , 0, 3, 02);
|
|
35490 LXVVAL(LXVIN , LXIOIN , 1, 3, 00);
|
|
35500 LXVVAL(LXVLOC , LXIOLOC , 0, 0, 14);
|
|
35510 LXVVAL(LXVLONG , LXIOLONG , 0, 2, 00);
|
|
35520 LXVVAL(LXVMDIND , LXIOMDIND , 0, 2, 11);
|
|
35530 LXVVAL(LXVMODE , LXIOMODE , 0, 0, 00);
|
|
35540 LXVVAL(LXVNIL , LXIONIL , 0, 0, 00);
|
|
35550 LXVVAL(LXVOD , LXIOOD , 1, 0, 15);
|
|
35560 LXVVAL(LXVOF , LXIOOF , 1, 0, 00);
|
|
35570 LXVVAL(LXVOP , LXIOOP , 0, 0, 12);
|
|
35580 LXVVAL(LXVOPEN , LXIOOPEN , 0, 3, 06);
|
|
35590 LXVVAL(LXVOPR , LXIOOPR , 0, 4, 00);
|
|
35600 LXVVAL(LXVOTHDR , LXIOOTHDR , 0, 2, 08); (*DOESN'T SEEM TO BE USED ANYWHERE*)
|
|
35610 LXVVAL(LXVOUSE , LXIOOUSE , 1, 3, 03);
|
|
35620 LXVVAL(LXVOUT , LXIOOUT , 1, 3, 03);
|
|
35630 LXVVAL(LXVPRAGMAT, LXIOPRAGMAT, 0, 0, 00);
|
|
35640 LXVVAL(LXVPRDEN , LXIOPRDEN , 0, 0, 10);
|
|
35650 LXVPRDEN.LXPYPTR := 0;
|
|
35660 LXVVAL(LXVPRDR , LXIOPRDR , 0, 2, 08);
|
|
35670 LXVVAL(LXVPRIO , LXIOPRIO , 0, 0, 00);
|
|
35680 LXVVAL(LXVPROC , LXIOPROC , 0, 2, 12);
|
|
35690 LXVVAL(LXVREF , LXIOREF , 0, 2, 00);
|
|
35700 LXVVAL(LXVSEMIC , LXIOSEMIC , 1, 0, 13);
|
|
35710 LXVVAL(LXVSHORT , LXIOSHORT , 0, 2, 00);
|
|
35720 LXVVAL(LXVSKIP , LXIOSKIP , 0, 0, 00);
|
|
35730 LXVVAL(LXVSTART , LXIOSTART , 0, 0, 00);
|
|
35740 LXVVAL(LXVSTICK , LXIOSTICK , 1, 3, 09);
|
|
35750 LXVVAL(LXVSTOP , LXIOSTOP , 1, 0, 00);
|
|
35760 LXVVAL(LXVSTRGDEN, LXIOSTRGDEN, 0, 0, 10);
|
|
35770 LXVSTRGDEN.LXPYPTR := 0;
|
|
35780 LXVVAL(LXVSTRUCT , LXIOSTRUCT , 0, 2, 07);
|
|
35790 LXVVAL(LXVSUB , LXIOSUB , 0, 2, 06);
|
|
35800 LXVVAL(LXVTAB , LXIOTAB , 0, 4, 11);
|
|
35810 LXVVAL(LXVTAG , LXIOTAG , 0, 0, 00);
|
|
35820 LXVVAL(LXVTHEN , LXIOTHEN , 1, 3, 00);
|
|
35830 LXVVAL(LXVTO , LXIOTO , 0, 0, 01);
|
|
35840 LXVVAL(LXVVOID , LXIOVOID , 0, 0, 00);
|
|
35850 LXVVAL(LXVWHILE , LXIOWHILE , 0, 3, 01);
|
|
35860 (*SET UP LEX VALUES - NONTERMINALS*)
|
|
35870 LOCNDEX(LEXACTPL, LXVACTPL);
|
|
35880 LOCNDEX(LEXACTRL, LXVACTRL);
|
|
35890 LOCNDEX(LEXBOUNDS, LXVBOUNDS);
|
|
35900 LOCNDEX(LEXBRINPT, LXVBRINPT);
|
|
35910 LOCNDEX(LEXBRTHPT, LXVBRTHPT);
|
|
35920 LOCNDEX(LEXCSTICK, LXVCSTICK);
|
|
35930 LOCNDEX(LEXDCLL, LXVDCLL);
|
|
35940 LOCNDEX(LEXFLDSPL, LXVFLDSPL);
|
|
35950 LOCNDEX(LEXFORDCL, LXVFORDCL);
|
|
35960 LOCNDEX(LEXFORRLB, LXVFORRLB);
|
|
35970 LOCNDEX(LEXIDEFL, LXVIDEFL);
|
|
35980 LOCNDEX(LEXLABSQ, LXVLABSQ);
|
|
35990 LOCNDEX(LEXMOIDDR, LXVMOIDDR);
|
|
36000 LOCNDEX(LEXNONRDR, LXVNONRDR);
|
|
36010 LOCNDEX(LEXODEFL, LXVODEFL);
|
|
36020 LOCNDEX(LEXOPRAND, LXVOPRAND);
|
|
36030 LOCNDEX(LEXPRIM, LXVPRIM);
|
|
36040 LOCNDEX(LEXPRMDRL, LXVPRMDRL);
|
|
36050 LOCNDEX(LEXRIDEFL, LXVRIDEFL);
|
|
36060 LOCNDEX(LEXRODEFL, LXVRODEFL);
|
|
36070 LOCNDEX(LEXRSPEC, LXVRSPEC);
|
|
36080 LOCNDEX(LEXRVDEFL, LXVRVDEFL);
|
|
36090 LOCNDEX(LEXTERT, LXVTERT);
|
|
36100 LOCNDEX(LEXTRMSCL, LXVTRMSCL);
|
|
36110 LOCNDEX(LEXUNLC, LXVUNLC);
|
|
36120 LOCNDEX(LEXUNLP, LXVUNLP);
|
|
36130 LOCNDEX(LEXUNSR, LXVUNSR);
|
|
36140 LOCNDEX(LEXVDEFL, LXVVDEFL);
|
|
36150 (*SET UP LEX VALUES - BRIEF TERMINALS*)
|
|
36160 LOCNDEX(LEXAGAIN, LXVAGAIN);
|
|
36170 LOCNDEX(LEXAT, LXVAT);
|
|
36180 LOCNDEX(LEXBECOM, LXVBECOM);
|
|
36190 LOCNDEX(LEXBUSB, LXVBUS);
|
|
36200 LOCNDEX(LEXCLOSE, LXVCLOSE);
|
|
36210 LOCNDEX(LEXCOLON, LXVCOLON);
|
|
36220 LOCNDEX(LEXCOMMA, LXVCOMMA);
|
|
36230 DEFSYMB(LEXCO2, LXVCMMENT, '# ');
|
|
36240 DEFSYMB(LEXDIV, LXVOPR, '/ ');
|
|
36250 DEFSYMB(LEXDVAB, LXVOPR, '/:= ');
|
|
36260 DEFSYMB(LEXEQUAL, LXVEQUAL, '= ');
|
|
36270 LOCNDEX(LEXERROR, LXVERROR);
|
|
36280 DEFSYMB(LEXGE, LXVOPR, '>= ');
|
|
36290 DEFSYMB(LEXGT, LXVOPR, '> ');
|
|
36300 LOCNDEX(LEXIS, LXVIDTY);
|
|
36310 LEXIS^.LXV.LXP := 0;
|
|
36320 LOCNDEX(LEXISNT, LXVIDTY);
|
|
36330 LEXISNT^.LXV.LXP := 1;
|
|
36340 DEFSYMB(LEXLE, LXVOPR, '<= ');
|
|
36350 DEFSYMB(LEXLT, LXVOPR, '< ');
|
|
36360 DEFSYMB(LEXMDAB, LXVOPR, '%*:= ');
|
|
36370 DEFSYMB(LEXMINUS, LXVOPR, '- ');
|
|
36380 DEFSYMB(LEXMNAB, LXVOPR, '-:= ');
|
|
36390 DEFSYMB(LEXMOD, LXVOPR, '%* ');
|
|
36400 DEFSYMB(LEXNE, LXVOPR, '/= ');
|
|
36410 LOCNDEX(LEXOPEN, LXVOPEN);
|
|
36420 DEFSYMB(LEXOVAB, LXVOPR, '%:= ');
|
|
36430 DEFSYMB(LEXOVER, LXVOPR, '% ');
|
|
36440 DEFSYMB(LEXPLAB, LXVOPR, '+:= ');
|
|
36450 DEFSYMB(LEXPLTO, LXVOPR, '+=: ');
|
|
36460 DEFSYMB(LEXPLUS, LXVOPR, '+ ');
|
|
36470 DEFSYMB(LEXPLITM, LXVOPR, '+* ');
|
|
36480 (*LEXPR2 OMITTED*)
|
|
36490 LOCNDEX(LEXSEMIC, LXVSEMIC);
|
|
36500 LOCNDEX(LEXSTART, LXVSTART);
|
|
36510 LOCNDEX(LEXSTICK, LXVSTICK);
|
|
36520 LOCNDEX(LEXSTOP, LXVSTOP);
|
|
36530 LOCNDEX(LEXSUBB, LXVSUB);
|
|
36540 DEFSYMB(LEXTIMES, LXVOPR, '* ');
|
|
36550 DEFSYMB(LEXTMAB, LXVOPR, '*:= ');
|
|
36560 DEFSYMB(LEXUP1, LXVOPR, '^ ');
|
|
36570 DEFSYMB(LEXUP2, LXVOPR, '** ');
|
|
36580 END;
|
|
36590 (**)
|
|
36600 PROCEDURE MAKEPUSHTBL;
|
|
36610 (*SET UP PUSHTBL*)
|
|
36620 BEGIN
|
|
36630 PUSHTBL[LXIOACTPL] := LEXACTPL;
|
|
36640 PUSHTBL[LXIOACTRL] := LEXACTRL;
|
|
36650 PUSHTBL[LXIOBOUNDS] := LEXBOUNDS;
|
|
36660 PUSHTBL[LXIOBRINPT] := LEXBRINPT;
|
|
36670 PUSHTBL[LXIOBRTHPT] := LEXBRTHPT;
|
|
36680 PUSHTBL[LXIOCSTICK] := LEXCSTICK;
|
|
36690 PUSHTBL[LXIODCLL] := LEXDCLL;
|
|
36700 PUSHTBL[LXIOFLDSPL] := LEXFLDSPL;
|
|
36710 PUSHTBL[LXIOFORDCL] := LEXFORDCL;
|
|
36720 PUSHTBL[LXIOFORRLB] := LEXFORRLB;
|
|
36730 PUSHTBL[LXIOIDEFL] := LEXIDEFL;
|
|
36740 PUSHTBL[LXIOLABSQ] := LEXLABSQ;
|
|
36750 PUSHTBL[LXIOMOIDDR] := LEXMOIDDR;
|
|
36760 PUSHTBL[LXIONONRDR] := LEXNONRDR;
|
|
36770 PUSHTBL[LXIOODEFL] := LEXODEFL;
|
|
36780 PUSHTBL[LXIOOPRAND] := LEXOPRAND;
|
|
36790 PUSHTBL[LXIOPRIM] := LEXPRIM;
|
|
36800 PUSHTBL[LXIOPRMDRL] := LEXPRMDRL;
|
|
36810 PUSHTBL[LXIORIDEFL] := LEXRIDEFL;
|
|
36820 PUSHTBL[LXIORODEFL] := LEXRODEFL;
|
|
36830 PUSHTBL[LXIORSPEC] := LEXRSPEC;
|
|
36840 PUSHTBL[LXIORVDEFL] := LEXRVDEFL;
|
|
36850 PUSHTBL[LXIOTERT] := LEXTERT;
|
|
36860 PUSHTBL[LXIOTRMSCL] := LEXTRMSCL;
|
|
36870 PUSHTBL[LXIOUNLC] := LEXUNLC;
|
|
36880 PUSHTBL[LXIOUNLP] := LEXUNLP;
|
|
36890 PUSHTBL[LXIOUNSR] := LEXUNSR;
|
|
36900 PUSHTBL[LXIOVDEFL] := LEXVDEFL;
|
|
36910 END;
|
|
36920 PROCEDURE OTPAIRS;
|
|
36930 (*SET UP OPCHTABLE*)
|
|
36940 BEGIN
|
|
36950 (*THE INITIAL ENTRIES TO THIS TABLE (THE ONES LESS INDENTED) DEPEND UPON
|
|
36960 THE POSITION OF THE CHARACTER CONCERNED IN THE CHARACTER CODE*)
|
|
36970 (*+01() (*BUT ':' OCCUPIES THE POSITION OF '$'*) ()+01*)
|
|
36980 (*-01() (*BUT '[', ']' AND '^' OCCUPY THE POSITIONS OF '$', '&' AND ''''*) ()-01*)
|
|
36990 (*+01() (*CDC CODE*)
|
|
37000 OTPAIR( 0, '+', 37, 0, LEXPLUS);
|
|
37010 OTPAIR( 1, '-', 15, 0, LEXMINUS);
|
|
37020 OTPAIR( 2, '*', 45, 0, LEXTIMES);
|
|
37030 OTPAIR( 3, '/', 42, 0, LEXDIV);
|
|
37040 OTPAIR( 4, '(', 0, 0, LEXOPEN);
|
|
37050 OTPAIR( 5, ')', 0, 0, LEXCLOSE);
|
|
37060 OTPAIR( 6, ':', 27, 0, LEXCOLON);
|
|
37070 OTPAIR( 7, '=', 0, 0, LEXEQUAL);
|
|
37080 OTPAIR( 8, ':', 0, 0, LEXAGAIN);
|
|
37090 OTPAIR( 9, ',', 0, 0, LEXCOMMA);
|
|
37100 OTPAIR(10, '=', 0, 0, LEXLE);
|
|
37110 OTPAIR(11, '#', 0, 0, LEXCO2);
|
|
37120 OTPAIR(12, '[', 0, 0, LEXSUBB);
|
|
37130 OTPAIR(13, ']', 0, 0, LEXBUSB);
|
|
37140 OTPAIR(14, '%', 32, 0, LEXOVER);
|
|
37150 OTPAIR(15, ':', 16, 0, LEXERROR);
|
|
37160 OTPAIR(16, '=', 0, 0, LEXMNAB);
|
|
37170 (*-51()
|
|
37180 OTPAIR(17, '!', 8, 0, LEXSTICK);
|
|
37190 ()-51*)
|
|
37200 (*+51()
|
|
37210 OTPAIR(18, '&', 8, 0, LEXSTICK);
|
|
37220 OTPAIR(19, '''', 0, 0, LEXUP1);
|
|
37230 ()+51*)
|
|
37240 OTPAIR(20, '=', 0, 0, LEXTMAB);
|
|
37250 OTPAIR(21, '<', 10, 0, LEXLT);
|
|
37260 OTPAIR(22, '>', 24, 0, LEXGT);
|
|
37270 OTPAIR(23, '@', 0, 0, LEXAT);
|
|
37280 OTPAIR(24, '=', 0, 0, LEXGE);
|
|
37290 (*-51()
|
|
37300 OTPAIR(25, '^', 0, 0, LEXUP1);
|
|
37310 ()-51*)
|
|
37320 OTPAIR(26, ';', 0, 0, LEXSEMIC);
|
|
37330 OTPAIR(27, '=', 28, 29, LEXBECOM);
|
|
37340 OTPAIR(28, ':', 0, 0, LEXIS);
|
|
37350 OTPAIR(29, '/', 30, 0, LEXERROR);
|
|
37360 OTPAIR(30, '=', 31, 0, LEXERROR);
|
|
37370 OTPAIR(31, ':', 0, 0, LEXISNT);
|
|
37380 ()+01*)
|
|
37390 (*+25() (*CDC CODE*)
|
|
37400 OTPAIR( 0, '+', 37, 0, LEXPLUS);
|
|
37410 OTPAIR( 1, '-', 15, 0, LEXMINUS);
|
|
37420 OTPAIR( 2, '*', 45, 0, LEXTIMES);
|
|
37430 OTPAIR( 3, '/', 42, 0, LEXDIV);
|
|
37440 OTPAIR( 4, '(', 0, 0, LEXOPEN);
|
|
37450 OTPAIR( 5, ')', 0, 0, LEXCLOSE);
|
|
37460 OTPAIR( 6, ':', 27, 0, LEXCOLON);
|
|
37470 OTPAIR( 7, '=', 0, 0, LEXEQUAL);
|
|
37480 OTPAIR( 8, ':', 0, 0, LEXAGAIN);
|
|
37490 OTPAIR( 9, ',', 0, 0, LEXCOMMA);
|
|
37500 OTPAIR(10, '=', 0, 0, LEXLE);
|
|
37510 OTPAIR(11, '#', 0, 0, LEXCO2);
|
|
37520 OTPAIR(12, '[', 0, 0, LEXSUBB);
|
|
37530 OTPAIR(13, ']', 0, 0, LEXBUSB);
|
|
37540 OTPAIR(14, '%', 32, 0, LEXOVER);
|
|
37550 OTPAIR(15, ':', 16, 0, LEXERROR);
|
|
37560 OTPAIR(16, '=', 0, 0, LEXMNAB);
|
|
37570 (*-51()
|
|
37580 OTPAIR(17, '!', 8, 0, LEXSTICK);
|
|
37590 ()-51*)
|
|
37600 (*+51()
|
|
37610 OTPAIR(18, '&', 8, 0, LEXSTICK);
|
|
37620 OTPAIR(19, '''', 0, 0, LEXUP1);
|
|
37630 ()+51*)
|
|
37640 OTPAIR(20, '=', 0, 0, LEXTMAB);
|
|
37650 OTPAIR(21, '<', 10, 0, LEXLT);
|
|
37660 OTPAIR(22, '>', 24, 0, LEXGT);
|
|
37670 OTPAIR(23, '@', 0, 0, LEXAT);
|
|
37680 OTPAIR(24, '=', 0, 0, LEXGE);
|
|
37690 (*-51()
|
|
37700 OTPAIR(25, '^', 0, 0, LEXUP1);
|
|
37710 ()-51*)
|
|
37720 OTPAIR(26, ';', 0, 0, LEXSEMIC);
|
|
37730 OTPAIR(27, '=', 28, 29, LEXBECOM);
|
|
37740 OTPAIR(28, ':', 0, 0, LEXIS);
|
|
37750 OTPAIR(29, '/', 30, 0, LEXERROR);
|
|
37760 OTPAIR(30, '=', 31, 0, LEXERROR);
|
|
37770 OTPAIR(31, ':', 0, 0, LEXISNT);
|
|
37780 ()+25*)
|
|
37790 (*-01() (*ASCII*)
|
|
37800 (*-25()
|
|
37810 OTPAIR( 0, '!', 1, 0, LEXSTICK); (*!*)
|
|
37820 OTPAIR( 1, ':', 0, 0, LEXAGAIN); (*!:*)
|
|
37830 OTPAIR( 2, '#', 0, 0, LEXCO2 ); (*#*)
|
|
37840 OTPAIR( 3, '[', 0, 0, LEXSUBB ); (*[*)
|
|
37850 OTPAIR( 4, '\', 0, 0, LEXSTICK); (*STICK*)
|
|
37860 OTPAIR( 5, ']', 0, 0, LEXBUSB ); (*]*)
|
|
37870 OTPAIR( 6, '^', 0, 0, LEXUP1 ); (*^*)
|
|
37880 OTPAIR( 7, '(', 0, 0, LEXOPEN ); (*(*)
|
|
37890 OTPAIR( 8, ')', 0, 0, LEXCLOSE); (*)*)
|
|
37900 OTPAIR( 9, '*', 45, 0, LEXTIMES); (***)
|
|
37910 OTPAIR(10, '+', 37, 0, LEXPLUS ); (*+*)
|
|
37920 OTPAIR(11, ',', 0, 0, LEXCOMMA); (*,*)
|
|
37930 OTPAIR(12, '-', 21, 0, LEXMINUS); (*-*)
|
|
37940 OTPAIR(13, '=', 0, 0, LEXLE ); (*<=*)
|
|
37950 OTPAIR(14, '/', 42, 0, LEXDIV ); (* / *)
|
|
37960 OTPAIR(15, '=', 16, 17, LEXBECOM);(*:=*)
|
|
37970 OTPAIR(16, ':', 0, 0, LEXIS ); (*:=:*)
|
|
37980 OTPAIR(17, '/', 18, 0, LEXERROR);
|
|
37990 OTPAIR(18, '=', 19, 0, LEXERROR);
|
|
38000 OTPAIR(19, ':', 0, 0, LEXISNT ); (*:/=:*)
|
|
38010 OTPAIR(20, '=', 0, 0, LEXTMAB ); (**:=*)
|
|
38020 OTPAIR(21, ':', 22, 0, LEXERROR);
|
|
38030 OTPAIR(22, '=', 0, 0, LEXMNAB ); (*-:=*)
|
|
38040 OTPAIR(23, '%', 32, 0, LEXOVER ); (*%*)
|
|
38050 (*SPARE 24*)
|
|
38060 OTPAIR(25, ':', 15, 0, LEXCOLON); (*:*)
|
|
38070 OTPAIR(26, ';', 0, 0, LEXSEMIC); (*;*)
|
|
38080 OTPAIR(27, '<', 13, 0, LEXLT ); (*<*)
|
|
38090 OTPAIR(28, '=', 0, 0, LEXEQUAL); (*=*)
|
|
38100 OTPAIR(29, '>', 30, 0, LEXGT ); (*>*)
|
|
38110 OTPAIR(30, '=', 0, 0, LEXGE ); (*>=*)
|
|
38120 OTPAIR(31, '@', 0, 0, LEXAT ); (*@*)
|
|
38130 ()-25*)
|
|
38140 ()-01*)
|
|
38150 OTPAIR(32, '*', 33, 35, LEXMOD) ; (*%**)
|
|
38160 OTPAIR(33, ':', 34, 0, LEXERROR);
|
|
38170 OTPAIR(34, '=', 0, 0, LEXMDAB ); (*%*:=*)
|
|
38180 OTPAIR(35, ':', 36, 0, LEXERROR);
|
|
38190 OTPAIR(36, '=', 0, 0, LEXOVAB ); (*%:=*)
|
|
38200 OTPAIR(37, '=', 38, 39, LEXERROR);
|
|
38210 OTPAIR(38, ':', 0, 0, LEXPLTO ); (*+=:*)
|
|
38220 OTPAIR(39, ':', 40, 41, LEXERROR);
|
|
38230 OTPAIR(40, '=', 0, 0, LEXPLAB ); (*+:=*)
|
|
38240 OTPAIR(41, '*', 0, 0, LEXPLITM); (*+**)
|
|
38250 OTPAIR(42, '=', 0, 43, LEXNE ); (*/=*)
|
|
38260 OTPAIR(43, ':', 44, 0, LEXERROR);
|
|
38270 OTPAIR(44, '=', 0, 0, LEXDVAB ); (*/:=*)
|
|
38280 OTPAIR(45, '*', 0, 46, LEXUP2 ); (****)
|
|
38290 OTPAIR(46, ':', 20, 0, LEXERROR);
|
|
38300 END;
|
|
38310 PROCEDURE BOLDWORDS;
|
|
38320 BEGIN
|
|
38330 INTAB(LEXATB , 'AT ', LXVAT);
|
|
38340 INTAB(LEXBEGIN , 'BEGIN ', LXVBEGIN);
|
|
38350 INTAB(LEXBY , 'BY ', LXVBY);
|
|
38360 INTAB(LEXCASE , 'CASE ', LXVCASE);
|
|
38370 INTAB(LEXCO , 'CO ', LXVCMMENT);
|
|
38380 INTAB(LEXCMMENT, 'COMMENT ', LXVCMMENT);
|
|
38390 INTAB(LEXDO , 'DO ', LXVDO);
|
|
38400 INTAB(LEXELIF , 'ELIF ', LXVELIF);
|
|
38410 INTAB(LEXELSE , 'ELSE ', LXVELSE);
|
|
38420 INTAB(LEXEMPTY , 'EMPTY ', LXVERROR);
|
|
38430 INTAB(LEXEND , 'END ', LXVEND);
|
|
38440 INTAB(LEXESAC , 'ESAC ', LXVESAC);
|
|
38450 INTAB(LEXEXIT , 'EXIT ', LXVEXIT);
|
|
38460 INTAB(LEXFALSE , 'FALSE ', LXVBOOLDEN);
|
|
38470 INTAB(LEXFI , 'FI ', LXVFI);
|
|
38480 INTAB(LEXFLEX , 'FLEX ', LXVERROR);
|
|
38490 INTAB(LEXFOR , 'FOR ', LXVFOR);
|
|
38500 INTAB(LEXFROM , 'FROM ', LXVFROM);
|
|
38510 INTAB(LEXGO , 'GO ', LXVGO);
|
|
38520 INTAB(LEXGOTO , 'GOTO ', LXVGOTO);
|
|
38530 INTAB(LEXHEAP , 'HEAP ', LXVHEAP);
|
|
38540 INTAB(LEXIF , 'IF ', LXVIF);
|
|
38550 INTAB(LEXIN , 'IN ', LXVIN);
|
|
38560 INTAB(LEXISB , 'IS ', LXVIDTY);
|
|
38570 INTAB(LEXISNTB , 'ISNT ', LXVIDTY);
|
|
38580 INTAB(LEXLOC , 'LOC ', LXVLOC);
|
|
38590 INTAB(LEXLONG , 'LONG ', LXVLONG);
|
|
38600 INTAB(LEXMODE , 'MODE ', LXVMODE);
|
|
38610 INTAB(LEXNIL , 'NIL ', LXVNIL);
|
|
38620 INTAB(LEXOD , 'OD ', LXVOD);
|
|
38630 INTAB(LEXOF , 'OF ', LXVOF);
|
|
38640 INTAB(LEXOP , 'OP ', LXVOP);
|
|
38650 INTAB(LEXOUSE , 'OUSE ', LXVOUSE);
|
|
38660 INTAB(LEXOUT , 'OUT ', LXVOUT);
|
|
38670 INTAB(LEXPAR , 'PAR ', LXVERROR);
|
|
38680 INTAB(LEXPR , 'PR ', LXVPRAGMAT);
|
|
38690 INTAB(LEXPRAGMAT, 'PRAGMAT ', LXVPRAGMAT);
|
|
38700 INTAB(LEXPRIO , 'PRIO ', LXVPRIO);
|
|
38710 INTAB(LEXPROC , 'PROC ', LXVPROC);
|
|
38720 INTAB(LEXREF , 'REF ', LXVREF);
|
|
38730 INTAB(LEXSEMA , 'SEMA ', LXVERROR);
|
|
38740 INTAB(LEXSHORT , 'SHORT ', LXVSHORT);
|
|
38750 INTAB(LEXSKIP , 'SKIP ', LXVSKIP);
|
|
38760 INTAB(LEXSTRUCT , 'STRUCT ', LXVSTRUCT);
|
|
38770 INTAB(LEXTHEN , 'THEN ', LXVTHEN);
|
|
38780 INTAB(LEXTO , 'TO ', LXVTO);
|
|
38790 INTAB(LEXTRUE , 'TRUE ', LXVBOOLDEN);
|
|
38800 INTAB(LEXUNION , 'UNION ', LXVERROR);
|
|
38810 INTAB(LEXVOID , 'VOID ', LXVVOID);
|
|
38820 INTAB(LEXWHILE , 'WHILE ', LXVWHILE);
|
|
38830 END;
|
|
38840 ()+81*)
|
|
38850 (*+84()
|
|
38860 PROCEDURE INITMODES;
|
|
38870 CONST SIMPLE=FALSE; PILE=TRUE; UNDRESSED=FALSE; DRESSED=TRUE; IO=TRUE;
|
|
38880 NOIO=FALSE; O=FALSE; SCOPE=TRUE;
|
|
38890 VAR I: INTEGER;
|
|
38900 PRFB: MODE;
|
|
38910 PLX: PLEX; LXEM: LXM; LX: LXM;
|
|
38920 PROCEDURE MDVVAL(VAR V: MDM; ID: MDIDTYPE; PILE, DRESSED, IO, SCOPE: BOOLEAN; LENGTH: INTEGER);
|
|
38930 (*+02() (*-25() VAR CLEAR: RECORD CASE BOOLEAN OF
|
|
38940 TRUE: (V:MDM); FALSE: (A: ARRAY[1..MODE1SIZE] OF INTEGER) END
|
|
38950 I: INTEGER; ()-25*) ()+02*)
|
|
38960 BEGIN
|
|
38970 (*+02() (*-25() WITH CLEAR DO FOR I:= 1 TO MODE1SIZE DIV SZWORD DO A[I] := 0;
|
|
38980 V := CLEAR.V;
|
|
38990 ()-25*) ()+02*)
|
|
39000 WITH V DO
|
|
39010 BEGIN MDID := ID; MDLEN := LENGTH;
|
|
39020 MDDEPROC := FALSE; MDRECUR := FALSE;
|
|
39030 MDDRESSED := DRESSED; MDIO := IO; MDPILE := PILE; MDSCOPE := SCOPE; MDCNT := 0
|
|
39040 END
|
|
39050 END;
|
|
39060 PROCEDURE MDVAR(VAR V: MODE; MDV: MDM);
|
|
39070 BEGIN ENEW(V, MODE1SIZE); V^.MDV := MDV END;
|
|
39080 PROCEDURE MDIND(TAG: ALFA; M: MODE);
|
|
39090 VAR LEX: PLEX; STB: PSTB;
|
|
39100 BEGIN
|
|
39110 INTAB(LEX,TAG,LX);
|
|
39120 LEX^.LXV.LXPMD := M
|
|
39130 END;
|
|
39140 PROCEDURE PUTFIELD(M: MODE; L: PLEX);
|
|
39150 BEGIN
|
|
39152 SRSEMP := SRSEMP+2;
|
|
39154 SRSTK[SRSEMP-1].MD := M;
|
|
39156 SRSTK[SRSEMP].LEX := L ;
|
|
39158 END;
|
|
39160 (**)
|
|
39170 BEGIN
|
|
39180 REFL := NIL; ROWL := NIL; PROCL := NIL; PASCL := NIL; STRUCTL := NIL;
|
|
39190 MDVVAL(MDVINT , MDIDINT , SIMPLE, O , IO , O , SZINT);
|
|
39200 MDVVAL(MDVLINT , MDIDLINT , SIMPLE, UNDRESSED, IO , O , SZLONG);
|
|
39210 MDVVAL(MDVREAL , MDIDREAL , SIMPLE, O , IO , O , SZREAL);
|
|
39220 MDVVAL(MDVLREAL , MDIDLREAL , SIMPLE, UNDRESSED, IO , O , 2*SZREAL);
|
|
39230 MDVVAL(MDVCHAR , MDIDCHAR , SIMPLE, O , IO , O , SZWORD);
|
|
39240 MDVVAL(MDVBITS , MDIDBITS , SIMPLE, O , IO , O , SZINT);
|
|
39250 MDVVAL(MDVBYTES , MDIDBYTES , SIMPLE, O , IO ,O , SZINT);
|
|
39260 MDVVAL(MDVSTRNG , MDIDSTRNG , PILE , DRESSED , IO , O , SZADDR);
|
|
39270 MDVVAL(MDVBOOL , MDIDBOOL , SIMPLE, O , IO , O , SZWORD);
|
|
39280 MDVVAL(MDVCHAN , MDIDCHAN , SIMPLE, O , NOIO, O , SZPROC);
|
|
39290 MDVVAL(MDVCOVER , MDIDCOVER , PILE , DRESSED , NOIO, O , SZADDR);
|
|
39300 MDVVAL(MDVVOID , MDIDVOID , O , O , NOIO, O , 0);
|
|
39310 MDVVAL(MDVSKIP , MDIDSKIP , O , O , NOIO, O , 0);
|
|
39320 MDVVAL(MDVJUMP , MDIDJUMP , O , O , NOIO, O , 0);
|
|
39330 MDVVAL(MDVNIL , MDIDNIL , O , O , NOIO, O , 0);
|
|
39340 MDVVAL(MDVOUT , MDIDOUT , O , O , O , O , SZWORD+SZINT);
|
|
39350 MDVVAL(MDVIN , MDIDIN , O , O , O , SCOPE, 2*SZWORD+SZADDR);
|
|
39360 MDVVAL(MDVOUTB , MDIDOUTB , O , O , O , O , SZWORD+SZINT);
|
|
39370 MDVVAL(MDVINB , MDIDINB , O , O , O , SCOPE, SZWORD+SZADDR);
|
|
39380 MDVVAL(MDVNUMBER, MDIDNUMBER, O , O , O , O , SZWORD+SZINT);
|
|
39390 MDVVAL(MDVROWS , MDIDROWS , PILE , DRESSED , O , O , SZADDR);
|
|
39400 MDVVAL(MDVBNDS , MDIDBNDS , PILE , O , NOIO, O , SZADDR);
|
|
39410 MDVVAL(MDVABSENT, MDIDABSENT, SIMPLE, O , O , O , SZWORD);
|
|
39420 (*CAN BE USED TO MANUFACTURE UN-USER-FORGEABLE STRUCTURES*)
|
|
39430 MDVVAL(MDVERROR , MDIDERROR , SIMPLE, O , O , O , SZWORD);
|
|
39440 MDVVAL(MDVPROC , MDIDPROC , PILE , DRESSED , NOIO, SCOPE, SZADDR);
|
|
39450 MDVVAL(MDVREF , MDIDREF , PILE , DRESSED , NOIO, SCOPE, SZADDR);
|
|
39460 MDVVAL(MDVSTRUCT, MDIDSTRUCT, PILE , UNDRESSED, NOIO, SCOPE, 0);
|
|
39470 MDVVAL(MDVROW , MDIDROW , PILE , O , NOIO, SCOPE, 0);
|
|
39480 MDVVAL(MDVPASC , MDIDPASC , SIMPLE, O , NOIO, O , SZPROC);
|
|
39500 (*SET UP MD VALUES*)
|
|
39510 MDVAR(MDINT , MDVINT);
|
|
39520 MDVAR(MDLINT , MDVLINT);
|
|
39530 MDVAR(MDBITS , MDVBITS);
|
|
39540 MDVAR(MDBYTES , MDVBYTES);
|
|
39550 MDVAR(MDREAL , MDVREAL);
|
|
39560 MDVAR(MDLREAL , MDVLREAL);
|
|
39570 MDVAR(MDBOOL , MDVBOOL);
|
|
39580 MDVAR(MDCHAN , MDVCHAN);
|
|
39590 MDVAR(MDCHAR , MDVCHAR);
|
|
39600 MDVAR(MDSTRNG, MDVSTRNG);
|
|
39610 MDVAR(MDCOVER , MDVCOVER);
|
|
39620 MDVAR(MDVOID , MDVVOID);
|
|
39630 MDVAR(MDSKIP , MDVSKIP);
|
|
39640 MDVAR(MDJUMP , MDVJUMP);
|
|
39650 MDVAR(MDNIL , MDVNIL);
|
|
39660 MDVAR(MDOUT , MDVOUT);
|
|
39670 MDVAR(MDIN , MDVIN);
|
|
39680 MDVAR(MDOUTB , MDVOUTB);
|
|
39690 MDVAR(MDINB , MDVINB);
|
|
39700 MDVAR(MDNUMBER, MDVNUMBER);
|
|
39710 MDVAR(MDROWS , MDVROWS);
|
|
39720 MDVAR(MDBNDS , MDVBNDS);
|
|
39730 MDVAR(MDABSENT, MDVABSENT);
|
|
39740 MDVAR(MDROUT , MDVPROC);
|
|
39750 MDVAR(MDERROR , MDVERROR);
|
|
39760 INTAB(PLX,'GO ',LXEM);
|
|
39770 PLX^.LXV.LXPMD := MDJUMP;
|
|
39780 INTAB(PLX,'GOTO ',LXEM);
|
|
39790 PLX^.LXV.LXPMD := MDJUMP;
|
|
39800 INTAB(PLX,'IS ',LXEM);
|
|
39810 PLX^.LXV.LXP := 0;
|
|
39820 INTAB(PLX,'ISNT ',LXEM);
|
|
39830 PLX^.LXV.LXP := 1;
|
|
39840 INTAB(PLX,'NIL ',LXEM);
|
|
39850 PLX^.LXV.LXPMD := MDNIL;
|
|
39860 INTAB(PLX,'SKIP ',LXEM);
|
|
39870 PLX^.LXV.LXPMD := MDSKIP;
|
|
39880 INTAB(PLX,'VOID ',LXEM);
|
|
39890 PLX^.LXV.LXPMD := MDVOID;
|
|
39900 MDREFERROR := FINDREF(MDERROR);
|
|
39910 PRCBNDS := DEFPRC0(MDBNDS, PROC);
|
|
39920 PRCERROR := DEFPRC0(MDERROR, PROC);
|
|
39930 SRSEMP := -1; SRSUBP := 0; SUBSAVE;
|
|
39940 PUTFIELD(MDREAL, DEFTAG('RE '));
|
|
39950 PUTFIELD(MDREAL, DEFTAG('IM '));
|
|
39960 FINSTRUCT(2); MDCOMPL := SRSTK[SRSEMP].MD;
|
|
39970 (*MDLCOMPL OUGHT TO BE DONE ONE OF THESE DAYS, TOO*)
|
|
39980 MDFILE := NIL; (*BECAUSE IT IS TO BE A RECURSIVE MODE*)
|
|
39990 PRFB := DEFPRC1(FINDREF(MDFILE), MDBOOL, PROC);
|
|
40000 SRSEMP := -1; SRSUBP := 0; SUBSAVE;
|
|
40010 FOR I := 1 TO 4 DO
|
|
40020 PUTFIELD(PRFB, LEXALEPH);
|
|
40030 PUTFIELD(MDCOVER, LEXALEPH);
|
|
40040 FOR I := 1 TO SZTERM DIV SZINT DO
|
|
40050 PUTFIELD(MDINT, LEXALEPH);
|
|
40060 FINSTRUCT(5+SZTERM DIV SZINT); MDFILE := SRSTK[SRSEMP].MD;
|
|
40070 PRCVF := DEFPRC1(FINDREF(MDFILE), MDVOID, PROC);
|
|
40080 PASCVF := DEFPRC1(FINDREF(MDFILE), MDVOID, PASC);
|
|
40090 ROWBOOL := FINDROW(MDBOOL,1);
|
|
40100 ROWCHAR := FINDROW(MDCHAR,1);
|
|
40110 ROWIN := FINDROW(MDIN,1);
|
|
40120 ROWINB := FINDROW(MDINB,1);
|
|
40130 REFSTRNG := FINDREF(MDSTRNG);
|
|
40140 (*+54()
|
|
40150 SRSEMP := -1; SRSUBP := 0; SUBSAVE;
|
|
40160 PUTFIELD(MDINT, DEFTAG('ALEPH '));
|
|
40170 PUTFIELD(MDABSENT, LEXALEPH);
|
|
40180 FINSTRUCT(2); MDEXC := SRSTK[SRSEMP].MD;
|
|
40190 ()+54*)
|
|
40200 (*SET UP STANDARD-PRELUDE MODE-INDICATIONS*)
|
|
40210 LXVVAL(LX,LXIOPRDR,0,2,08);
|
|
40220 MDIND('INT ', MDINT);
|
|
40230 MDIND('BITS ', MDBITS);
|
|
40240 MDIND('BYTES ', MDBYTES);
|
|
40250 MDIND('REAL ', MDREAL);
|
|
40260 MDIND('BOOL ', MDBOOL);
|
|
40270 MDIND('CHANNEL ', MDCHAN);
|
|
40280 MDIND('CHAR ', MDCHAR);
|
|
40290 MDIND('STRING ', MDSTRNG);
|
|
40300 MDIND('FILE ', MDFILE);
|
|
40310 MDIND('COMPL ', MDCOMPL);
|
|
40320 (*+54() MDIND('EXCEPTION ', MDEXC); ()+54*)
|
|
40330 MODEID[MDIDINT]:=0;
|
|
40340 MODEID[MDIDLINT]:=1;
|
|
40350 MODEID[MDIDREAL]:=2;
|
|
40360 MODEID[MDIDLREAL]:=3;
|
|
40370 MODEID[MDIDCHAR]:=6;
|
|
40380 MODEID[MDIDBITS]:=9;
|
|
40390 MODEID[MDIDBYTES]:=10;
|
|
40400 MODEID[MDIDSTRNG]:=7;
|
|
40410 MODEID[MDIDBOOL]:=8;
|
|
40420 MODEID[MDIDCHAN]:=-1;
|
|
40430 MODEID[MDIDCOVER]:=-1;
|
|
40440 MODEID[MDIDVOID]:=-1;
|
|
40450 MODEID[MDIDSKIP]:=-1;
|
|
40460 MODEID[MDIDJUMP]:=-1;
|
|
40470 MODEID[MDIDNIL]:=-1;
|
|
40480 MODEID[MDIDOUT]:=-1;
|
|
40490 MODEID[MDIDIN]:=-1;
|
|
40500 MODEID[MDIDOUTB]:=-1;
|
|
40510 MODEID[MDIDINB]:=-1;
|
|
40520 MODEID[MDIDNUMBER]:=-1;
|
|
40530 MODEID[MDIDROWS]:=-1;
|
|
40540 MODEID[MDIDBNDS]:=-1;
|
|
40550 MODEID[MDIDABSENT]:=-1;
|
|
40560 MODEID[MDIDPROC]:=11;
|
|
40570 MODEID[MDIDREF]:=-1;
|
|
40580 MODEID[MDIDSTRUCT]:=12; (*BUT NOT COMPL*)
|
|
40590 MODEID[MDIDROW]:=13;
|
|
40600 MODEID[MDIDPASC]:=14;
|
|
40620 XMODES[XINT] := MDINT;
|
|
40630 XMODES[XLINT] := MDLINT;
|
|
40640 XMODES[XREAL] := MDREAL;
|
|
40650 XMODES[XLREAL] := MDLREAL;
|
|
40660 XMODES[XCOMPL] := MDCOMPL;
|
|
40670 (*+61()
|
|
40680 XMODES[XLCOMPL] := MDLCOMPL;
|
|
40690 ()+61*)
|
|
40700 XMODES[XCHAR] := MDCHAR;
|
|
40710 XMODES[XSTRNG] := MDSTRNG;
|
|
40720 XMODES[XBOOL] := MDBOOL;
|
|
40730 XMODES[XBITS] := MDBITS;
|
|
40740 XMODES[XBYTES] := MDBYTES;
|
|
40750 END;
|
|
40760 (**)
|
|
40770 ()+84*)
|
|
40780 (**)
|
|
40790 BEGIN (*INITIALIZE*)
|
|
40800 (*+81()
|
|
40810 INITLEXES;
|
|
40820 MAKEPUSHTBL;
|
|
40830 (**)
|
|
40840 OTPAIRS;
|
|
40850 FOR I := 0 TO HTSIZE DO
|
|
40860 HT[I] := NIL;
|
|
40870 INPRAGMENT := FALSE;
|
|
40880 ENEW(LEXALEPH, LEX1SIZE); WITH LEXALEPH^ DO
|
|
40890 BEGIN LXV:=LXVTAG; LXCOUNT:=0; LXTOKEN:=TKTAG END;
|
|
40900 BOLDWORDS;
|
|
40910 ()+81*)
|
|
40920 (*+84() INITMODES; ()+84*)
|
|
40930 (*+84()
|
|
40940 ENEW(LEXONE, SZADDR+SZINT+LEX1SIZE); WITH LEXONE^ DO
|
|
40950 BEGIN LXV:=LXVPRDEN; LXCOUNT:= (SZADDR+SZINT) DIV SZWORD; LXTOKEN:=TKDENOT; LXDENRP:=1; LXDENMD:=MDINT END;
|
|
40960 ()+84*)
|
|
40970 END;
|
|
40980 (**)
|
|
40990 ()+83*)
|