File PARSE3.DT

Directory of image this file is from
This file as a plain text file

PROGRAM PARSER(INPUT,OUTPUT);      (*VERSION 12-DEC-80*)
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;
      NORI = 8;
      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 SYM: SYMBOL;
    VORSYM: SYMBOL;
    ID: ALFA;
    INUM: INTEGER;
    RNUM: REAL;
    CH: CHAR;
    LINE: ARRAY[1..LLENG] OF CHAR;
    CC: INTEGER;
    LC: INTEGER;
    LOC: INTEGER;
    LL: INTEGER;
    ERRS: ARRAY [1..ERRMAX,1..3] OF INTEGER;
    ERRCOUNT: INTEGER;
    WORD: ARRAY[1..NORW] OF ALFA;
    STAB: ARRAY [1..SMAX] OF CHAR;
    STRINGS: ARRAY [1..LLENG] OF CHAR;
    SLENG: INTEGER;
    BOTTOM: ARRAY [0..NOS] OF POINTER;
    TOP: ARRAY [0..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 [1..KMAX,1..4] OF INTEGER;
    NZEIGER: POINTER;
    NIDEK: ARRAY [1..NCMAX,1..2] OF INTEGER;


PROCEDURE LIESWORD(I:INTEGER); VAR J:INTEGER; BEGIN FOR J:=1 TO AL DO READ(WORD[I,J]) END; PROCEDURE SCHREIB(OBJEKT:ALFA); VAR I: INTEGER; BEGIN FOR I:=1 TO AL DO WRITE(OBJEKT[I]); WRITELN END; PROCEDURE ERRMESSAGE; VAR I: INTEGER; BEGIN IF ERRCOUNT > 0 THEN BEGIN FOR I := 1 TO ERRCOUNT DO WRITELN("ERROR # ",ERRS[I,1]:3," AT ",ERRS[I,2],",",ERRS[I,3]); HALT END END; PROCEDURE GETSYM; BEGIN READLN(SYM); WRITELN; IF SYM < 100 THEN SCHREIB(WORD[SYM]) ELSE WRITELN("IDENTIFIER # ",(SYM-100):3) END; PROCEDURE FATAL(I:INTEGER); BEGIN WRITELN; WRITELN("FATALER FEHLER # ",I:2); ERRMESSAGE; HALT END; PROCEDURE ERROR; BEGIN WRITE ("FEHLER"); ERRCOUNT:=ERRCOUNT+1; IF ERRCOUNT>ERRMAX THEN FATAL(1) ELSE BEGIN ERRS[ERRCOUNT,1] := 1; ERRS[ERRCOUNT,2] := LC; ERRS[ERRCOUNT,3] := LOC; END END; PROCEDURE EINKELLERN(OBJEKT,KELLER: INTEGER); VAR I,K: INTEGER; BEGIN TOP[KELLER]:= TOP[KELLER] + 1; STACK[TOP[KELLER]] := OBJEKT; IF TOP[KELLER] = BOTTOM[KELLER+1] THEN FATAL(0) END; PROCEDURE AUSKELLERN(KELLER:INTEGER); BEGIN TOP[KELLER] := TOP[KELLER] - 1; IF TOP[KELLER] < BOTTOM[KELLER] THEN FATAL(1) END; PROCEDURE ERSETZEN(OBJEKT,KELLER: INTEGER); BEGIN STACK[TOP[KELLER]] := OBJEKT END; PROCEDURE LEEREN(KELLER: INTEGER); BEGIN TOP[KELLER] := BOTTOM[KELLER] END; PROCEDURE ENTER(NAME,KENNNR,X1,X2: INTEGER); BEGIN KITUM[KZEIGER,1] := NAME; KITUM[KZEIGER,2] := KENNNR; KITUM[KZEIGER,3] := X1; KITUM[KZEIGER,4] := X2; KZEIGER := KZEIGER +1; IF KZEIGER > KMAX THEN FATAL(1) END; FUNCTION PUNKT(KELLER: INTEGER): INTEGER; BEGIN PUNKT := STACK[TOP[KELLER]] 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 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(KZEIGER,0) END; PROCEDURE OUTLEVEL; BEGIN KZEIGER := TOP[0]; AUSKELLERN(0) END; FUNCTION INKITUM(NAME:INTEGER): INTEGER; VAR I: INTEGER; BEGIN I := KZEIGER - 1; WHILE (I>0) AND (KITUM[I,1] <> NAME) DO I:=I-1; INKITUM := I END; PROCEDURE INITIALIZE; VAR K,I,X1,X2,N:INTEGER; BEGIN K:= STACKSIZE DIV (NOS + 1); FOR I:=0 TO NOS DO BEGIN TOP[I] := I*K; BOTTOM[I] := TOP[I] END; FOR I := 1 TO NORI DO BEGIN READ(N,K,X1,X2); ENTER(N,K,X1,X2) END; FOR I:=1 TO NORW DO LIESWORD(I) END;



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search