597 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			597 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
42000 (*  COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER  *)
 | 
						|
42010  (**)
 | 
						|
42020  (**)
 | 
						|
42030  (*+85()
 | 
						|
42040  (**)
 | 
						|
42050  PROCEDURE STANDARDPRELUDE;
 | 
						|
42060    FUNCTION DEFPRC0(YIELD: MODE; CP: CODEPROC): MODE;
 | 
						|
42070        BEGIN SRSEMP := -1; SRSUBP := 0; SUBSAVE;
 | 
						|
42080        FINDPRC(YIELD,0,CP); DEFPRC0 := SRSTK[SRSEMP].MD
 | 
						|
42090        END;
 | 
						|
42100    FUNCTION DEFPRC1(P1, YIELD: MODE; CP: CODEPROC): MODE;
 | 
						|
42110        BEGIN SRSEMP := -1; SRSUBP := 0; SUBSAVE;
 | 
						|
42120        SRSEMP := SRSEMP+1; SRSTK[SRSEMP].MD := P1;
 | 
						|
42130        FINDPRC(YIELD,1,CP); DEFPRC1 := SRSTK[SRSEMP].MD
 | 
						|
42140        END;
 | 
						|
42150    FUNCTION DEFPRC2(P1, P2, YIELD: MODE; CP: CODEPROC): MODE;
 | 
						|
42160        BEGIN SRSEMP := -1; SRSUBP := 0; SUBSAVE;
 | 
						|
42170        SRSEMP := SRSEMP+1; SRSTK[SRSEMP].MD := P1;
 | 
						|
42180        SRSEMP := SRSEMP+1; SRSTK[SRSEMP].MD := P2;
 | 
						|
42190        FINDPRC(YIELD,2,CP); DEFPRC2 := SRSTK[SRSEMP].MD
 | 
						|
42200        END;
 | 
						|
42210    PROCEDURE INTAB(VAR LEX: PLEX; TAG: ALFA; LXVV: LXM);
 | 
						|
42220     VAR I:  INTEGER;
 | 
						|
42230        BEGIN WITH CURRENTLEX DO
 | 
						|
42240            BEGIN
 | 
						|
42250            LXV := LXVV;  LXTOKEN := TKBOLD;
 | 
						|
42260  (*+11()  S10:=TAG; LXCOUNT:=1;   ()+11*)
 | 
						|
42270  (*-11() STASHLEX(TAG); ()-11*)
 | 
						|
42280            END;
 | 
						|
42290        LEX := HASHIN
 | 
						|
42300        END;
 | 
						|
42310    FUNCTION DEFTAG(TAG: ALFA): PLEX;
 | 
						|
42320    VAR I: INTEGER;
 | 
						|
42330        BEGIN WITH CURRENTLEX DO
 | 
						|
42340          BEGIN
 | 
						|
42350          LXV := LXVTAG;  LXTOKEN := TKTAG;
 | 
						|
42360  (*+11()  S10:=TAG; LXCOUNT:=1;   ()+11*)
 | 
						|
42370  (*-11()  STASHLEX(TAG); ()-11*)
 | 
						|
42380          END;
 | 
						|
42390        DEFTAG := HASHIN
 | 
						|
42400        END;
 | 
						|
42410    FUNCTION DEFLTAG(TAG1, TAG2: ALFA): PLEX;
 | 
						|
42420      VAR I: INTEGER;
 | 
						|
42430        BEGIN WITH CURRENTLEX DO
 | 
						|
42440          BEGIN
 | 
						|
42450          LXV := LXVTAG; LXTOKEN := TKTAG;
 | 
						|
42460  (*+11() S20 := TAG2; S10 := TAG1; LXCOUNT := 2;   ()+11*)
 | 
						|
42470  (*-11() STASHLLEX(TAG1, TAG2); ()-11*)
 | 
						|
42480          DEFLTAG := HASHIN
 | 
						|
42490          END
 | 
						|
42500        END;
 | 
						|
42510    FUNCTION GETSTB(LEX: PLEX; DEF: DEFTYP; BLK: BLKTYP): PSTB;
 | 
						|
42520    (*FUNCTION: CREATE A NEW STBLOCK FOR LEX*)
 | 
						|
42530      VAR STB: PSTB;
 | 
						|
42540        BEGIN
 | 
						|
42550        NEW(STB); WITH STB^, LEX^.LXV DO
 | 
						|
42560          BEGIN
 | 
						|
42570          STLINK := LXPSTB; LXPSTB := STB;
 | 
						|
42580          STLEX := LEX;
 | 
						|
42590          STTHREAD := DCIL; DCIL := STB;
 | 
						|
42600          STDEFTYP := DEF; STBLKTYP := BLK;
 | 
						|
42610          STRANGE := 0;
 | 
						|
42620          STLEVEL := 0; STLOCRG := 0;
 | 
						|
42630          GETSTB := STB
 | 
						|
42640          END
 | 
						|
42650        END;
 | 
						|
42660  (**)
 | 
						|
42670  (**)
 | 
						|
42680    PROCEDURE INITSTDIDS;
 | 
						|
42690    (*CREATE STBLOCKS FOR STANDARD-PRELUDE IDENTIFIERS*)
 | 
						|
42700      VAR PRCRR,PRCON, REFFILE: MODE;
 | 
						|
42710      PROCEDURE DEFSTID(MD: MODE; LX: PLEX);
 | 
						|
42720        VAR STB: PSTB; THIS:MODE; LENGTH:INTEGER;
 | 
						|
42722 (*+05()    LEX: PLEX; I: INTEGER; ()+05*)
 | 
						|
42730          BEGIN STB := GETSTB(LX, [STVAR], STBDEFID);
 | 
						|
42740          WITH STB^ DO
 | 
						|
42750            BEGIN STMODE := MD;
 | 
						|
42760            IF NOT(STMODE^.MDV.MDID IN [MDIDCHAN,MDIDPASC]) THEN
 | 
						|
42762              BEGIN
 | 
						|
42764              THIS:=MD;
 | 
						|
42766              IF THIS^.MDV.MDID=MDIDREF THEN THIS:=THIS^.MDPRRMD;
 | 
						|
42767              IF THIS^.MDV.MDPILE THEN LENGTH:=SZADDR
 | 
						|
42768              ELSE LENGTH:=THIS^.MDV.MDLEN;
 | 
						|
42770  (*-41()     STOFFSET := CURID; CURID := CURID+LENGTH ()-41*)
 | 
						|
42780  (*+41()     CURID := CURID+LENGTH; STOFFSET := CURID ()+41*)
 | 
						|
42782              IF MD^.MDV.MDID<>MDIDREF THEN STDEFTYP := [STINIT];
 | 
						|
42785              END
 | 
						|
42790            ELSE
 | 
						|
42800 (*-05()      BEGIN STVALUE := LX; STDEFTYP := [STCONST] END; ()-05*)
 | 
						|
42801 (*+05()      BEGIN
 | 
						|
42802              ENEW(LEX, LEX1SIZE + LX^.LXCOUNT*SZWORD);
 | 
						|
42803              FOR I := 1 TO LEX1SIZE DIV SZWORD + LX^.LXCOUNT DO
 | 
						|
42804                LEX^.LEXWORDS[I] := LX^.LEXWORDS[I];
 | 
						|
42805              STVALUE := LEX;
 | 
						|
42806              STDEFTYP := [STCONST];
 | 
						|
42807              END;
 | 
						|
42808 ()+05*)
 | 
						|
42810            END
 | 
						|
42820          END;
 | 
						|
42830      PROCEDURE DEFSTID1(TAG: ALFA; MD: MODE);
 | 
						|
42840          BEGIN DEFSTID(MD, DEFTAG(TAG)) END;
 | 
						|
42850      PROCEDURE DEFSTID2(TAG1, TAG2: ALFA; MD: MODE);
 | 
						|
42860          BEGIN DEFSTID(MD, DEFLTAG(TAG1, TAG2)) END;
 | 
						|
42870      PROCEDURE DEFCONST(TAG: ALFA; MD: MODE; VALUE: A68INT);
 | 
						|
42880        VAR STB: PSTB;
 | 
						|
42890            LX: PLEX;
 | 
						|
42900          BEGIN STB := GETSTB(DEFTAG(TAG), [STCONST], STBDEFID);
 | 
						|
42910          WITH STB^ DO
 | 
						|
42920            BEGIN
 | 
						|
42930            STMODE := MD;
 | 
						|
42940            ENEW(LX, SZADDR+SZINT+LEX1SIZE); WITH LX^ DO
 | 
						|
42950              BEGIN LXV := LXVPRDEN; LXCOUNT := (SZADDR+SZINT) DIV SZWORD;
 | 
						|
42960              LXTOKEN := TKDENOT; LXDENRP := VALUE; LXDENMD := MD END;
 | 
						|
42970            STVALUE := LX
 | 
						|
42980            END
 | 
						|
42990          END;
 | 
						|
43000      PROCEDURE DEFREAL(TAG:ALFA;MD:MODE;VALUE1(*-01(), VALUE2(*+03(), VALUE3()+03*)()-01*): INTEGER);
 | 
						|
43010        VAR STB:PSTB;
 | 
						|
43020          LX:PLEX;
 | 
						|
43021          TEMP: RECORD CASE SEVERAL OF
 | 
						|
43022            1: (REA: REAL);
 | 
						|
43023            2: (INT1: INTEGER;
 | 
						|
43024 (*-01()        INT2: INTEGER;
 | 
						|
43025 (*+03()        INT3: INTEGER; ()+03*)
 | 
						|
43026 ()-01*)       ) ;
 | 
						|
43027            3,4,5,6,7,8,9,10: ();
 | 
						|
43028            END;
 | 
						|
43030        BEGIN
 | 
						|
43040        STB:=GETSTB(DEFTAG(TAG),[STCONST],STBDEFID);
 | 
						|
43050        WITH STB^ DO
 | 
						|
43060          BEGIN
 | 
						|
43070          STMODE:=MD;
 | 
						|
43080          ENEW(LX,SZADDR+SZREAL+LEX1SIZE);
 | 
						|
43090          WITH LX^ DO
 | 
						|
43100            BEGIN
 | 
						|
43110            LXV:=LXVPRDEN; LXCOUNT:=(SZADDR+SZREAL) DIV SZWORD; LXTOKEN:=TKDENOT;
 | 
						|
43112            TEMP.INT1 := VALUE1;
 | 
						|
43114 (*-01()    TEMP.INT2 := VALUE2;
 | 
						|
43116 (*+03()    TEMP.INT3 := VALUE3; ()+03*)
 | 
						|
43118 ()-01*)
 | 
						|
43120            LXDENRPREAL := TEMP.REA; LXDENMD:=MD
 | 
						|
43130            END;
 | 
						|
43140          STVALUE:=LX
 | 
						|
43150          END
 | 
						|
43160        END;
 | 
						|
43170        BEGIN
 | 
						|
43180  (**)
 | 
						|
43190        DEFCONST('MAXINT    ', MDINT, MAXINT);
 | 
						|
43200  (*+01()
 | 
						|
43210        DEFREAL('MAXREAL   ', MDREAL, 37767777777777777777B);
 | 
						|
43220        DEFREAL('SMALLREAL ', MDREAL, 16414000000000000000B);
 | 
						|
43222        DEFREAL('PI        ', MDREAL, 17216220773250420551B);
 | 
						|
43230  ()+01*)
 | 
						|
43240  (*+05()
 | 
						|
43250        DEFREAL('MAXREAL   ', MDREAL, 2147483647, -1);
 | 
						|
43260        DEFREAL('SMALLREAL ', MDREAL, 1017118720, 0);
 | 
						|
43270        DEFREAL('PI        ', MDREAL, 1074340347, 1413754136);
 | 
						|
43280  ()+05*)
 | 
						|
43290        DEFCONST('MAXABSCHAR', MDINT, MAXABSCHAR);
 | 
						|
43300        DEFSTID1('BITSPACK  ', DEFPRC1(FINDROW(MDBOOL,1),MDBITS, PASC));
 | 
						|
43310        DEFSTID1('BYTESPACK ', DEFPRC1(MDSTRNG,MDBYTES, PASC));
 | 
						|
43407        PRCRR := DEFPRC1(MDREAL,MDREAL, PASC);
 | 
						|
43410        DEFSTID1('SQRT      ', PRCRR);
 | 
						|
43420        DEFSTID1('EXP       ', PRCRR);
 | 
						|
43430        DEFSTID1('LN        ', PRCRR);
 | 
						|
43440        DEFSTID1('COS       ', PRCRR);
 | 
						|
43450        DEFSTID1('ARCCOS    ', PRCRR);
 | 
						|
43460        DEFSTID1('SIN       ', PRCRR);
 | 
						|
43470        DEFSTID1('ARCSIN    ', PRCRR);
 | 
						|
43480        DEFSTID1('TAN       ', PRCRR);
 | 
						|
43490        DEFSTID1('ARCTAN    ', PRCRR);
 | 
						|
43500        DEFSTID1('NEXTRANDOM', DEFPRC1(FINDREF(MDINT),MDREAL, PASC));
 | 
						|
43510        DEFSTID2('STANDINCHA','NNEL      ', MDCHAN);
 | 
						|
43520        DEFSTID2('STANDOUTCH','ANNEL     ', MDCHAN);
 | 
						|
43530        DEFSTID2('STANDBACKC','HANNEL    ', MDCHAN);
 | 
						|
43540        REFFILE := FINDREF(MDFILE);
 | 
						|
43550        DEFSTID1('CHAN      ', DEFPRC1(REFFILE,MDCHAN, PASC));
 | 
						|
43560        DEFSTID1('MAKETERM  ', DEFPRC2(REFFILE,MDSTRNG,MDVOID, PASC));
 | 
						|
43570        PRCON := DEFPRC2(REFFILE,DEFPRC1(REFFILE,MDBOOL,PROC),MDVOID,PASC);
 | 
						|
43580        DEFSTID2('ONLOGICALF','ILEEND    ', PRCON);
 | 
						|
43590        DEFSTID2('ONPHYSICAL','FILEEND   ', PRCON);
 | 
						|
43600        DEFSTID1('ONPAGEEND ', PRCON);
 | 
						|
43610        DEFSTID1('ONLINEEND ', PRCON);
 | 
						|
43620          SRSEMP := -1; SRSUBP := 0; SUBSAVE; SRSEMP := SRSEMP+6;
 | 
						|
43630          SRSTK[SRSEMP-5].MD := REFFILE; SRSTK[SRSEMP-4].MD := MDSTRNG;
 | 
						|
43640          SRSTK[SRSEMP-3].MD := MDCHAN; SRSTK[SRSEMP-2].MD := MDINT;
 | 
						|
43650          SRSTK[SRSEMP-1].MD := MDINT; SRSTK[SRSEMP].MD := MDINT;
 | 
						|
43660          FINDPRC(MDINT,6,PASC);
 | 
						|
43670        DEFSTID1('ESTABLISH ', SRSTK[SRSEMP].MD);
 | 
						|
43680          SRSEMP := -1; SRSUBP := 0; SUBSAVE; SRSEMP := SRSEMP+3;
 | 
						|
43690          SRSTK[SRSEMP-2].MD := REFFILE; SRSTK[SRSEMP-1].MD := MDSTRNG;
 | 
						|
43700          SRSTK[SRSEMP].MD := MDCHAN;
 | 
						|
43710          FINDPRC(MDINT,3,PASC);
 | 
						|
43720        DEFSTID1('OPEN      ', SRSTK[SRSEMP].MD);
 | 
						|
43730        DEFSTID1('ASSOCIATE ', DEFPRC2(REFFILE,FINDREF(FINDROW(MDCHAR,1)),MDVOID, PASC));
 | 
						|
43740        DEFSTID1('CLOSE     ', PASCVF);
 | 
						|
43750        DEFSTID1('CHARNUMBER', DEFPRC1(REFFILE,MDINT, PASC));
 | 
						|
43760        DEFSTID1('LINENUMBER', DEFPRC1(REFFILE,MDINT, PASC));
 | 
						|
43770        DEFSTID1('PAGENUMBER', DEFPRC1(REFFILE,MDINT, PASC));
 | 
						|
43780        DEFSTID1('SPACE     ', PASCVF);
 | 
						|
43790        DEFSTID1('NEWLINE   ', PASCVF);
 | 
						|
43800        DEFSTID1('NEWPAGE   ', PASCVF);
 | 
						|
43810          SRSEMP := -1; SRSUBP := 0; SUBSAVE; SRSEMP := SRSEMP+4;
 | 
						|
43820          SRSTK[SRSEMP-3].MD := REFFILE; SRSTK[SRSEMP-2].MD := MDINT;
 | 
						|
43830          SRSTK[SRSEMP-1].MD := MDINT; SRSTK[SRSEMP].MD := MDINT;
 | 
						|
43840          FINDPRC(MDVOID,4,PASC);
 | 
						|
43850        DEFSTID1('SET       ', SRSTK[SRSEMP].MD);
 | 
						|
43860        DEFSTID1('RESET     ', PASCVF);
 | 
						|
43870        DEFSTID1('WHOLE     ', DEFPRC2(MDNUMBER,MDINT,MDSTRNG, PASC));
 | 
						|
43880          SRSEMP := -1; SRSUBP := 0; SUBSAVE; SRSEMP := SRSEMP+3;
 | 
						|
43890          SRSTK[SRSEMP-2].MD := MDNUMBER; SRSTK[SRSEMP-1].MD := MDINT;
 | 
						|
43900          SRSTK[SRSEMP].MD := MDINT;
 | 
						|
43910          FINDPRC(MDSTRNG,3,PASC);
 | 
						|
43920        DEFSTID1('FIXED     ', SRSTK[SRSEMP].MD);
 | 
						|
43930          SRSEMP := -1; SRSUBP := 0; SUBSAVE; SRSEMP := SRSEMP+4;
 | 
						|
43940          SRSTK[SRSEMP-3].MD := MDNUMBER; SRSTK[SRSEMP-2].MD := MDINT;
 | 
						|
43950          SRSTK[SRSEMP-1].MD := MDINT; SRSTK[SRSEMP].MD := MDINT;
 | 
						|
43960          FINDPRC(MDSTRNG,4,PASC);
 | 
						|
43970        DEFSTID1('FLOAT     ', SRSTK[SRSEMP].MD);
 | 
						|
43980        DEFSTID1('PUT       ', DEFPRC2(REFFILE,FINDROW(MDOUT,1),MDVOID, PASC));
 | 
						|
43990        DEFSTID1('GET       ', DEFPRC2(REFFILE,FINDROW(MDIN,1),MDVOID, PASC));
 | 
						|
44000        DEFSTID1('PUTBIN    ', DEFPRC2(REFFILE,FINDROW(MDOUTB,1),MDVOID, PASC));
 | 
						|
44010        DEFSTID1('GETBIN    ', DEFPRC2(REFFILE,FINDROW(MDINB,1),MDVOID, PASC));
 | 
						|
44020        DEFSTID1('LASTRANDOM', FINDREF(MDINT));
 | 
						|
44030        DEFSTID1('RANDOM    ', DEFPRC0(MDREAL, PASC));
 | 
						|
44040        DEFSTID1('STANDIN   ', REFFILE);
 | 
						|
44050        DEFSTID1('STANDOUT  ', REFFILE);
 | 
						|
44060        DEFSTID1('STANDBACK ', REFFILE);
 | 
						|
44070        DEFSTID1('PRINT     ', DEFPRC1(FINDROW(MDOUT,1),MDVOID, PASC));
 | 
						|
44080        DEFSTID1('WRITE     ', DEFPRC1(FINDROW(MDOUT,1),MDVOID, PASC));
 | 
						|
44090        DEFSTID1('READ      ', DEFPRC1(FINDROW(MDIN,1),MDVOID, PASC));
 | 
						|
44100        DEFSTID1('WRITEBIN  ', DEFPRC1(FINDROW(MDOUTB,1),MDVOID, PASC));
 | 
						|
44110        DEFSTID1('READBIN   ', DEFPRC1(FINDROW(MDINB,1),MDVOID,PASC));
 | 
						|
44120        LEXLSTOP := DEFTAG('STOP      ');
 | 
						|
44121  (*-01() (*-05()
 | 
						|
44122        DEFSTID1('MAXREAL   ', MDREAL);
 | 
						|
44124        DEFSTID1('SMALLREAL ', MDREAL);
 | 
						|
44126        DEFSTID1('PI        ', MDREAL);
 | 
						|
44128  ()-05*) ()-01*)
 | 
						|
44130  (*+54()
 | 
						|
44140        DEFSTID1('ONERROR   ', DEFPRC1(DEFPRC1(MDEXC,MDVOID,PROC),MDVOID,PASC));
 | 
						|
44150        DEFSTID2('MAKEXCEPTI','ON        ', DEFPRC1(MDINT,MDEXC,PASC));
 | 
						|
44160        DEFSTID1('ERROR     ', DEFPRC1(MDINT,MDVOID,PASC));
 | 
						|
44170        DEFSTID1('OFFERROR  ', DEFPRC0(MDVOID,PASC));
 | 
						|
44180  ()+54*)
 | 
						|
44190  (**)
 | 
						|
44200  (**)
 | 
						|
44210  (**)
 | 
						|
44220        END;
 | 
						|
44230  (**)
 | 
						|
44240  (**)
 | 
						|
44250    PROCEDURE INITOPS;
 | 
						|
44260      VAR OBABS, OBAND, OBARG, OBBIN, OBCONJ, OBDIV, OBDVAB, OBELEM, OBENTI, OBEQ,
 | 
						|
44270          OBGE, OBGT, OBLE, OBLENG, OBLT, OBLWB, OBMDAB, OBMNAB, OBMINUS, OBMOD, OBNE, OBNOT,
 | 
						|
44280          OBODD, OBOR, OBOVAB, OBOVER, OBPLAB, OBPLTO, OBPLITM, OBPLUS, OBREPR, OBROUN, OBSHL,
 | 
						|
44290          OBSHR, OBSHRT, OBSIGN, OBTIMES, OBTMAB, OBUP, OBUPB, OBRE, OBIM: INTEGER;
 | 
						|
44300          CURROB, THISOB, PREVOB: INTEGER;
 | 
						|
44310      PROCEDURE NOB(VAR OB: INTEGER);
 | 
						|
44320          BEGIN OB := CURROB; THISOB := OB END;
 | 
						|
44330      PROCEDURE OPTAB(IDNDX: OPIDNDXTYP; OPCOD: POP; MIN,MAX: XTYPE; RESMD: MODE);
 | 
						|
44340          BEGIN
 | 
						|
44350          IF THISOB=PREVOB THEN OPTABL[CURROB-1].OPMORE := TRUE;
 | 
						|
44360          PREVOB := THISOB;
 | 
						|
44370          WITH OPTABL[CURROB] DO
 | 
						|
44380            BEGIN OPIDNDX := IDNDX; OPOPCOD := OPCOD; OPMIN := MIN; OPMAX := MAX;
 | 
						|
44390            OPMODE := RESMD; OPMORE := FALSE END;
 | 
						|
44400          CURROB := CURROB+1
 | 
						|
44410          END;
 | 
						|
44420      PROCEDURE DEFSTOP(LX: PLEX; PRIO: INTEGER; OB: INTEGER);
 | 
						|
44430        VAR STB: PSTB;
 | 
						|
44440          BEGIN STB := GETSTB(LX, [], STBDEFPRIO); WITH STB^ DO
 | 
						|
44450            BEGIN STDYPRIO := PRIO; STUSERLEX := NIL; STSTDOP := OB END
 | 
						|
44460          END;
 | 
						|
44470      PROCEDURE DEFSTOP1(TAB: ALFA; PRIO: INTEGER; OB: INTEGER);
 | 
						|
44480        VAR LX: PLEX;
 | 
						|
44490          BEGIN INTAB(LX, TAB, LXVOPR); DEFSTOP(LX, PRIO, OB) END;
 | 
						|
44500      PROCEDURE DEFSTOP2(PUNCT: ALFA; PRIO: INTEGER; OB: INTEGER);
 | 
						|
44510        VAR S, I: INTEGER;
 | 
						|
44520            CHA: CHAR;
 | 
						|
44530            LEX: PLEX;
 | 
						|
44540        PROCEDURE NEXTCH; BEGIN CHA := PUNCT[I]; I := I+1 END;
 | 
						|
44550          BEGIN
 | 
						|
44560          I := 1; NEXTCH;
 | 
						|
44570  (*+01()     IF CHA=':' THEN S := ORD('$')-ORD('+') ELSE S := ORD(CHA)-ORD('+');   ()+01*)
 | 
						|
44580  (*+25()     IF CHA=':' THEN S := ORD('$')-ORD('+') ELSE S := ORD(CHA)-ORD('+');   ()+25*)
 | 
						|
44590  (*-01() (*-25()  S := ORD(CHA)-ORD('!'); (*ASCII VERSION*)
 | 
						|
44592         IF CHA='%' THEN S := 23
 | 
						|
44600         ELSE IF CHA IN ['[', ']', '^','\'] THEN S := S-55;  ()-25*)  ()-01*)
 | 
						|
44610              NEXTCH;
 | 
						|
44620              WITH OPCHTABLE[S] DO
 | 
						|
44630                BEGIN
 | 
						|
44640                LEX := OTLEX;
 | 
						|
44650                S := OTNEXT
 | 
						|
44660                END;
 | 
						|
44670              WHILE S<>0 DO
 | 
						|
44680                WITH OPCHTABLE[S] DO
 | 
						|
44690                  IF CHA=OTCHAR THEN
 | 
						|
44700                    BEGIN
 | 
						|
44710                    NEXTCH;
 | 
						|
44720                    LEX := OTLEX;
 | 
						|
44730                    S := OTNEXT
 | 
						|
44740                    END
 | 
						|
44750                  ELSE S := OTALT;
 | 
						|
44760          DEFSTOP(LEX, PRIO, OB)
 | 
						|
44770          END;
 | 
						|
44780        BEGIN
 | 
						|
44790        CURROB := 1; PREVOB := 0;
 | 
						|
44800  (**)
 | 
						|
44810        NOB(OBABS);
 | 
						|
44820          OPTAB(IDMON , PABSI   , XINT,XLREAL   , MDABSENT);
 | 
						|
44830          OPTAB(IDMONL, PABSI-4 , XCOMPL,XLCOMPL, MDREAL);
 | 
						|
44840          OPTAB(IDMON , PABSB   , XBOOL,XBITS   , MDINT);
 | 
						|
44850          OPTAB(IDMON , PABSCH  , XCHAR,XCHAR  , MDINT);
 | 
						|
44860        NOB(OBAND);
 | 
						|
44870          OPTAB(IDBB  , PANDB   , XBOOL,XBITS  , MDABSENT);
 | 
						|
44880        NOB(OBARG);
 | 
						|
44890          OPTAB(IDMONL, PARG    , XCOMPL,XLCOMPL, MDREAL);
 | 
						|
44900        NOB(OBBIN);
 | 
						|
44910          OPTAB(IDMON , PBIN    , XINT,XINT      , MDBITS);
 | 
						|
44920        NOB(OBCONJ);
 | 
						|
44930          OPTAB(IDMON , PCONJ   , XCOMPL,XLCOMPL, MDABSENT);
 | 
						|
44940        NOB(OBDIV);
 | 
						|
44950          OPTAB(IDAAL , PDIV    , XINT,XLINT    , MDREAL);
 | 
						|
44960          OPTAB(IDAA  , PDIV    , XINT,XLCOMPL  , MDABSENT);
 | 
						|
44970        NOB(OBDVAB);
 | 
						|
44980          OPTAB(IDRA  , PDIVAB  , XREAL,XLCOMPL , MDABSENT);
 | 
						|
44990        NOB(OBELEM);
 | 
						|
45000          OPTAB(IDIB  , PELMBT  , XBITS,XBITS   , MDBOOL);
 | 
						|
45010          OPTAB(IDIB  , PELMBY  , XBYTES,XBYTES , MDCHAR);
 | 
						|
45020        NOB(OBENTI);
 | 
						|
45030          OPTAB(IDMONL, PENTI   , XREAL,XLREAL  , MDINT);
 | 
						|
45040        NOB(OBEQ);
 | 
						|
45050          OPTAB(IDAA  , PEQ     , XINT,XLCOMPL  , MDBOOL);
 | 
						|
45060          OPTAB(IDAA  , PEQCS   , XCHAR,XSTRNG , MDBOOL);
 | 
						|
45070          OPTAB(IDBB  , PEQB    , XBOOL,XBYTES  , MDBOOL);
 | 
						|
45080        NOB(OBGE);
 | 
						|
45090          OPTAB(IDAA  , PGE     , XINT,XLREAL   , MDBOOL);
 | 
						|
45100          OPTAB(IDAA  , PGECS   , XCHAR,XSTRNG , MDBOOL);
 | 
						|
45110          OPTAB(IDBB  , PGEBT   , XBITS,XBYTES  , MDBOOL);
 | 
						|
45120        NOB(OBGT);
 | 
						|
45130          OPTAB(IDAA  , PGT     , XINT,XLREAL   , MDBOOL);
 | 
						|
45140          OPTAB(IDAA  , PGTCS   , XCHAR,XSTRNG , MDBOOL);
 | 
						|
45150          OPTAB(IDBB  , PGTBY   , XBYTES,XBYTES , MDBOOL);
 | 
						|
45160        NOB(OBIM);
 | 
						|
45170          OPTAB(IDMONL, PIM     , XCOMPL,XLCOMPL,MDREAL);
 | 
						|
45180        NOB(OBLE);
 | 
						|
45190          OPTAB(IDAA  , PLE     , XINT,XLREAL   , MDBOOL);
 | 
						|
45200          OPTAB(IDAA  , PLECS   , XCHAR,XSTRNG , MDBOOL);
 | 
						|
45210          OPTAB(IDBB  , PLEBT   , XBITS,XBYTES  , MDBOOL);
 | 
						|
45220  (*+61()
 | 
						|
45230        NOB(OBLENG);
 | 
						|
45240          OPTAB(IDMON , PLENGI  , XINT,XINT     , MDLINT);
 | 
						|
45250          OPTAB(IDMON , PLENGR  , XREAL,XREAL   , MDLREAL);
 | 
						|
45260          OPTAB(IDMON , PLENGC  , XCOMPL,XCOMPL , MDLCOMPL);
 | 
						|
45270  ()+61*)
 | 
						|
45280        NOB(OBLT);
 | 
						|
45290          OPTAB(IDAA  , PLT     , XINT,XLREAL   , MDBOOL);
 | 
						|
45300          OPTAB(IDAA  , PLTCS   , XCHAR,XSTRNG , MDBOOL);
 | 
						|
45310          OPTAB(IDBB  , PLTBY   , XBYTES,XBYTES , MDBOOL);
 | 
						|
45320        NOB(OBLWB);
 | 
						|
45330          OPTAB(IDIBRM, PLWBM   , -1,-1         , MDINT);
 | 
						|
45340          OPTAB(IDIBR , PLWB    , XINT,XINT     , MDINT);
 | 
						|
45350          OPTAB(IDMON , PLWBMSTR, XSTRNG,XSTRNG, MDINT);
 | 
						|
45360        NOB(OBMDAB);
 | 
						|
45370          OPTAB(IDRA  , PMODAB  , XINT,XLINT    , MDABSENT);
 | 
						|
45380        NOB(OBMNAB);
 | 
						|
45390          OPTAB(IDRA  , PMINUSAB, XINT,XLCOMPL , MDABSENT);
 | 
						|
45400        NOB(OBMINUS);
 | 
						|
45410          OPTAB(IDAA  , PSUB    , XINT,XLCOMPL , MDABSENT);
 | 
						|
45420          OPTAB(IDMON , PNEGI   , XINT,XLCOMPL , MDABSENT);
 | 
						|
45430        NOB(OBMOD);
 | 
						|
45440          OPTAB(IDAAL , PMOD    , XINT,XLINT   , MDINT);
 | 
						|
45450        NOB(OBNE);
 | 
						|
45460          OPTAB(IDAA  , PNE     , XINT,XLCOMPL , MDBOOL);
 | 
						|
45470          OPTAB(IDAA  , PNECS   , XCHAR,XSTRNG , MDBOOL);
 | 
						|
45480          OPTAB(IDBB  , PNEB    , XBOOL,XBYTES , MDBOOL);
 | 
						|
45490        NOB(OBNOT);
 | 
						|
45500          OPTAB(IDMON , PNOTB   , XBOOL,XBITS  , MDABSENT);
 | 
						|
45510        NOB(OBODD);
 | 
						|
45520          OPTAB(IDMON , PODD    , XINT,XLINT   , MDBOOL);
 | 
						|
45530        NOB(OBOR);
 | 
						|
45540          OPTAB(IDBB  , PORB    , XBOOL,XBITS   , MDABSENT);
 | 
						|
45550        NOB(OBOVAB);
 | 
						|
45560          OPTAB(IDRA  , POVERAB , XINT,XLINT   , MDABSENT);
 | 
						|
45570        NOB(OBOVER);
 | 
						|
45580          OPTAB(IDAAL , POVER   , XINT,XLINT   , MDINT);
 | 
						|
45590        NOB(OBPLAB);
 | 
						|
45600          OPTAB(IDRA  , PPLSAB , XINT,XLCOMPL , MDABSENT);
 | 
						|
45610          OPTAB(IDSC  , PPLSABS,XCHAR,XSTRNG, REFSTRNG);
 | 
						|
45620        NOB(OBPLITM);
 | 
						|
45630          OPTAB(IDAAL , PPLITM+2, XINT,XLREAL   , MDCOMPL);
 | 
						|
45640                    (*BECAUSE THERE ARE NO POPS FOR XINT AND XLINT*)
 | 
						|
45650        NOB(OBPLTO);
 | 
						|
45660          OPTAB(IDCS  , PPLSTOCS,XCHAR,XSTRNG, REFSTRNG);
 | 
						|
45670        NOB(OBPLUS);
 | 
						|
45680          OPTAB(IDAA  , PADD    , XINT,XLCOMPL , MDABSENT);
 | 
						|
45690          OPTAB(IDAA  , PCAT    , XCHAR,XSTRNG, MDSTRNG);
 | 
						|
45700          OPTAB(IDMON , PNOOP   , XINT,XLCOMPL , MDABSENT);
 | 
						|
45710        NOB(OBRE);
 | 
						|
45720          OPTAB(IDMONL, PRE     , XCOMPL,XLCOMPL,MDREAL);
 | 
						|
45730        NOB(OBREPR);
 | 
						|
45740          OPTAB(IDMON , PREPR   , XINT,XINT    , MDCHAR);
 | 
						|
45750        NOB(OBROUN);
 | 
						|
45760          OPTAB(IDMONL, PROUN   , XREAL,XLREAL , MDINT);
 | 
						|
45770        NOB(OBSHL);
 | 
						|
45780          OPTAB(IDBI  , PSHL    , XBITS,XBITS  , MDABSENT);
 | 
						|
45790        NOB(OBSHR);
 | 
						|
45800          OPTAB(IDBI  , PSHR    , XBITS,XBITS  , MDABSENT);
 | 
						|
45810  (*+61()
 | 
						|
45820        NOB(OBSHRT);
 | 
						|
45830          OPTAB(IDMON , PSHRTI  , XLINT,XLINT , MDINT);
 | 
						|
45840          OPTAB(IDMON , PSHRTR  , XLREAL,XLREAL, MDREAL);
 | 
						|
45850          OPTAB(IDMON , PSHRTC  , XLCOMPL,XLCOMPL, MDCOMPL);
 | 
						|
45860  ()+61*)
 | 
						|
45870        NOB(OBSIGN);
 | 
						|
45880          OPTAB(IDMON , PSGNI   , XINT,XLREAL   , MDINT);
 | 
						|
45890        NOB(OBTIMES);
 | 
						|
45900          OPTAB(IDAA  , PMUL    , XINT,XLCOMPL , MDABSENT);
 | 
						|
45910          OPTAB(IDIB  , PMULIC  , XCHAR,XSTRNG, MDSTRNG);
 | 
						|
45920          OPTAB(IDBI  , PMULCI  , XCHAR,XSTRNG, MDSTRNG);
 | 
						|
45930        NOB(OBTMAB);
 | 
						|
45940          OPTAB(IDRA  , PTIMSAB, XINT,XLCOMPL , MDABSENT);
 | 
						|
45950          OPTAB(IDSI  , PTIMSABS,XSTRNG,XSTRNG,REFSTRNG);
 | 
						|
45960        NOB(OBUP);
 | 
						|
45970          OPTAB(IDBI  , PEXP    , XINT,XLCOMPL , MDABSENT);
 | 
						|
45980        NOB(OBUPB);
 | 
						|
45990          OPTAB(IDIBRM, PUPBM   , -1,-1        , MDINT);
 | 
						|
46000          OPTAB(IDIBR , PUPB    , XINT,XINT    , MDINT);
 | 
						|
46010          OPTAB(IDMON , PUPBMSTR, XSTRNG,XSTRNG, MDINT);
 | 
						|
46020        DEFSTOP1('ABS       ',10, OBABS);
 | 
						|
46030        DEFSTOP1('ARG       ',10, OBARG);
 | 
						|
46040        DEFSTOP1('BIN       ',10, OBBIN);
 | 
						|
46050        DEFSTOP1('CONJ      ',10, OBCONJ);
 | 
						|
46060        DEFSTOP1('ENTIER    ',10, OBENTI);
 | 
						|
46070  (*+61()
 | 
						|
46080        DEFSTOP1('LENG      ',10, OBLENG);
 | 
						|
46090  ()+61*)
 | 
						|
46100        DEFSTOP1('NOT       ',10, OBNOT);
 | 
						|
46110        DEFSTOP1('ODD       ',10, OBODD);
 | 
						|
46120        DEFSTOP1('REPR      ',10, OBREPR);
 | 
						|
46130        DEFSTOP1('ROUND     ',10, OBROUN);
 | 
						|
46140  (*+61()
 | 
						|
46150        DEFSTOP1('SHORTEN   ',10, OBSHRT);
 | 
						|
46160  ()+61*)
 | 
						|
46170        DEFSTOP1('SIGN      ',10, OBSIGN);
 | 
						|
46180        DEFSTOP1('RE        ',10, OBRE);
 | 
						|
46190        DEFSTOP1('IM        ',10, OBIM);
 | 
						|
46200        DEFSTOP1('DIVAB     ', 1, OBDVAB);
 | 
						|
46210        DEFSTOP2('/:=       ', 1, OBDVAB);
 | 
						|
46220        DEFSTOP1('MINUSAB   ', 1, OBMNAB);
 | 
						|
46230        DEFSTOP2('-:=       ', 1, OBMNAB);
 | 
						|
46240        DEFSTOP1('MODAB     ', 1, OBMDAB);
 | 
						|
46250        DEFSTOP2('%*:=      ', 1, OBMDAB);
 | 
						|
46260        DEFSTOP1('OVERAB    ', 1, OBOVAB);
 | 
						|
46270        DEFSTOP2('%:=       ', 1, OBOVAB);
 | 
						|
46280        DEFSTOP1('PLUSAB    ', 1, OBPLAB);
 | 
						|
46290        DEFSTOP2('+:=       ', 1, OBPLAB);
 | 
						|
46300        DEFSTOP1('PLUSTO    ', 1, OBPLTO);
 | 
						|
46310        DEFSTOP2('+=:       ', 1, OBPLTO);
 | 
						|
46320        DEFSTOP1('TIMESAB   ', 1, OBTMAB);
 | 
						|
46330        DEFSTOP2('*:=       ', 1, OBTMAB);
 | 
						|
46340        DEFSTOP1('OR        ', 2, OBOR);
 | 
						|
46350        DEFSTOP1('AND       ', 3, OBAND);
 | 
						|
46360        DEFSTOP1('EQ        ', 4, OBEQ);
 | 
						|
46370        DEFSTOP2('=         ', 4, OBEQ);
 | 
						|
46380        DEFSTOP1('NE        ', 4, OBNE);
 | 
						|
46390        DEFSTOP2('/=        ', 4, OBNE);
 | 
						|
46400        DEFSTOP1('GE        ', 5, OBGE);
 | 
						|
46410        DEFSTOP2('>=        ', 5, OBGE);
 | 
						|
46420        DEFSTOP1('GT        ', 5, OBGT);
 | 
						|
46430        DEFSTOP2('>         ', 5, OBGT);
 | 
						|
46440        DEFSTOP1('LE        ', 5, OBLE);
 | 
						|
46450        DEFSTOP2('<=        ', 5, OBLE);
 | 
						|
46460        DEFSTOP1('LT        ', 5, OBLT);
 | 
						|
46470        DEFSTOP2('<         ', 5, OBLT);
 | 
						|
46480        DEFSTOP2('+         ', 6, OBPLUS);
 | 
						|
46490        DEFSTOP2('-         ', 6, OBMINUS);
 | 
						|
46500        DEFSTOP1('ELEM      ', 7, OBELEM);
 | 
						|
46510        DEFSTOP2('*         ', 7, OBTIMES);
 | 
						|
46520        DEFSTOP2('/         ', 7, OBDIV);
 | 
						|
46530        DEFSTOP1('MOD       ', 7, OBMOD);
 | 
						|
46540        DEFSTOP2('%*        ', 7, OBMOD);
 | 
						|
46550        DEFSTOP1('OVER      ', 7, OBOVER);
 | 
						|
46560        DEFSTOP2('%         ', 7, OBOVER);
 | 
						|
46570  (*-51()
 | 
						|
46580        DEFSTOP2('^         ', 8, OBUP);
 | 
						|
46590  ()-51*)
 | 
						|
46600  (*+51()
 | 
						|
46610        DEFSTOP2('''         ', 8, OBUP);
 | 
						|
46620  ()+51*)
 | 
						|
46630        DEFSTOP2('**        ', 8, OBUP);
 | 
						|
46640        DEFSTOP1('LWB       ', 8, OBLWB);
 | 
						|
46650        DEFSTOP1('UPB       ', 8, OBUPB);
 | 
						|
46660        DEFSTOP1('SHL       ', 8, OBSHL);
 | 
						|
46670        DEFSTOP1('SHR       ', 8, OBSHR);
 | 
						|
46680        DEFSTOP1('I         ', 9, OBPLITM);
 | 
						|
46690        DEFSTOP2('+*        ', 9, OBPLITM);
 | 
						|
46700        END;
 | 
						|
46710      BEGIN (*STANDARDPRELUDE*)
 | 
						|
46720      DCIL := NIL; SRSUBP := 0; SRSEMP := -1;
 | 
						|
46730      CURID := SIZIBBASE+SIZLEBBASE;
 | 
						|
46740      INITSTDIDS;
 | 
						|
46750      INITOPS;
 | 
						|
46760      NEW(MONADUMMY); WITH MONADUMMY^ DO
 | 
						|
46770        BEGIN STLINK := NIL; STLEX := NIL; STTHREAD := NIL; STDEFTYP := [STINIT]; STBLKTYP := STBDEFOP;
 | 
						|
46780        STRANGE := 0; STOFFSET := 0; STLEVEL := 0; STLOCRG := 0;
 | 
						|
46790        STMODE := DEFPRC1(MDERROR, MDERROR, PROC) END;
 | 
						|
46800      NEW(DYADUMMY); DYADUMMY^ := MONADUMMY^; DYADUMMY^.STMODE := DEFPRC2(MDERROR, MDERROR, MDERROR, PROC);
 | 
						|
46810      END;
 | 
						|
46820  (**)
 | 
						|
46830  ()+85*)
 | 
						|
46840  (**)
 | 
						|
46850  (*+01()
 | 
						|
46860  PROCEDURE INITBEGIN;
 | 
						|
46870  (*FILLS XSEG.BUFFER WITH WORDS TO BE OUTPUT BY EMITBEG*)
 | 
						|
46880    VAR COUNT: INTEGER;
 | 
						|
46890    PROCEDURE INTWD(INT: INTEGER);
 | 
						|
46900        BEGIN
 | 
						|
46910        XSEG.BUFFER[COUNT].CODEWORD := INT;
 | 
						|
46920        COUNT := COUNT+1
 | 
						|
46930        END;
 | 
						|
46940    PROCEDURE ALFWD(ALF: ALFA);
 | 
						|
46950      VAR X: RECORD CASE INTEGER OF
 | 
						|
46960                1: (I: INTEGER);
 | 
						|
46970                2: (A: ALFA)
 | 
						|
46980                END;
 | 
						|
46990        BEGIN WITH X DO
 | 
						|
47000          BEGIN
 | 
						|
47010          A := ALF;
 | 
						|
47020          XSEG.BUFFER[COUNT].CODEWORD := I;
 | 
						|
47030          COUNT := COUNT+1
 | 
						|
47040          END;
 | 
						|
47050        END;
 | 
						|
47060      BEGIN
 | 
						|
47070      COUNT := 1;
 | 
						|
47080      INTWD(77000007000000000000B); (*PRFX TABLE*)
 | 
						|
47090      ALFWD('A68PROG:::');
 | 
						|
47100      INTWD(0); (*FOR DAT*)
 | 
						|
47110      INTWD(0); (*FOR TIM*)
 | 
						|
47120      ALFWD(NOSNUM);
 | 
						|
47130      ALFWD(ALG68NUM);
 | 
						|
47140      ALFWD('          ');
 | 
						|
47150      ALFWD(' I        ');
 | 
						|
47160                                    (*LDSET TABLE - LIB, MAP, ERR*)
 | 
						|
47170  (*-52()
 | 
						|
47180      INTWD(70000004000000000000B);
 | 
						|
47190      INTWD(00100001000000000000B);
 | 
						|
47200      ALFWD('A68SLIB:::');
 | 
						|
47210      INTWD(00110000000000000002B);
 | 
						|
47220      INTWD(00130000000000000000B);
 | 
						|
47230  ()-52*)
 | 
						|
47240  (*+52()
 | 
						|
47250      INTWD(70000002000000000000B);
 | 
						|
47260      INTWD(00100001000000000000B);
 | 
						|
47270      ALFWD('A68SLIB:::');
 | 
						|
47280  ()+52*)
 | 
						|
47290      INTWD(34000002000000000000B); (*PIDL TABLE*)
 | 
						|
47300      ALFWD('A68PROG:::');
 | 
						|
47310      INTWD(55555555555555003400B); (*3400B WORDS OF STACK/HEAP SPACE*)
 | 
						|
47320      INTWD(36000002000000000000B); (*ENTR TABLE*)
 | 
						|
47330      ALFWD('P.MAIN::::');
 | 
						|
47340      INTWD(00000000000001000003B);
 | 
						|
47350      INTWD(46000001000000000000B); (*XFER TABLE*)
 | 
						|
47360      ALFWD('P.MAIN::::');
 | 
						|
47370      XSEG.BUFFER[0].CODEWORD := COUNT-1;
 | 
						|
47380      END;
 | 
						|
47390   ()+01*)
 | 
						|
47400  (**)
 | 
						|
47410  (**)
 | 
						|
47420  (**)
 | 
						|
47430  (**)
 | 
						|
47440  (**)
 | 
						|
47450  (**)
 | 
						|
47460  (*+85()
 | 
						|
47470  (**)
 | 
						|
47480  PROCEDURE INITSEMANTICS;
 | 
						|
47490    VAR I : INTEGER;
 | 
						|
47500    PROCEDURE SETOLIST(VAR OLIST: OLSTTYP; A,B,C,D,E,F: STATE);
 | 
						|
47510      VAR I: INTEGER;
 | 
						|
47520        BEGIN FOR I:=0 TO 5 DO OLIST[I].DP:=FALSE;
 | 
						|
47530        OLIST[0].OVAL:=A; OLIST[1].OVAL:=B;OLIST[2].OVAL:=C;
 | 
						|
47540        OLIST[3].OVAL:=D; OLIST[4].OVAL:=E; OLIST[5].OVAL:=F;
 | 
						|
47550        END;
 | 
						|
47560  (**)
 | 
						|
47570  (**)
 | 
						|
47580      BEGIN (*INITSEMANTICS*)
 | 
						|
47590                     (*SIMPLE,SPECIAL,WEAKREF,ROWED,DRESSED,UNDRESSED*)
 | 
						|
47600      SETOLIST(OLIST1, 0     ,1      ,4      ,2    ,2      ,3);OLIST1[2].DP:=TRUE;OLIST1[5].DP:=TRUE;
 | 
						|
47610      SETOLIST(OLIST2, 0     ,3      ,6      ,6    ,6      ,6);
 | 
						|
47620      SETOLIST(OLIST3, 0     ,1      ,2      ,4    ,2      ,3);
 | 
						|
47630      SETOLIST(OLIST4, 4     ,1      ,11     ,4    ,4      ,3);
 | 
						|
47640        FOR I := 0 TO 5 DO OLIST4[I].DP:=TRUE; OLIST4[1].DP:=FALSE;
 | 
						|
47650      SETOLIST(OLIST5, 11    ,11     ,11     ,11   ,11     ,0);OLIST5[5].DP:=TRUE;
 | 
						|
47660      SETOLIST(OLIST6, 0     ,1      ,2      ,4    ,2      ,3);OLIST6[5].DP:=TRUE;
 | 
						|
47670  (**)
 | 
						|
47680      END;
 | 
						|
47690  ()+85*)
 |