1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-05-01 22:06:24 +00:00

Commit James Fehlinger's updates to the EULER IV system as of 2014-03-25.

This commit is contained in:
Paul Kimpel
2014-04-05 20:40:13 +00:00
parent 2237be9923
commit 6b53be5e6d
2 changed files with 396 additions and 375 deletions

View File

@@ -12,11 +12,11 @@ BEGIN COMMENT E U L E R IV S Y S T E M MARCH 1965;
FT ~ 45; LT ~ 119; LP ~ 465; COMMENT DATA GENERATED BY SY-PR.; FT ~ 45; LT ~ 119; LP ~ 465; COMMENT DATA GENERATED BY SY-PR.;
BEGIN COMMENT E U L E R IV TRANSLATOR N.WIRTH; BEGIN COMMENT E U L E R IV TRANSLATOR N.WIRTH;
DEFINE MARK = 119#, IDSYM = 63#, REFSYM = 59#, LABSYM = 62#; DEFINE MARK =119#, IDSYM =63#, REFSYM =59#, LABSYM =62#;
DEFINE VALSYM = 56#, CALLSYM = 55#, UNDEF = 0#, NEWSYM = 60#; DEFINE VALSYM =56#, CALLSYM =55#, UNDEF =0#, NEWSYM =60#;
DEFINE UNARYMINUS = 116#, NUMSYM = 68#, BOOLSYM = 64#; DEFINE UNARYMINUS =116#, NUMSYM =68#, BOOLSYM =64#;
DEFINE LISTSYM = 102#, SYMSYM = 113#, FORSYM = 61#; DEFINE LISTSYM =102#, SYMSYM =113#, FORSYM =61#;
DEFINE NAME = V[0]#; DEFINE NAME =V[0]#;
INTEGER I,J,K,M,N,R,T,T1,SCALE; BOOLEAN ERRORFLAG; INTEGER I,J,K,M,N,R,T,T1,SCALE; BOOLEAN ERRORFLAG;
INTEGER BN, ON; COMMENT BLOCK- AND ORDER-NUMBER; INTEGER BN, ON; COMMENT BLOCK- AND ORDER-NUMBER;
INTEGER NP; COMMENT NAME LIST POINTER; INTEGER NP; COMMENT NAME LIST POINTER;

View File

