PROGRAM PARSER(INPUT,OUTPUT); CONST NUL=0; IDENTIFIER=1; INTEGERCONSTANT=2; REALCONSTANT=3; CHARACTER=4; STRING=5; PLUS=6; MINUS=7; TIMES=8; SLASH=9; EQUAL=10; NOTEQUAL=11; LESS=12; LESSOREQUAL=13; GREATER=14; GREATEROREQUAL=15; LPARENT=16; RPARENT=17; LBRACKET=18; RBRACKET=19; BECOMES=20; PERIOD=21; COMMA=22; SEMICOLON=23; COLON=24; UPTO=25; ANDSYM=51; ARRAYSYM=52; BEGINSYM=53; CASESYM=54; CONSTSYM=55; DIVSYM=56; DOWNTOSYM=57; DOSYM=58; ELSESYM=59; ENDSYM=60; FORSYM=61; FUNKTIONSYM=62; IFSYM=63; MODSYM=64; NILSYM=65; NOTSYM=66; OFSYM=67; ORSYM=68; OTHERSSYM=69; PROZEDURESYM=70; PROGRAMSYM=71; RECORDSYM=72; REPEATSYM=73; THENSYM=74; TOSYM=75; TYPESYM=76; UNTILSYM=77; VARSYM=78; WHILESYM=79; NORW = 28; AL = 10; LLENG = 120; EMAX = 322; EMIN = -292; INTMAX = 15; SMAX = 600; ERRMAX = 60; XMAX = 2046; NMAX = 1000000; NOS = 10; STACKSIZE = 2000; CMAX = 200; CZMAX = 100; PMAX = 200; PZMAX = 50; IMAX = 100; IZMAX = 50; TMAX = 200; TZMAX = 50; KMAX = 1000; NCMAX = 100; GAMMA = 1; ZETA = 2; EPSILON = 3; MY = 4; TAU = 5; LAMBDA = 6; OMEGA = 7; TYPE SYMBOL = INTEGER; (*WERTE DER OBEN DEF. SYMBOLE*) POINTER = INTEGER; ALFA = ARRAY[1..AL] OF CHAR; VAR EXIT:REAL; SYM:SYMBOL; ID:ALFA; INUM:INTEGER; RNUM:REAL; SLENG:INTEGER; CH:CHAR; LINE: ARRAY[1..LLENG] OF CHAR; CC: INTEGER; LC: INTEGER; LL: INTEGER; ERRS: ARRAY [1..ERRMAX] OF BOOLEAN; ERRPOS: INTEGER; WORD: ARRAY[1..NORW] OF ALFA; STAB: ARRAY [1..SMAX] OF CHAR; BOTTOM: ARRAY [1..NOS] OF POINTER; TOP: ARRAY [1..NOS] OF POINTER; STACK: ARRAY [1..STACKSIZE] OF INTEGER; C0,P0,I0,T0: POINTER; CZEIGER,PZEIGER,IZEIGER,TZEIGER: POINTER; CTAB: ARRAY [1..CMAX] OF INTEGER; CZ: ARRAY [1..CZMAX] OF POINTER; PTAB: ARRAY [1..PMAX] OF INTEGER; PZ: ARRAY [1..PZMAX] OF POINTER; ITAB: ARRAY [1..IMAX] OF INTEGER; IZ: ARRAY [1..IZMAX] OF POINTER; TTAB: ARRAY [1..TMAX] OF INTEGER; TZ: ARRAY [1..TZMAX] OF POINTER; KZEIGER: POINTER; KITUM: ARRAY [0..KMAX,1..4] OF INTEGER; NZEIGER: POINTER; NIDEK: ARRAY [1..NCMAX,1..2] OF INTEGER; PROCEDURE GETSYM; BEGIN READ(SYM) END; PROCEDURE ERROR; BEGIN WRITE ("FEHLER") END; PROCEDURE FATAL(I:INTEGER); BEGIN WRITELN; WRITELN("FATALER FEHLER # ",I:2); STOP END; PROCEDURE EINKELLERN(KELLER,OBJEKT: INTEGER); VAR I,K: INTEGER; BEGIN TOP[KELLER]:= TOP[KELLER] + 1; STACK[TOP[KELLER]] := OBJEKT; IF TOP[KELLER] = BOTTOM[KELLER+1] THEN BEGIN FOR I:=1 TO 10 DO BEGIN BOTTOM[KELLER] := BOTTOM[KELLER] - TOP[KELLER]; K:=K+1 END END END; PROCEDURE AUSKELLERN(KELLER:INTEGER); BEGIN TOP[KELLER] := TOP[KELLER] - 1; IF TOP[KELLER] < BOTTOM[KELLER] THEN FATAL(1) END; PROCEDURE ERSETZEN(KELLER,OBJEKT: INTEGER); BEGIN STACK[TOP[KELLER]] := OBJEKT END; PROCEDURE LEEREN(KELLER: INTEGER); BEGIN TOP[KELLER] := BOTTOM[KELLER] END; PROCEDURE INITIALIZE; VAR K,I:INTEGER; BEGIN K:= STACKSIZE DIV (NOS + 1); FOR I:=0 TO NOS DO BEGIN TOP[I] := I*K; BOTTOM[I] := TOP[I] END END; FUNCTION DD(NAME:INTEGER): BOOLEAN; VAR I: INTEGER; BEGIN DD:=FALSE; FOR I:=KZEIGER-1 DOWNTO PUNKT(0) DO IF NAME = KITUM[I,1] THEN DD:=TRUE END; PROCEDURE AUFADDIEREN(ZAHL:INTEGER; KELLER: INTEGER); BEGIN STACK[TOP[KELLER]] := STACK[TOP[KELLER]] + ZAHL END; FUNCTION LEER(KELLER:INTEGER):BOOLEAN; BEGIN LEER := TOP[KELLER] = BOTTOM[KELLER] END; FUNCTION PUNKT(KELLER: INTEGER): INTEGER; BEGIN PUNKT := STACK[TOP[KELLER]] END; FUNCTION NPUNKT(KELLER,N: INTEGER): INTEGER; BEGIN IF TOP[KELLER] - N < BOTTOM[KELLER] THEN FATAL(0) ELSE NPUNKT := STACK[TOP[KELLER]-N+1] END; PROCEDURE NEWLEVEL; BEGIN EINKELLERN(0,KZEIGER) END; PROCEDURE OUTLEVEL; BEGIN KZEIGER := TOP[0]; AUSKELLERN(0) END;