(*13.6.1985 *) PROCEDURE STATEMENT; VAR AD1,AD2,I,X:INTEGER;ART:TART; LOOP:VARDESCRIPTOR; PROCEDURE BOOLEXP; VAR T:INTEGER; BEGIN T:=EXPRESSION;TYPTEST(T,BOOL,144) END;(*BOOLEXP*) PROCEDURE INSPECT; (*SETZT WITHIND FUER POSITION *) (*BENUTZT GLOBAL I,X *) VAR WITHI2,TYP2,WITH2:INTEGER; BEGIN WITH2:=WITHADR;WITHI2:=WITHIND;X:=DX; REPEAT GETSYM;IF SYM<>IDENT THEN ERROR(2); I:=POSITION(ID); IF(WITHIND<>0)AND(TABART[I]<>SELECT) THEN ERROR(152); VARIABLE(I,ZU);WITHIND:=ZU.VTYP; IF TABART[WITHIND]<>VERBTYP THEN ERROR(140); (*ABSOLUTE ADRESSE DES RECORDS AUF DEM STACK*) GENF(ZU);WITHADR:=DX;DX:=DX+2; UNTIL SYM<>KOMMA; TEST(134(*DO*),54);STATEMENT; REPEAT (*ADRESSE LOESCHEN, WIHIND:=ALTER WERT*) GEN(POPSYM);DX:=DX-2 UNTIL DX=X; WITHIND:=WITHI2;WITHADR:=WITH2; END;(*INSPECT*) PROCEDURE SEQUENZ(ENDSYM:INTEGER); (*LIEST SYM STATEMENT [;STATEMENT] ENDSYM *) BEGIN GETSYM;STATEMENT; WHILE SYM<>ENDSYM DO BEGIN CASE SYM OF SEMI:GETSYM; IDENT,130,143,162,155,139,131,INTNUM,142: (*ANFANGSSYMBOLE FUER STATEMENTS *) ERROR(14); ELSE(*CASE*) BEGIN GETSYM;ERROR(14) END END;(*CASE*) STATEMENT END; GETSYM END;(*SEQUENZ*) PROCEDURE FALL; VAR I,LSYM,Z,TYP:INTEGER; TAB:ARRAY[0..MXCASE]OF INTEGER; (*KELLERSPEICHER, TABELLENZEIGER IST Z *) PROCEDURE PUSH(X:INTEGER); BEGIN IF Z>MXCASE THEN ERROR(400) ELSE BEGIN TAB[Z]:=X;Z:=Z+1 END END;(*PUSH*) BEGIN Z:=0;GETSYM;TYP:=EXPRESSION; IF ISLONG(TYP) THEN ERROR(144); DX:=DX+2;TEST(149(*OF*),8);LSYM:=SEMI; WHILE(SYM<>137)AND(SYM<>136)DO IF SYM=SEMI THEN BEGIN LSYM:=SEMI;GETSYM END ELSE BEGIN IF LSYM<>SEMI THEN ERROR(14); GEN(JMCSYM);AD1:=PC;FRE;I:=0; REPEAT (*KONSTANTEN AUF DEN STACK*) CHECKCONST(TYP,147);PUSH(NUM);I:=I+1; LSYM:=SYM;GETSYM UNTIL LSYM<>KOMMA;GEN(I);(*=N*) REPEAT Z:=Z-1;I:=I-1;GENA(TAB[Z]) UNTIL I=0; IF LSYM<>DPKT THEN ERROR(5); STATEMENT;GEN(JMPSYM);PUSH(PC);FRE; FIXUP(AD1,PC);LSYM:=STERN END; IF SYM=136 THEN BEGIN GETSYM;STATEMENT END ELSE BEGIN GEN(ERRSYM);GEN(CASERR) END; TEST(137(*END*),13); WHILE Z>0 DO BEGIN Z:=Z-1;FIXUP(TAB[Z],PC) END; GEN(POPSYM);DX:=DX-2; END;(*FALL*) BEGIN(*STATEMENT*) IF SYM=INTNUM THEN (*LABELDEFINITION *) BEGIN I:=LBLI2; WHILE(ILBL[I].VAL) DO I:=I+1; IF I0 THEN ERROR(165) ELSE BEGIN LEV:=-LEV; (*DEKLARATION VERVOLLSTAENDIGEN: *) FIXUP(ADDU(ADR,1),DX-2);(*LFD. OFFSET *) FIXUP(ADDU(ADR,4),PC); (*ZIELADRESSE *) END END ELSE ERROR(167); GETSYM;TEST(DPKT,5) END; CASE SYM OF IDENT:BEGIN I:=POSITION(ID); IF I<0 THEN ART:=VARBLE ELSE ART:=TABART[I]; CASE ART OF VARBLE,FKT,SELECT: BEGIN IF ART=FKT THEN BEGIN (*ZUWEISUNG MOEGLICH? *) I:=I+TABA2[I]+1;ART:=VARBLE; IF TABA1[I]<>0 THEN ERROR(103); END; ZUW1(I);TEST(170,51);ZUW2(EXPRESSION) END; PROZ: BEGIN GETSYM;I:=CALL(I)(*I IST DUMMY *) END ELSE BEGIN ERROR(103);GETSYM END END(*CASE*) END; 130(*BEGIN*):SEQUENZ(137);(*END*) 143(*IF*):BEGIN GETSYM;BOOLEXP; TEST(157,52);GEN(JNCSYM);AD1:=PC;FRE; STATEMENT;IF SYM=136(*ELSE*) THEN BEGIN GETSYM;GEN(JMPSYM);AD2:=PC;FRE; FIXUP(AD1,PC);STATEMENT;AD1:=AD2 END; FIXUP(AD1,PC) END; 162(*WHILE*):BEGIN GETSYM;AD1:=PC;BOOLEXP; TEST(134(*DO*),54);GEN(JNCSYM);AD2:=PC; FRE;STATEMENT;GEN(JMPSYM);GENA(AD1); FIXUP(AD2,PC) END; 155(*REPEAT*):BEGIN AD1:=PC; SEQUENZ(160);(*UNTIL*) BOOLEXP;GEN(JNCSYM);GENA(AD1) END; 139(*FOR*):BEGIN GETSYM; IF SYM=IDENT THEN I:=POSITION(ID) ELSE I:=-1; VARIABLE(I,ZU); IF(ZU.ACCESS<>BASEOFFSET)OR ZU.ISPACKED THEN ERROR(155); IF ISLONG(ZU.VTYP) THEN ERROR(143); TEST(170,51);ZUW2(EXPRESSION); IF(SYM<>158)AND(SYM<>135) (*DO/DOWNTO *) THEN BEGIN I:=158;ERROR(55) END ELSE BEGIN I:=SYM;GETSYM END; X:=EXPRESSION;TYPTEST(X,ZU.VTYP,144); TEST(134,54);DX:=DX+2; AD1:=PC;GENLS(LSYM,ZU);GEN(OVRSYM); LOOP:=ZU;(*"<=" ODER ">="*) IF I=158 THEN GENOP(171)ELSE GENOP(173); GEN(JNCSYM);AD2:=PC;FRE;STATEMENT; GENLS(LSYM,LOOP);GENLDC(1); IF I=158 THEN GENOP(PLUS) ELSE GENOP(MINUS); GENLS(SSYM,LOOP); GEN(JMPSYM);GENA(AD1);FIXUP(AD2,PC); GEN(POPSYM);DX:=DX-2 END; 131(*CASE*):FALL; 163(*WITH*):INSPECT; 142(*GOTO*):BEGIN GETSYM; IF SYM<>INTNUM THEN ERROR(106) ELSE BEGIN I:=0; WHILE(ILBL[I].VAL) DO I:=I+1; IF I