@@ -1,430 +1,451 @@
BEGIN COMMENT SYNTAX-PROCESSOR. NIKLAUS WIRTH DEC.1964; BEGIN COMMENT SYNTAX-PROCESSOR. NIKLAUS WIRTH DEC.1964;
DEFINE NSY =150#; COMMENT MAX. NO. OF SYMBOLS; DEFINE NSY =180#; COMMENT MAX. NO. OF SYMBOLS;
DEFINE NPR =150#; COMMENT MAX. NO. OF PRODUCTIONS; DEFINE NPR =180#; COMMENT MAX. NO. OF PRODUCTIONS;
DEFINE UPTO = STEP 1 UNTIL #; DEFINE UPTO =STEP 1 UNTIL#;
DEFINE LS = "<" #, EQ = "=" #, GR = ">" #, NULL = "" #; DEFINE LS ="<"#, EQ ="="#, GR =">"#, NULL =" "#;
FILE OUT PCH 0 (2,10); COMMENT PUNCH FILE; FILE IN CARDFIL (1,10); FILE PRINTFIL 1 (1,15);
INTEGER LT; COMMENT NUMBER OF LAST NONBASIC SYMBOL; FILE OUT PCH 0 (2,10); COMMENT PUNCH FILE;
INTEGER K,M,N, MAX, OLDN; BOOLEAN ERRORFLAG; INTEGER LT; COMMENT NUMBER OF LAST NONBASIC SYMBOL;
ALPHA ARRAY READBUFFER[0:9], WRITEBUFFER[0:14]; INTEGER K,M,N, MAX, OLDN; BOOLEAN ERRORFLAG;
ALPHA ARRAY TEXT[0:11]; COMMENT AUXILIARY TEXT ARRAY; ALPHA ARRAY READBUFFER[0:9], WRITEBUFFER[0:14];
ALPHA ARRAY SYTB[0:NSY]; COMMENT SYMBOLTABLE; ALPHA ARRAY TEXT[0:11]; COMMENT AUXILIARY TEXT ARRAY;
INTEGER ARRAY REF[0:NPR,0:5]; COMMENT SYNTAX REFERENCE TABLE; ALPHA ARRAY SYTB[0:NSY]; COMMENT SYMBOLTABLE;
LABEL START,EXIT; INTEGER ARRAY REF[0:NPR,0:5]; COMMENT SYNTAX REFERENCE TABLE;
LABEL A,B,C,E,F,G; LABEL START,EXIT;
LABEL A,B,C,E,F,G;
STREAM PROCEDURE CLEAR(D,N); VALUE N; STREAM PROCEDURE CLEAR(D,N); VALUE N;
BEGIN DI ~ D; DS ~ 8 LIT " "; SI ~ D; DS ~ N WDS BEGIN DI ~ D; DS ~ 8 LIT " "; SI ~ D; DS ~ N WDS
END; END;
STREAM PROCEDURE MARK(D,S); VALUE S; STREAM PROCEDURE MARK(D,S); VALUE S;
BEGIN DI ~ D; SI ~ LOC S; SI ~ SI+7; DS ~ CHR BEGIN DI ~ D; SI ~ LOC S; SI ~ SI+7; DS ~ CHR
END; END;
BOOLEAN STREAM PROCEDURE FINIS(S); BOOLEAN STREAM PROCEDURE FINIS(S);
BEGIN TALLY ~ 1; SI ~ S; IF SC = "*" THEN FINIS ~ TALLY BEGIN TALLY ~ 1; SI ~ S; IF SC = "*" THEN FINIS ~ TALLY
END; END;
STREAM PROCEDURE EDIT(S,D,N); STREAM PROCEDURE EDIT(S,D,N);
BEGIN DI ~ D; SI ~ N; DS ~ 3 DEC; SI ~ S; DS ~ 9 WDS; BEGIN DI ~ D; SI ~ N; DS ~ 3 DEC; SI ~ S; DS ~ 9 WDS;
END; END;
STREAM PROCEDURE MOVE(S,D); STREAM PROCEDURE MOVE(S,D);
BEGIN SI ~ S; DI ~ D; DS ~ WDS; BEGIN SI ~ S; DI ~ D; DS ~ WDS;
END; END;
STREAM PROCEDURE MOVETEXT(S,D,N); VALUE N; STREAM PROCEDURE MOVETEXT(S,D,N); VALUE N;
BEGIN DI ~ D; SI ~ S; DS ~ N WDS; BEGIN DI ~ D; SI ~ S; DS ~ N WDS;
END; END;
BOOLEAN STREAM PROCEDURE EQUAL(S,D); BOOLEAN STREAM PROCEDURE EQUAL(S,D);
BEGIN SI ~ S; DI ~ D; TALLY ~ 1; IF 8 SC = DC THEN EQUAL ~ TALLY; BEGIN SI ~ S; DI ~ D; TALLY ~ 1; IF 8 SC = DC THEN EQUAL ~ TALLY;
END; END;
STREAM PROCEDURE SCAN(S,DD,N); STREAM PROCEDURE SCAN(S,DD,N);
BEGIN LABEL A,B,C,D,E; BEGIN LABEL A,B,C,D,E;
SI ~ S; DI ~ DD; DS ~ 48 LIT "0"; DI ~ DD; SI ~ SI+1; SI ~ S; DI ~ DD; DS ~ 48 LIT "0"; DI ~ DD; SI ~ SI+1;
IF SC = " " THEN DI ~ DI+8; IF SC = " " THEN DI ~ DI+8;
A: IF SC = " " THEN BEGIN SI ~ SI+1; GO TO A END; A: IF SC = " " THEN BEGIN SI ~ SI+1; GO TO A END;
IF SC > "9" THEN GO TO D; IF SC > "9" THEN GO TO D;
8 (IF SC = " " THEN BEGIN DS ~ LIT " "; GO TO E END; DS ~ CHR; E:); 8 (IF SC = " " THEN BEGIN DS ~ LIT " "; GO TO E END; DS ~ CHR; E:);
B: IF SC ! " " THEN BEGIN SI ~ SI+1; GO TO B END; B: IF SC ! " " THEN BEGIN SI ~ SI+1; GO TO B END;
C: SI ~ SI+1; GO TO A; C: SI ~ SI+1; GO TO A;
D: DI ~ N; SI ~ SI+5; DS ~ 3 OCT D: DI ~ N; SI ~ SI+5; DS ~ 3 OCT
END; END;
STREAM PROCEDURE EDITTEXT(S,D,N); VALUE N; STREAM PROCEDURE EDITTEXT(S,D,N); VALUE N;
BEGIN SI ~ S; DI ~ D; DI ~ DI+10; N(DI ~ DI+2; DS ~ 8 CHR) BEGIN SI ~ S; DI ~ D; DI ~ DI+10; N(DI ~ DI+2; DS ~ 8 CHR)
END; END;
STREAM PROCEDURE SETTEXT(A,B,C,D,E,Z); STREAM PROCEDURE SETTEXT(A,B,C,D,E,Z);
BEGIN DI ~ Z; DI ~ DI+8; SI ~ A; DS ~ 3 DEC; SI ~ B; DS ~ WDS; BEGIN DI ~ Z; DI ~ DI+8; SI ~ A; DS ~ 3 DEC; SI ~ B; DS ~ WDS;
DI ~ DI+5; SI ~ C; DS ~ 3 DEC; DI ~ DI+3; SI ~ D; DS ~ 3 DEC; DI ~ DI+5; SI ~ C; DS ~ 3 DEC; DI ~ DI+3; SI ~ D; DS ~ 3 DEC;
DI ~ DI+3; SI ~ E; DS ~ 3 DEC; DI ~ DI+3; SI ~ E; DS ~ 3 DEC;
END; END;
STREAM PROCEDURE PCHTX(S,D,N); VALUE N; STREAM PROCEDURE PCHTX(S,D,N); VALUE N;
BEGIN SI ~ S; DI ~ D; DI ~ DI+4; BEGIN SI ~ S; DI ~ D; DI ~ DI+4;
N(DS ~ LIT """; DS ~ 8 CHR; DS ~ LIT """; DS ~ LIT ","); N(DS ~ LIT """; DS ~ 8 CHR; DS ~ LIT """; DS ~ LIT ",");
END; END;
PROCEDURE INPUT; PROCEDURE INPUT;
READ (CARDFIL, 10, READBUFFER[*]) [EXIT]; READ (CARDFIL, 10, READBUFFER[*]) [EXIT];
PROCEDURE OUTPUT; PROCEDURE OUTPUT;
BEGIN WRITE (PRINTFIL, 15, WRITEBUFFER[*]); BEGIN WRITE (PRINTFIL, 15, WRITEBUFFER[*]);
CLEAR(WRITEBUFFER[0], 14); CLEAR(WRITEBUFFER[0], 14);
END; END;
INTEGER PROCEDURE INX(X); REAL X; INTEGER PROCEDURE INX(X); REAL X;
BEGIN INTEGER I; LABEL F; BEGIN INTEGER I; LABEL F;
FOR I ~ 0 UPTO M DO FOR I ~ 0 UPTO M DO
IF EQUAL(SYTB[I], X) THEN GO TO F; IF EQUAL(SYTB[I], X) THEN GO TO F;
WRITE (<"UNDEFINED SYMBOL">); ERRORFLAG ~ TRUE; WRITE (PRINTFIL, <"UNDEFINED SYMBOL">);
F: INX ~ I; ERRORFLAG ~ TRUE;
END; F: INX ~ I;
END;
START: START:
FOR N ~ 0 UPTO 5 DO FOR N ~ 0 UPTO 5 DO
FOR M ~ 0 UPTO NPR DO REF[M,N] ~ 0; FOR M ~ 0 UPTO NPR DO REF[M,N] ~ 0;
M ~ N ~ MAX ~ OLDN ~ 0; ERRORFLAG ~ FALSE; M ~ N ~ MAX ~ OLDN ~ 0; ERRORFLAG ~ FALSE;
CLEAR(WRITEBUFFER[0],14); CLEAR(WRITEBUFFER[0],14);
COMMENT READ LIST OF SYMBOLS, ONE SYMBOL MUST APPEAR PER CARD, COMMENT READ LIST OF SYMBOLS, ONE SYMBOL MUST APPEAR PER CARD,
STARTING IN COL.9 (8 CHARS. ARE SIGNIFICANT), THE LIST OF NON- STARTING IN COL.9 (8 CHARS. ARE SIGNIFICANT), THE LIST OF NON-
BASIC SYMBOLS IS FOLLOWED BY AN ENDCARD ("*" IN COL.1). THEN BASIC SYMBOLS IS FOLLOWED BY AN ENDCARD ("*" IN COL.1). THEN
FOLLOWS THE LIST OF BASIC SYMBOLS AND AGAIN AN ENDCARD; FOLLOWS THE LIST OF BASIC SYMBOLS AND AGAIN AN ENDCARD;
WRITE (< "NONBASIC SYMBOLS:">); WRITE (PRINTFIL, < "NONBASIC SYMBOLS:">);
A: INPUT; A: INPUT;
IF FINIS(READBUFFER[0]) THEN GO TO E; IF FINIS(READBUFFER[0]) THEN GO TO E;
M ~ M+1; M ~ M+1;
MOVE(READBUFFER[1], SYTB[M]); MOVE(READBUFFER[1], SYTB[M]);
EDIT(READBUFFER[0], WRITEBUFFER[1], M); EDIT(READBUFFER[0], WRITEBUFFER[1], M);
OUTPUT; GO TO A; OUTPUT; GO TO A;
E: WRITE (</"BASIC SYMBOLS:">); LT ~ M; E: WRITE (PRINTFIL, </"BASIC SYMBOLS:">); LT ~ M;
F: INPUT; F: INPUT;
IF FINIS(READBUFFER[0]) THEN GO TO G; IF FINIS(READBUFFER[0]) THEN GO TO G;
M ~ M + 1; M ~ M + 1;
MOVE(READBUFFER[1], SYTB[M]); MOVE(READBUFFER[1], SYTB[M]);
EDIT(READBUFFER[0], WRITEBUFFER[1], M); EDIT(READBUFFER[0], WRITEBUFFER[1], M);
OUTPUT; GO TO F; OUTPUT; GO TO F;
COMMENT READ THE LIST OF PRODUCTIONS, ONE PER CARD. THE LEFTPART COMMENT READ THE LIST OF PRODUCTIONS, ONE PER CARD. THE LEFTPART
IS A NONBASIC SYMBOL STARTING IN COL.2. NO FORMAT IS PRESCRIBED IS A NONBASIC SYMBOL STARTING IN COL.2. NO FORMAT IS PRESCRIBED
FOR THE RIGHT PART. ONE OR MORE BLANKS ACT AS SYMBOL SEPARATORS. FOR THE RIGHT PART. ONE OR MORE BLANKS ACT AS SYMBOL SEPARATORS.
IF COL.2 IS BLANK, THE SAME LEFTPART AS IN THE PREVIOUS PRODUCTION IF COL.2 IS BLANK, THE SAME LEFTPART AS IN THE PREVIOUS PRODUCTION
IS SUBSTITUTED. THE MAX. LENGTH OF A PRODUCTION IS 6 SYMBOLS; IS SUBSTITUTED. THE MAX. LENGTH OF A PRODUCTION IS 6 SYMBOLS;
G: WRITE (</"SYNTAX:">); G: WRITE (PRINTFIL, </"SYNTAX:">);
B: INPUT; B: INPUT;
IF FINIS(READBUFFER[0]) THEN GO TO C; IF FINIS(READBUFFER[0]) THEN GO TO C;
MOVETEXT(READBUFFER[0], WRITEBUFFER[1], 10); OUTPUT; MOVETEXT(READBUFFER[0], WRITEBUFFER[1], 10); OUTPUT;
MARK(READBUFFER[9], 12); SCAN(READBUFFER[0],TEXT[0],N); MARK(READBUFFER[9], 12); SCAN(READBUFFER[0],TEXT[0],N);
IF N { 0 OR N > NPR OR REF[N,0] ! 0 THEN IF N { 0 OR N > NPR OR REF[N,0] ! 0 THEN
BEGIN WRITE (<"UNACCEPTABLE TAG">); ERRORFLAG ~ TRUE; GO TO B BEGIN WRITE (PRINTFIL, <"UNACCEPTABLE TAG">);
END; ERRORFLAG ~ TRUE; GO TO B
IF N > MAX THEN MAX ~ N; END;
COMMENT THE SYNTAX IS STORED IN REF, EACH SYMBOL REPRESENTED BY IF N > MAX THEN MAX ~ N;
ITS INDEX IN THE SYMBOL-TABLE; COMMENT THE SYNTAX IS STORED IN REF, EACH SYMBOL REPRESENTED BY
FOR K ~ 0 UPTO 5 DO REF[N,K] ~ INX(TEXT[K]); ITS INDEX IN THE SYMBOL-TABLE;
IF REF[N,0] = 0 THEN REF[N,0] ~ REF[OLDN,0] ELSE FOR K ~ 0 UPTO 5 DO REF[N,K] ~ INX(TEXT[K]);
IF REF[N,0] > LT THEN IF REF[N,0] = 0 THEN REF[N,0] ~ REF[OLDN,0] ELSE
BEGIN WRITE (<"ILLEGAL PRODUCTION">); ERRORFLAG ~ TRUE END; IF REF[N,0] > LT THEN
OLDN ~ N; GO TO B; BEGIN WRITE (PRINTFIL, <"ILLEGAL PRODUCTION">);
ERRORFLAG ~ TRUE END;
OLDN ~ N; GO TO B;
C: IF ERRORFLAG THEN GO TO EXIT; C: IF ERRORFLAG THEN GO TO EXIT;
N ~ MAX; N ~ MAX;
COMMENT M IS THE LENGTH OF THE SYMBOL-TABLE, N OF THE REF-TABLE; COMMENT M IS THE LENGTH OF THE SYMBOL-TABLE, N OF THE REF-TABLE;
BEGIN COMMENT BLOCK A; BEGIN COMMENT BLOCK A;
INTEGER ARRAY H[0:M, 0:M]; COMMENT PRECEDENCE MATRIX; INTEGER ARRAY H[0:M, 0:M]; COMMENT PRECEDENCE MATRIX;
INTEGER ARRAY F, G [0:M]; COMMENT PRECEDENCE FUNCTIONS; INTEGER ARRAY F, G [0:M]; COMMENT PRECEDENCE FUNCTIONS;
BEGIN COMMENT BLOCK B1; BEGIN COMMENT BLOCK B1;
INTEGER ARRAY LINX, RINX [0:LT]; COMMENT LEFT / RIGHT INDICES; INTEGER ARRAY LINX, RINX [0:LT]; COMMENT LEFT / RIGHT INDICES;
INTEGER ARRAY LEFTLIST, RIGHTLIST[0:1022]; INTEGER ARRAY LEFTLIST, RIGHTLIST[0:1022];
BEGIN COMMENT BLOCK C1, BUILD LEFT- AND RIGHT-SYMBOL LISTS; BEGIN COMMENT BLOCK C1, BUILD LEFT- AND RIGHT-SYMBOL LISTS;
INTEGER I,J; INTEGER I,J;
INTEGER SP, RSP; COMMENT STACK- AND RECURSTACK-POINTERS; INTEGER SP, RSP; COMMENT STACK- AND RECURSTACK-POINTERS;
INTEGER LP, RP; COMMENT LEFT/RIGHT LIST POINTERS; INTEGER LP, RP; COMMENT LEFT/RIGHT LIST POINTERS;
INTEGER ARRAY INSTACK[0:M]; INTEGER ARRAY INSTACK[0:M];
BOOLEAN ARRAY DONE, ACTIVE [0:LT]; BOOLEAN ARRAY DONE, ACTIVE [0:LT];
INTEGER ARRAY RECURSTACK, STACKMARK [0:LT+1]; INTEGER ARRAY RECURSTACK, STACKMARK [0:LT+1];
INTEGER ARRAY STACK[0:1022]; COMMENT HERE THE LISTS ARE BUILT; INTEGER ARRAY STACK[0:1022]; COMMENT HERE THE LISTS ARE BUILT;
PROCEDURE PRINTLIST(LX,L); ARRAY LX, L [0]; PROCEDURE PRINTLIST(LX,L); ARRAY LX, L [0];
BEGIN INTEGER I,J,K; BEGIN INTEGER I,J,K;
FOR I ~ 1 UPTO LT DO IF DONE[I] THEN FOR I ~ 1 UPTO LT DO IF DONE[I] THEN
BEGIN K ~ 0; MOVE(SYTB[I], WRITEBUFFER[0]); BEGIN K ~ 0; MOVE(SYTB[I], WRITEBUFFER[0]);
FOR J ~ LX[I],J+1 WHILE L[J] ! 0 DO FOR J ~ LX[I],J+1 WHILE L[J] ! 0 DO
BEGIN MOVE(SYTB[L[J]], TEXT[K]); K ~ K+1; BEGIN MOVE(SYTB[L[J]], TEXT[K]); K ~ K+1;
IF K } 10 THEN IF K } 10 THEN
BEGIN EDITTEXT(TEXT[0], WRITEBUFFER[0],10); OUTPUT; BEGIN EDITTEXT(TEXT[0], WRITEBUFFER[0],10);OUTPUT;
K ~ 0; K ~ 0;
END; END;
END; END;
IF K > 0 THEN IF K > 0 THEN
BEGIN EDITTEXT(TEXT[0], WRITEBUFFER[0], K); OUTPUT END; BEGIN EDITTEXT(TEXT[0], WRITEBUFFER[0], K);
END OUTPUT END;
END; END
END;
PROCEDURE DUMPIT; PROCEDURE DUMPIT;
BEGIN INTEGER I,J; WRITE ([PAGE]); BEGIN INTEGER I,J; WRITE (PRINTFIL [PAGE]);
WRITE (<X9,"DONE ACTIVE LINX RINX">); WRITE (PRINTFIL, <X9,"DONE ACTIVE LINX RINX">);
WRITE (<5I6>, FOR I ~ 1 UPTO LT DO WRITE (PRINTFIL, <5I6>, FOR I ~ 1 UPTO LT DO
[I, DONE[I], ACTIVE[I], LINX[I], RINX[I]]); [I, DONE[I], ACTIVE[I], LINX[I], RINX[I]]);
WRITE (</"STACK: SP =",I3>, SP); WRITE (PRINTFIL, </"STACK: SP =",I3>, SP);
WRITE (<I10,": ",10I6>, FOR I ~ 0 STEP 10 UNTIL SP DO WRITE (PRINTFIL, <I10,": ",10I6>,
[I, FOR J ~ I UPTO I+9 DO STACK[J]]); FOR I ~ 0 STEP 10 UNTIL SP DO
WRITE (</"RECURSTACK:">); [I, FOR J ~ I UPTO I+9 DO STACK[J]]);
WRITE (<3I6>, FOR I ~ 1 UPTO RSP DO WRITE (PRINTFIL, </"RECURSTACK:">);
[I, RECURSTACK[I], STACKMARK[I]]); WRITE (PRINTFIL, <3I6>, FOR I ~ 1 UPTO RSP DO
END; [I, RECURSTACK[I], STACKMARK[I]]);
END;
PROCEDURE RESET(X); VALUE X; INTEGER X; PROCEDURE RESET(X); VALUE X; INTEGER X;
BEGIN INTEGER I; BEGIN INTEGER I;
FOR I ~ X UPTO RSP DO STACKMARK[I] ~ STACKMARK[X]; FOR I ~ X UPTO RSP DO STACKMARK[I] ~ STACKMARK[X];
END; END;
PROCEDURE PUTINTOSTACK(X); VALUE X; INTEGER X; PROCEDURE PUTINTOSTACK(X); VALUE X; INTEGER X;
COMMENT X IS PUT INTO THE WORKSTACK. DUPLICATION IS AVOIDED! COMMENT X IS PUT INTO THE WORKSTACK. DUPLICATION IS AVOIDED!;
BEGIN IF INSTACK[X] = 0 THEN BEGIN IF INSTACK[X] = 0 THEN
BEGIN SP ~ SP+1; STACK[SP] ~ X; INSTACK[X] ~ SP END BEGIN SP ~ SP+1; STACK[SP] ~ X; INSTACK[X] ~ SP END
ELSE IF INSTACK[X] < STACKMARK[RSP] THEN ELSE IF INSTACK[X] < STACKMARK[RSP] THEN
BEGIN SP ~ SP+1; STACK[SP] ~ X; BEGIN SP ~ SP+1; STACK[SP] ~ X;
STACK[INSTACK[X]] ~ 0; INSTACK[X] ~ SP; STACK[INSTACK[X]] ~ 0; INSTACK[X] ~ SP;
END; END;
IF SP > 1020 THEN IF SP > 1020 THEN
BEGIN WRITE (</"STACK OVERFLOW"/>); DUMPIT; GO TO EXIT END; BEGIN WRITE (PRINTFIL, </"STACK OVERFLOW"/>);
END; DUMPIT; GO TO EXIT END;
END;
PROCEDURE COPYLEFTSYMBOLS(X); VALUE X; INTEGER X; PROCEDURE COPYLEFTSYMBOLS(X); VALUE X; INTEGER X;
COMMENT COPY THE LIST OF LEFTSYMBOLS OF X INTO THE STACK; COMMENT COPY THE LIST OF LEFTSYMBOLS OF X INTO THE STACK;
BEGIN FOR X ~ LINX[X], X+1 WHILE LEFTLIST[X] ! 0 DO BEGIN FOR X ~ LINX[X], X+1 WHILE LEFTLIST[X] ! 0 DO
PUTINTOSTACK(LEFTLIST[X]); PUTINTOSTACK(LEFTLIST[X]);
END; END;
PROCEDURE COPYRIGHTSYMBOLS(X); VALUE X; INTEGER X; PROCEDURE COPYRIGHTSYMBOLS(X); VALUE X; INTEGER X;
COMMENT COPY THE LIST OF RIGHTSYMBOLS OF X INTO THE STACK; COMMENT COPY THE LIST OF RIGHTSYMBOLS OF X INTO THE STACK;
BEGIN FOR X ~ RINX[X], X+1 WHILE RIGHTLIST[X] ! 0 DO BEGIN FOR X ~ RINX[X], X+1 WHILE RIGHTLIST[X] ! 0 DO
PUTINTOSTACK(RIGHTLIST[X]); PUTINTOSTACK(RIGHTLIST[X]);
END; END;
PROCEDURE SAVELEFTSYMBOLS(X); VALUE X; INTEGER X; PROCEDURE SAVELEFTSYMBOLS(X); VALUE X; INTEGER X;
COMMENT THE LEFTSYMBOLLISTS OF ALL SYMBOLS IN THE RECURSTACK COMMENT THE LEFTSYMBOLLISTS OF ALL SYMBOLS IN THE RECURSTACK
WITH INDEX > X HAVE BEEN BUILT AND MUST NOW BE REMOVED, THEY ARE WITH INDEX > X HAVE BEEN BUILT AND MUST NOW BE REMOVED, THEY ARE
COPIED INTO "LEFTLIST" AND THE SYMBOLS ARE MARKED "DONE"; COPIED INTO "LEFTLIST" AND THE SYMBOLS ARE MARKED "DONE";
BEGIN INTEGER I,J,U; LABEL L,EX; BEGIN INTEGER I,J,U; LABEL L,EX;
L: IF STACKMARK[X] = STACKMARK[X+1] THEN L: IF STACKMARK[X] = STACKMARK[X+1] THEN
BEGIN X ~ X+1; IF X < RSP THEN GO TO L ELSE GO TO EX END; BEGIN X ~ X+1; IF X < RSP THEN GO TO L ELSE GO TO EX END;
STACKMARK[RSP+1] ~ SP+1; STACKMARK[RSP+1] ~ SP+1;
FOR I ~ X+1 UPTO RSP DO FOR I ~ X+1 UPTO RSP DO
BEGIN LINX[RECURSTACK[I]] ~ LP+1; BEGIN LINX[RECURSTACK[I]] ~ LP+1;
ACTIVE[RECURSTACK[I]] ~ FALSE; DONE[RECURSTACK[I]] ~ TRUE; ACTIVE[RECURSTACK[I]] ~ FALSE; DONE[RECURSTACK[I]] ~ TRUE;
FOR J ~ STACKMARK[I] UPTO STACKMARK[I+1]-1 DO FOR J ~ STACKMARK[I] UPTO STACKMARK[I+1]-1 DO
IF STACK[J] ! 0 THEN IF STACK[J] ! 0 THEN
BEGIN LP ~ LP+1; LEFTLIST[LP] ~ STACK[J]; BEGIN LP ~ LP+1; LEFTLIST[LP] ~ STACK[J];
IF LP > 1020 THEN IF LP > 1020 THEN
BEGIN WRITE (</"LEFTLIST OVERFLOW"/>); DUMPIT; BEGIN WRITE (PRINTFIL, </"LEFTLIST OVERFLOW"/>);
PRINTLIST(LINX, LEFTLIST); GO TO EXIT DUMPIT;
END; PRINTLIST(LINX, LEFTLIST);
END GO TO EXIT
END; END;
LP ~ LP+1; LEFTLIST[LP] ~ 0; END
EX: RSP ~ X; END;
END; LP ~ LP+1; LEFTLIST[LP] ~ 0;
EX: RSP ~ X;
END;
PROCEDURE SAVERIGHTSYMBOLS(X); VALUE X; INTEGER X; PROCEDURE SAVERIGHTSYMBOLS(X); VALUE X; INTEGER X;
COMMENT ANALOG TO "SAVELEFTSYMBOLS"; COMMENT ANALOG TO "SAVELEFTSYMBOLS";
BEGIN INTEGER I,J; LABEL L,EX; BEGIN INTEGER I,J; LABEL L,EX;
L: IF STACKMARK[X] = STACKMARK[X+1] THEN L: IF STACKMARK[X] = STACKMARK[X+1] THEN
BEGIN X ~ X+1; IF X < RSP THEN GO TO L ELSE GO TO EX END; BEGIN X ~ X+1; IF X < RSP THEN GO TO L ELSE GO TO EX END;
STACKMARK[RSP+1] ~ SP+1; STACKMARK[RSP+1] ~ SP+1;
FOR I ~ X+1 UPTO RSP DO FOR I ~ X+1 UPTO RSP DO
BEGIN RINX[RECURSTACK[I]] ~ RP+1; BEGIN RINX[RECURSTACK[I]] ~ RP+1;
ACTIVE[RECURSTACK[I]] ~ FALSE; DONE[RECURSTACK[I]] ~ TRUE; ACTIVE[RECURSTACK[I]] ~ FALSE; DONE[RECURSTACK[I]] ~ TRUE;
FOR J ~ STACKMARK[I] UPTO STACKMARK[I+1]-1 DO FOR J ~ STACKMARK[I] UPTO STACKMARK[I+1]-1 DO
IF STACK[J] ! 0 THEN IF STACK[J] ! 0 THEN
BEGIN RP ~ RP+1; RIGHTLIST[RP] ~ STACK[J]; BEGIN RP ~ RP+1; RIGHTLIST[RP] ~ STACK[J];
IF RP > 1020 THEN IF RP > 1020 THEN
BEGIN WRITE (</"RIGHTLIST OVERFLOW"/>); DUMPIT; BEGIN WRITE (PRINTFIL, </"RIGHTLIST OVERFLOW"/>);
PRINTLIST(RINX,RIGHTLIST); GO TO EXIT DUMPIT;
END; PRINTLIST(RINX,RIGHTLIST); GO TO EXIT
END END;
END; END
RP ~ RP+1; RIGHTLIST[RP] ~ 0; END;
EX: RSP ~ X; RP ~ RP+1; RIGHTLIST[RP] ~ 0;
END; EX: RSP ~ X;
END;
PROCEDURE BUILDLEFTLIST(X); VALUE X; INTEGER X; PROCEDURE BUILDLEFTLIST(X); VALUE X; INTEGER X;
COMMENT THE LEFTLIST OF THE SYMBOL X IS BUILT BY SCANNING THE COMMENT THE LEFTLIST OF THE SYMBOL X IS BUILT BY SCANNING THE
SYNTAX FOR PRODUCTIONS WITH LEFTPART = X. THE LEFTMOST SYMBOL IN SYNTAX FOR PRODUCTIONS WITH LEFTPART = X. THE LEFTMOST SYMBOL IN
THE RIGHTPART IS THEN INSPECTED: IF IT IS NONBASIC AND NOT MARKED THE RIGHTPART IS THEN INSPECTED: IF IT IS NONBASIC AND NOT MARKED
DONE, ITS LEFTLIST IS BUILT FIRST. WHILE A SYMBOL IS BEING INSPECTED DONE, ITS LEFTLIST IS BUILT FIRST. WHILE A SYMBOL IS BEING INSPECTED
IT IS MARKED ACTIVE; IT IS MARKED ACTIVE;
BEGIN INTEGER I,R,OWNRSP; BEGIN INTEGER I,R,OWNRSP;
ACTIVE[X] ~ TRUE; ACTIVE[X] ~ TRUE;
RSP ~ OWNRSP ~ LINX[X] ~ RSP+1; RSP ~ OWNRSP ~ LINX[X] ~ RSP+1;
RECURSTACK[RSP] ~ X; STACKMARK[RSP] ~ SP+1; RECURSTACK[RSP] ~ X; STACKMARK[RSP] ~ SP+1;
FOR I ~ 1 UPTO N DO FOR I ~ 1 UPTO N DO
IF REF[I,0] = X THEN IF REF[I,0] = X THEN
BEGIN IF OWNRSP < RSP THEN SAVELEFTSYMBOLS(OWNRSP); BEGIN IF OWNRSP < RSP THEN SAVELEFTSYMBOLS(OWNRSP);
R ~ REF[I,1]; PUTINTOSTACK(R); R ~ REF[I,1]; PUTINTOSTACK(R);
IF R { LT THEN IF R { LT THEN
BEGIN IF DONE[R] THEN COPYLEFTSYMBOLS(R) ELSE BEGIN IF DONE[R] THEN COPYLEFTSYMBOLS(R) ELSE
IF ACTIVE[R] THEN RESET(LINX[R]) ELSE IF ACTIVE[R] THEN RESET(LINX[R]) ELSE
BUILDLEFTLIST(R); BUILDLEFTLIST(R);
END END
END; END;
END; END;
PROCEDURE BUILDRIGHTLIST(X); VALUE X; INTEGER X; PROCEDURE BUILDRIGHTLIST(X); VALUE X; INTEGER X;
COMMENT ANALOG TO "BUILDLEFTLIST"; COMMENT ANALOG TO "BUILDLEFTLIST";
BEGIN INTEGER I,R,OWNRSP; LABEL QQ; BEGIN INTEGER I,R,OWNRSP; LABEL QQ;
ACTIVE[X] ~ TRUE; ACTIVE[X] ~ TRUE;
RSP ~ OWNRSP ~ RINX[X] ~ RSP+1; RSP ~ OWNRSP ~ RINX[X] ~ RSP+1;
RECURSTACK[RSP] ~ X; STACKMARK[RSP] ~ SP+1; RECURSTACK[RSP] ~ X; STACKMARK[RSP] ~ SP+1;
FOR I ~ 1 UPTO N DO FOR I ~ 1 UPTO N DO
IF REF[I,0] = X THEN IF REF[I,0] = X THEN
BEGIN IF OWNRSP < RSP THEN SAVERIGHTSYMBOLS(OWNRSP); BEGIN IF OWNRSP < RSP THEN SAVERIGHTSYMBOLS(OWNRSP);
FOR R ~ 2,3,4,5 DO IF REF[I,R] = 0 THEN GO TO QQ; FOR R ~ 2,3,4,5 DO IF REF[I,R] = 0 THEN GO TO QQ;
QQ: R ~ REF[I,R-1]; PUTINTOSTACK(R); QQ: R ~ REF[I,R-1]; PUTINTOSTACK(R);
IF R { LT THEN IF R { LT THEN
BEGIN IF DONE[R] THEN COPYRIGHTSYMBOLS(R) ELSE BEGIN IF DONE[R] THEN COPYRIGHTSYMBOLS(R) ELSE
IF ACTIVE[R] THEN RESET(RINX[R]) ELSE IF ACTIVE[R] THEN RESET(RINX[R]) ELSE
BUILDRIGHTLIST(R); BUILDRIGHTLIST(R);
END END
END END
END; END;
SP ~ RSP ~ LP ~ 0; SP ~ RSP ~ LP ~ 0;
FOR I ~ 1 UPTO LT DO DONE[I] ~ FALSE; FOR I ~ 1 UPTO LT DO DONE[I] ~ FALSE;
FOR I ~ 1 UPTO LT DO IF NOT DONE[I] THEN FOR I ~ 1 UPTO LT DO IF NOT DONE[I] THEN
BEGIN SP ~ RSP ~ 0; BEGIN SP ~ RSP ~ 0;
FOR J ~ 1 UPTO M DO INSTACK[J] ~ 0; FOR J ~ 1 UPTO M DO INSTACK[J] ~ 0;
BUILDLEFTLIST(I); SAVELEFTSYMBOLS(0); BUILDLEFTLIST(I); SAVELEFTSYMBOLS(0);
END; END;
WRITE ([PAGE]); WRITE (<X20,"*** LEFTMOST SYMBOLS ***"/>); WRITE (PRINTFIL [PAGE]);
PRINTLIST(LINX, LEFTLIST); WRITE (PRINTFIL, <X20,"*** LEFTMOST SYMBOLS ***"/>);
SP ~ RSP ~ RP ~ 0; PRINTLIST(LINX, LEFTLIST);
FOR I ~ 1 UPTO LT DO DONE[I] ~ FALSE; SP ~ RSP ~ RP ~ 0;
FOR I ~ 1 UPTO LT DO IF NOT DONE[I] THEN FOR I ~ 1 UPTO LT DO DONE[I] ~ FALSE;
BEGIN SP ~ RSP ~ 0; FOR I ~ 1 UPTO LT DO IF NOT DONE[I] THEN
FOR J ~ 1 UPTO M DO INSTACK[J] ~ 0; BEGIN SP ~ RSP ~ 0;
BUILDRIGHTLIST(I); SAVERIGHTSYMBOLS(0); FOR J ~ 1 UPTO M DO INSTACK[J] ~ 0;
END; BUILDRIGHTLIST(I); SAVERIGHTSYMBOLS(0);
WRITE ([3]); WRITE (<X20,"*** RIGHTMOST SYMBOLS ***"/>); END;
PRINTLIST(RINX, RIGHTLIST); WRITE (PRINTFIL [3]);
WRITE (PRINTFIL, <X20,"*** RIGHTMOST SYMBOLS ***"/>);
PRINTLIST(RINX, RIGHTLIST);
END BLOCK C1; END BLOCK C1;
BEGIN COMMENT BLOCK C2, BUILD PRECEDENCE RELATIONS; BEGIN COMMENT BLOCK C2, BUILD PRECEDENCE RELATIONS;
INTEGER J,K,P,Q,R,L,T; INTEGER J,K,P,Q,R,L,T;
LABEL NEXTPRODUCTION; LABEL NEXTPRODUCTION;
PROCEDURE ENTER(X,Y,S); VALUE X,Y,S; INTEGER X,Y,S; PROCEDURE ENTER(X,Y,S); VALUE X,Y,S; INTEGER X,Y,S;
COMMENT ENTER THE RELATION S INTO POSITION [X,Y]. CHECK FOR DOUBLE- COMMENT ENTER THE RELATION S INTO POSITION [X,Y]. CHECK FOR DOUBLE-
OCCUPATION OF THIS POSITION; OCCUPATION OF THIS POSITION;
BEGIN T ~ H[X,Y]; IF T ! NULL AND T ! S THEN BEGIN T ~ H[X,Y]; IF T ! NULL AND T ! S THEN
BEGIN ERRORFLAG ~ TRUE; BEGIN ERRORFLAG ~ TRUE;
WRITE (<"PRECEDENCE VIOLATED BY ",2A1," FOR PAIR",2I4, WRITE (PRINTFIL,
" BY PRODUCTION",I4>, T, S, X, Y, J); <"PRECEDENCE VIOLATED BY ",2A1,
END; " FOR PAIR",2I4,
H[X,Y] ~ S; " BY PRODUCTION",I4>, T, S, X, Y, J);
END; END;
WRITE ([PAGE]); H[X,Y] ~ S;
FOR K ~ 1 UPTO M DO END;
FOR J ~ 1 UPTO M DO H[K,J] ~ NULL; WRITE (PRINTFIL [PAGE]);
FOR J ~ 1 UPTO N DO FOR K ~ 1 UPTO M DO
BEGIN FOR K ~ 2,3,4,5 DO IF REF[J,K] ! 0 THEN FOR J ~ 1 UPTO M DO H[K,J] ~ NULL;
BEGIN P ~ REF[J,K-1]; Q ~ REF[J,K]; FOR J ~ 1 UPTO N DO
ENTER(P,Q,EQ); BEGIN FOR K ~ 2,3,4,5 DO IF REF[J,K] ! 0 THEN
IF P { LT THEN BEGIN P ~ REF[J,K-1]; Q ~ REF[J,K];
BEGIN FOR R ~ RINX[P],R+1 WHILE RIGHTLIST[R] ! 0 DO ENTER(P,Q,EQ);
ENTER(RIGHTLIST[R],Q,GR); IF P { LT THEN
IF Q { LT THEN BEGIN FOR R ~ RINX[P],R+1 WHILE RIGHTLIST[R] ! 0 DO
FOR L ~ LINX[Q],L+1 WHILE LEFTLIST[L] ! 0 DO ENTER(RIGHTLIST[R],Q,GR);
BEGIN ENTER(P, LEFTLIST[L], LS); IF Q { LT THEN
FOR R ~ RINX[P],R+1 WHILE RIGHTLIST[R] ! 0 DO FOR L ~ LINX[Q],L+1 WHILE LEFTLIST[L] ! 0 DO
ENTER(RIGHTLIST[R],LEFTLIST[L],GR) BEGIN ENTER(P, LEFTLIST[L], LS);
END FOR R ~ RINX[P],R+1 WHILE RIGHTLIST[R] ! 0 DO
END ENTER(RIGHTLIST[R],LEFTLIST[L],GR)
ELSE IF Q { LT THEN END
FOR L ~ LINX[Q],L+1 WHILE LEFTLIST[L] ! 0 DO END
ENTER(P, LEFTLIST[L], LS); ELSE IF Q { LT THEN
END FOR L ~ LINX[Q],L+1 WHILE LEFTLIST[L] ! 0 DO
ELSE GO TO NEXTPRODUCTION; ENTER(P, LEFTLIST[L], LS);
NEXTPRODUCTION: END J; END
WRITE (</X3,39I3/>, FOR J ~ 1 UPTO M DO J); ELSE GO TO NEXTPRODUCTION;
FOR K ~ 1 STEP 1 UNTIL M DO NEXTPRODUCTION: END J;
WRITE (</X3,39(X2,A1)/>, FOR J ~ 1 UPTO M DO H[K,J]); WRITE (PRINTFIL, </X3,39I3/>, FOR J ~ 1 UPTO M DO J);
FOR K ~ 1 STEP 1 UNTIL M DO
WRITE (PRINTFIL, </X3,39(X2,A1)/>, FOR J ~ 1 UPTO M DO H[K,J]);
END BLOCK C2; END BLOCK C2;
END BLOCK B1; END BLOCK B1;
IF ERRORFLAG THEN GO TO EXIT; IF ERRORFLAG THEN GO TO EXIT;
WRITE (</"SYNTAX IS A PRECEDENCE GRAMMAR"/>); WRITE (PRINTFIL, </"SYNTAX IS A PRECEDENCE GRAMMAR"/>);
BEGIN COMMENT BLOCK B2. BUILD F AND G PRECEDENCE FUNCTIONS; BEGIN COMMENT BLOCK B2. BUILD F AND G PRECEDENCE FUNCTIONS;
INTEGER I, J, K,K1, N, FMIN, GMIN, T; INTEGER I, J, K,K1, N, FMIN, GMIN, T;
PROCEDURE THRU(I,J,X); VALUE I,J,X; INTEGER I,J,X; PROCEDURE THRU(I,J,X); VALUE I,J,X; INTEGER I,J,X;
BEGIN WRITE (</"NO PRIORITY FUNCTIONS EXIST ",3I6>, I,J,X); BEGIN WRITE (PRINTFIL,
GO TO EXIT </"NO PRIORITY FUNCTIONS EXIST ",3I6>, I,J,X);
END; GO TO EXIT
END;
PROCEDURE FIXUPCOL(L,J,X); VALUE L,J,X; INTEGER L,J,X; FORWARD; PROCEDURE FIXUPCOL(L,J,X); VALUE L,J,X; INTEGER L,J,X; FORWARD;
PROCEDURE FIXUPROW(I,L,X); VALUE I,L,X; INTEGER I,L,X; PROCEDURE FIXUPROW(I,L,X); VALUE I,L,X; INTEGER I,L,X;
BEGIN INTEGER J; F[I] ~ G[L] + X; BEGIN INTEGER J; F[I] ~ G[L] + X;
IF K1 = K THEN IF K1 = K THEN
BEGIN IF H[I,K]= EQ AND F[I] ! G[K] THEN THRU(I,K,0) ELSE BEGIN IF H[I,K]= EQ AND F[I] ! G[K] THEN THRU(I,K,0) ELSE
IF H[I,K]= LS AND F[I] } G[K] THEN THRU(I,K,0) IF H[I,K]= LS AND F[I] } G[K] THEN THRU(I,K,0)
END; END;
FOR J ~ K1 STEP -1 UNTIL 1 DO FOR J ~ K1 STEP -1 UNTIL 1 DO
IF H[I,J]= EQ AND F[I] ! G[J] THEN FIXUPCOL(I,J,0) ELSE IF H[I,J]= EQ AND F[I] ! G[J] THEN FIXUPCOL(I,J,0) ELSE
IF H[I,J]= LS AND F[I] } G[J] THEN FIXUPCOL(I,J,1); IF H[I,J]= LS AND F[I] } G[J] THEN FIXUPCOL(I,J,1);
END; END;
PROCEDURE FIXUPCOL(L,J,X); VALUE L,J,X; INTEGER L,J,X; PROCEDURE FIXUPCOL(L,J,X); VALUE L,J,X; INTEGER L,J,X;
BEGIN INTEGER I; G[J] ~ F[L] + X; BEGIN INTEGER I; G[J] ~ F[L] + X;
IF K1 ! K THEN IF K1 ! K THEN
BEGIN IF H[K,J] = EQ AND F[K] ! G[J] THEN THRU(K,J,1) ELSE BEGIN IF H[K,J] = EQ AND F[K] ! G[J] THEN THRU(K,J,1) ELSE
IF H[K,J] = GR AND F[K] { G[J] THEN THRU(K,J,1) IF H[K,J] = GR AND F[K] { G[J] THEN THRU(K,J,1)
END; END;
FOR I ~ K STEP -1 UNTIL 1 DO FOR I ~ K STEP -1 UNTIL 1 DO
IF H[I,J] = EQ AND F[I] ! G[J] THEN FIXUPROW(I,J,0) ELSE IF H[I,J] = EQ AND F[I] ! G[J] THEN FIXUPROW(I,J,0) ELSE
IF H[I,J] = GR AND F[I] { G[J] THEN FIXUPROW(I,J,1); IF H[I,J] = GR AND F[I] { G[J] THEN FIXUPROW(I,J,1);
END; END;
K1 ~ 0; K1 ~ 0;
FOR K ~ 1 UPTO M DO FOR K ~ 1 UPTO M DO
BEGIN FMIN ~ 1; BEGIN FMIN ~ 1;
FOR J ~ 1 UPTO K1 DO FOR J ~ 1 UPTO K1 DO
IF H[K,J] = EQ AND FMIN < G[J] THEN FMIN ~ G[J] ELSE IF H[K,J] = EQ AND FMIN < G[J] THEN FMIN ~ G[J] ELSE
IF H[K,J] = GR AND FMIN { G[J] THEN FMIN ~ G[J]+1; IF H[K,J] = GR AND FMIN { G[J] THEN FMIN ~ G[J]+1;
F[K] ~ FMIN; F[K] ~ FMIN;
FOR J ~ K1 STEP -1 UNTIL 1 DO FOR J ~ K1 STEP -1 UNTIL 1 DO
IF H[K,J] = EQ AND FMIN > G[J] THEN FIXUPCOL(K,J,0) ELSE IF H[K,J] = EQ AND FMIN > G[J] THEN FIXUPCOL(K,J,0) ELSE
IF H[K,J] = LS AND FMIN } G[J] THEN FIXUPCOL(K,J,1); IF H[K,J] = LS AND FMIN } G[J] THEN FIXUPCOL(K,J,1);
K1 ~ K1+1; GMIN ~ 1; K1 ~ K1+1; GMIN ~ 1;
FOR I ~ 1 UPTO K DO FOR I ~ 1 UPTO K DO
IF H[I,K]= EQ AND F[I] > GMIN THEN GMIN ~ F[I] ELSE IF H[I,K]= EQ AND F[I] > GMIN THEN GMIN ~ F[I] ELSE
IF H[I,K]= LS AND F[I] } GMIN THEN GMIN ~ F[I]+1; IF H[I,K]= LS AND F[I] } GMIN THEN GMIN ~ F[I]+1;
G[K] ~ GMIN; G[K] ~ GMIN;
FOR I ~ K STEP -1 UNTIL 1 DO FOR I ~ K STEP -1 UNTIL 1 DO
IF H[I,K] = EQ AND F[I] < GMIN THEN FIXUPROW(I,K,0) ELSE IF H[I,K] = EQ AND F[I] < GMIN THEN FIXUPROW(I,K,0) ELSE
IF H[I,K] = GR AND F[I] { GMIN THEN FIXUPROW(I,K,1); IF H[I,K] = GR AND F[I] { GMIN THEN FIXUPROW(I,K,1);
END K; END K;
END BLOCK B2; END BLOCK B2;
WRITE ([PAGE]); WRITE (PRINTFIL [PAGE]);
BEGIN COMMENT BLOCK B3. BUILD TABLES OF PRODUCTION REFERENCES; BEGIN COMMENT BLOCK B3. BUILD TABLES OF PRODUCTION REFERENCES;
INTEGER I,J,K,L; INTEGER I,J,K,L;
INTEGER ARRAY MTB[0:M]; COMMENT MASTER TABLE; INTEGER ARRAY MTB[0:M]; COMMENT MASTER TABLE;
INTEGER ARRAY PRTB[0:1022]; COMMENT PRODUCTION TABLE; INTEGER ARRAY PRTB[0:1022]; COMMENT PRODUCTION TABLE;
L ~ 0; L ~ 0;
FOR I ~ 1 UPTO M DO FOR I ~ 1 UPTO M DO
BEGIN MTB[I] ~ L+1; BEGIN MTB[I] ~ L+1;
FOR J ~ 1 UPTO N DO FOR J ~ 1 UPTO N DO
IF REF[J,1] = I THEN IF REF[J,1] = I THEN
BEGIN FOR K ~ 2,3,4,5 DO BEGIN FOR K ~ 2,3,4,5 DO
IF REF[J,K] ! 0 THEN IF REF[J,K] ! 0 THEN
BEGIN L ~ L+1; PRTB[L] ~ REF[J,K] BEGIN L ~ L+1; PRTB[L] ~ REF[J,K]
END; END;
L ~ L+1; PRTB[L] ~ -J; L ~ L+1; PRTB[L] ~ REF[J,0]; L ~ L+1; PRTB[L] ~ -J; L ~ L+1;
END; PRTB[L] ~ REF[J,0];
L ~ L+1; PRTB[L] ~ 0 END;
END; L ~ L+1; PRTB[L] ~ 0
COMMENT PRINT AND PUNCH THE RESULTS: END;
SYMBOLTABLE, PRECEDENCE FUNCTIONS, SYNTAX REFERENCE TABLES; COMMENT PRINT AND PUNCH THE RESULTS:
WRITE (<X8,"NO.",X5,"SYMBOL",X8, "F",X5,"G",X4,"MTB"/>); SYMBOLTABLE, PRECEDENCE FUNCTIONS, SYNTAX REFERENCE TABLES;
FOR I ~ 1 UPTO M DO WRITE (PRINTFIL, <X8,"NO.",X5,"SYMBOL",X8,
BEGIN SETTEXT(I,SYTB[I],F[I],G[I], MTB[I], WRITEBUFFER[0]); "F",X5,"G",X4,"MTB"/>);
OUTPUT FOR I ~ 1 UPTO M DO
END; BEGIN SETTEXT(I,SYTB[I],F[I],G[I], MTB[I], WRITEBUFFER[0]);
WRITE (</"PRODUCTION TABLE:"/>); OUTPUT
FOR I ~ 0 STEP 10 UNTIL L DO END;
WRITE (<I9,X2,10I6>, FOR I ~ 0 STEP 10 UNTIL L DO WRITE (PRINTFIL, </"PRODUCTION TABLE:"/>);
[I, FOR J ~ I UPTO I+9 DO PRTB[J]]); FOR I ~ 0 STEP 10 UNTIL L DO
WRITE (</"SYNTAX VERSION ",A5>, TIME(0)); WRITE (PRINTFIL, <I9,X2,10I6>,
WRITE (PCH, <X4,"FT ~",I3,"; LT ~",I4,"; LP ~",I4,";">,LT+1,M,L); FOR I ~ 0 STEP 10 UNTIL L DO
FOR I ~ 1 STEP 6 UNTIL M DO [I, FOR J ~ I UPTO I+9 DO PRTB[J]]);
BEGIN PCHTX(SYTB[I], WRITEBUFFER[0], IF M-I } 6 THEN 6 ELSE M-I+1); WRITE (PRINTFIL, </"SYNTAX VERSION ",A5>, TIME(0));
WRITE (PCH,10,WRITEBUFFER[*]); CLEAR(WRITEBUFFER[0],9) WRITE (PCH, <X4,"FT ~",I3,"; LT ~",I4,"; LP ~",I4,";">,
END; LT+1,M,L);
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO M DO F[I]); FOR I ~ 1 STEP 6 UNTIL M DO
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO M DO G[I]); BEGIN PCHTX(SYTB[I], WRITEBUFFER[0],
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO M DO MTB[I]); IF M-I } 6 THEN 6 ELSE M-I+1);
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO L DO PRTB[I]); WRITE (PCH,10,WRITEBUFFER[*]);
CLEAR(WRITEBUFFER[0],9)
END;
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO M DO F[I]);
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO M DO G[I]);
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO M DO MTB[I]);
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO L DO PRTB[I]);
END BLOCK B3 END BLOCK B3
END BLOCK A; END BLOCK A;