mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-01-17 00:22:10 +00:00
Commit James Fehlinger's updates to the EULER IV system as of 2014-03-25.
This commit is contained in:
parent
2237be9923
commit
6b53be5e6d
@ -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.;
|
||||
|
||||
BEGIN COMMENT E U L E R IV TRANSLATOR N.WIRTH;
|
||||
DEFINE MARK = 119#, IDSYM = 63#, REFSYM = 59#, LABSYM = 62#;
|
||||
DEFINE VALSYM = 56#, CALLSYM = 55#, UNDEF = 0#, NEWSYM = 60#;
|
||||
DEFINE UNARYMINUS = 116#, NUMSYM = 68#, BOOLSYM = 64#;
|
||||
DEFINE LISTSYM = 102#, SYMSYM = 113#, FORSYM = 61#;
|
||||
DEFINE NAME = V[0]#;
|
||||
DEFINE MARK =119#, IDSYM =63#, REFSYM =59#, LABSYM =62#;
|
||||
DEFINE VALSYM =56#, CALLSYM =55#, UNDEF =0#, NEWSYM =60#;
|
||||
DEFINE UNARYMINUS =116#, NUMSYM =68#, BOOLSYM =64#;
|
||||
DEFINE LISTSYM =102#, SYMSYM =113#, FORSYM =61#;
|
||||
DEFINE NAME =V[0]#;
|
||||
INTEGER I,J,K,M,N,R,T,T1,SCALE; BOOLEAN ERRORFLAG;
|
||||
INTEGER BN, ON; COMMENT BLOCK- AND ORDER-NUMBER;
|
||||
INTEGER NP; COMMENT NAME LIST POINTER;
|
||||
|
||||
@ -1,430 +1,451 @@
|
||||
BEGIN COMMENT SYNTAX-PROCESSOR. NIKLAUS WIRTH DEC.1964;
|
||||
DEFINE NSY =150#; COMMENT MAX. NO. OF SYMBOLS;
|
||||
DEFINE NPR =150#; COMMENT MAX. NO. OF PRODUCTIONS;
|
||||
DEFINE UPTO = STEP 1 UNTIL #;
|
||||
DEFINE LS = "<" #, EQ = "=" #, GR = ">" #, NULL = "" #;
|
||||
FILE OUT PCH 0 (2,10); COMMENT PUNCH FILE;
|
||||
INTEGER LT; COMMENT NUMBER OF LAST NONBASIC SYMBOL;
|
||||
INTEGER K,M,N, MAX, OLDN; BOOLEAN ERRORFLAG;
|
||||
ALPHA ARRAY READBUFFER[0:9], WRITEBUFFER[0:14];
|
||||
ALPHA ARRAY TEXT[0:11]; COMMENT AUXILIARY TEXT ARRAY;
|
||||
ALPHA ARRAY SYTB[0:NSY]; COMMENT SYMBOLTABLE;
|
||||
INTEGER ARRAY REF[0:NPR,0:5]; COMMENT SYNTAX REFERENCE TABLE;
|
||||
LABEL START,EXIT;
|
||||
LABEL A,B,C,E,F,G;
|
||||
DEFINE NSY =180#; COMMENT MAX. NO. OF SYMBOLS;
|
||||
DEFINE NPR =180#; COMMENT MAX. NO. OF PRODUCTIONS;
|
||||
DEFINE UPTO =STEP 1 UNTIL#;
|
||||
DEFINE LS ="<"#, EQ ="="#, GR =">"#, NULL =" "#;
|
||||
FILE IN CARDFIL (1,10); FILE PRINTFIL 1 (1,15);
|
||||
FILE OUT PCH 0 (2,10); COMMENT PUNCH FILE;
|
||||
INTEGER LT; COMMENT NUMBER OF LAST NONBASIC SYMBOL;
|
||||
INTEGER K,M,N, MAX, OLDN; BOOLEAN ERRORFLAG;
|
||||
ALPHA ARRAY READBUFFER[0:9], WRITEBUFFER[0:14];
|
||||
ALPHA ARRAY TEXT[0:11]; COMMENT AUXILIARY TEXT ARRAY;
|
||||
ALPHA ARRAY SYTB[0:NSY]; COMMENT SYMBOLTABLE;
|
||||
INTEGER ARRAY REF[0:NPR,0:5]; COMMENT SYNTAX REFERENCE TABLE;
|
||||
LABEL START,EXIT;
|
||||
LABEL A,B,C,E,F,G;
|
||||
|
||||
STREAM PROCEDURE CLEAR(D,N); VALUE N;
|
||||
BEGIN DI ~ D; DS ~ 8 LIT " "; SI ~ D; DS ~ N WDS
|
||||
END;
|
||||
BEGIN DI ~ D; DS ~ 8 LIT " "; SI ~ D; DS ~ N WDS
|
||||
END;
|
||||
STREAM PROCEDURE MARK(D,S); VALUE S;
|
||||
BEGIN DI ~ D; SI ~ LOC S; SI ~ SI+7; DS ~ CHR
|
||||
END;
|
||||
BEGIN DI ~ D; SI ~ LOC S; SI ~ SI+7; DS ~ CHR
|
||||
END;
|
||||
BOOLEAN STREAM PROCEDURE FINIS(S);
|
||||
BEGIN TALLY ~ 1; SI ~ S; IF SC = "*" THEN FINIS ~ TALLY
|
||||
END;
|
||||
BEGIN TALLY ~ 1; SI ~ S; IF SC = "*" THEN FINIS ~ TALLY
|
||||
END;
|
||||
STREAM PROCEDURE EDIT(S,D,N);
|
||||
BEGIN DI ~ D; SI ~ N; DS ~ 3 DEC; SI ~ S; DS ~ 9 WDS;
|
||||
END;
|
||||
BEGIN DI ~ D; SI ~ N; DS ~ 3 DEC; SI ~ S; DS ~ 9 WDS;
|
||||
END;
|
||||
STREAM PROCEDURE MOVE(S,D);
|
||||
BEGIN SI ~ S; DI ~ D; DS ~ WDS;
|
||||
END;
|
||||
BEGIN SI ~ S; DI ~ D; DS ~ WDS;
|
||||
END;
|
||||
STREAM PROCEDURE MOVETEXT(S,D,N); VALUE N;
|
||||
BEGIN DI ~ D; SI ~ S; DS ~ N WDS;
|
||||
END;
|
||||
BEGIN DI ~ D; SI ~ S; DS ~ N WDS;
|
||||
END;
|
||||
BOOLEAN STREAM PROCEDURE EQUAL(S,D);
|
||||
BEGIN SI ~ S; DI ~ D; TALLY ~ 1; IF 8 SC = DC THEN EQUAL ~ TALLY;
|
||||
END;
|
||||
BEGIN SI ~ S; DI ~ D; TALLY ~ 1; IF 8 SC = DC THEN EQUAL ~ TALLY;
|
||||
END;
|
||||
STREAM PROCEDURE SCAN(S,DD,N);
|
||||
BEGIN LABEL A,B,C,D,E;
|
||||
SI ~ S; DI ~ DD; DS ~ 48 LIT "0"; DI ~ DD; SI ~ SI+1;
|
||||
IF SC = " " THEN DI ~ DI+8;
|
||||
A: IF SC = " " THEN BEGIN SI ~ SI+1; GO TO A END;
|
||||
IF SC > "9" THEN GO TO D;
|
||||
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;
|
||||
C: SI ~ SI+1; GO TO A;
|
||||
D: DI ~ N; SI ~ SI+5; DS ~ 3 OCT
|
||||
END;
|
||||
BEGIN LABEL A,B,C,D,E;
|
||||
SI ~ S; DI ~ DD; DS ~ 48 LIT "0"; DI ~ DD; SI ~ SI+1;
|
||||
IF SC = " " THEN DI ~ DI+8;
|
||||
A: IF SC = " " THEN BEGIN SI ~ SI+1; GO TO A END;
|
||||
IF SC > "9" THEN GO TO D;
|
||||
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;
|
||||
C: SI ~ SI+1; GO TO A;
|
||||
D: DI ~ N; SI ~ SI+5; DS ~ 3 OCT
|
||||
END;
|
||||
STREAM PROCEDURE EDITTEXT(S,D,N); VALUE N;
|
||||
BEGIN SI ~ S; DI ~ D; DI ~ DI+10; N(DI ~ DI+2; DS ~ 8 CHR)
|
||||
END;
|
||||
BEGIN SI ~ S; DI ~ D; DI ~ DI+10; N(DI ~ DI+2; DS ~ 8 CHR)
|
||||
END;
|
||||
STREAM PROCEDURE SETTEXT(A,B,C,D,E,Z);
|
||||
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+3; SI ~ E; DS ~ 3 DEC;
|
||||
END;
|
||||
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+3; SI ~ E; DS ~ 3 DEC;
|
||||
END;
|
||||
STREAM PROCEDURE PCHTX(S,D,N); VALUE N;
|
||||
BEGIN SI ~ S; DI ~ D; DI ~ DI+4;
|
||||
N(DS ~ LIT """; DS ~ 8 CHR; DS ~ LIT """; DS ~ LIT ",");
|
||||
END;
|
||||
BEGIN SI ~ S; DI ~ D; DI ~ DI+4;
|
||||
N(DS ~ LIT """; DS ~ 8 CHR; DS ~ LIT """; DS ~ LIT ",");
|
||||
END;
|
||||
PROCEDURE INPUT;
|
||||
READ (CARDFIL, 10, READBUFFER[*]) [EXIT];
|
||||
READ (CARDFIL, 10, READBUFFER[*]) [EXIT];
|
||||
PROCEDURE OUTPUT;
|
||||
BEGIN WRITE (PRINTFIL, 15, WRITEBUFFER[*]);
|
||||
CLEAR(WRITEBUFFER[0], 14);
|
||||
END;
|
||||
BEGIN WRITE (PRINTFIL, 15, WRITEBUFFER[*]);
|
||||
CLEAR(WRITEBUFFER[0], 14);
|
||||
END;
|
||||
INTEGER PROCEDURE INX(X); REAL X;
|
||||
BEGIN INTEGER I; LABEL F;
|
||||
FOR I ~ 0 UPTO M DO
|
||||
IF EQUAL(SYTB[I], X) THEN GO TO F;
|
||||
WRITE (<"UNDEFINED SYMBOL">); ERRORFLAG ~ TRUE;
|
||||
F: INX ~ I;
|
||||
END;
|
||||
BEGIN INTEGER I; LABEL F;
|
||||
FOR I ~ 0 UPTO M DO
|
||||
IF EQUAL(SYTB[I], X) THEN GO TO F;
|
||||
WRITE (PRINTFIL, <"UNDEFINED SYMBOL">);
|
||||
ERRORFLAG ~ TRUE;
|
||||
F: INX ~ I;
|
||||
END;
|
||||
|
||||
START:
|
||||
FOR N ~ 0 UPTO 5 DO
|
||||
FOR M ~ 0 UPTO NPR DO REF[M,N] ~ 0;
|
||||
M ~ N ~ MAX ~ OLDN ~ 0; ERRORFLAG ~ FALSE;
|
||||
CLEAR(WRITEBUFFER[0],14);
|
||||
COMMENT READ LIST OF SYMBOLS, ONE SYMBOL MUST APPEAR PER CARD,
|
||||
STARTING IN COL.9 (8 CHARS. ARE SIGNIFICANT), THE LIST OF NON-
|
||||
BASIC SYMBOLS IS FOLLOWED BY AN ENDCARD ("*" IN COL.1). THEN
|
||||
FOLLOWS THE LIST OF BASIC SYMBOLS AND AGAIN AN ENDCARD;
|
||||
WRITE (< "NONBASIC SYMBOLS:">);
|
||||
FOR N ~ 0 UPTO 5 DO
|
||||
FOR M ~ 0 UPTO NPR DO REF[M,N] ~ 0;
|
||||
M ~ N ~ MAX ~ OLDN ~ 0; ERRORFLAG ~ FALSE;
|
||||
CLEAR(WRITEBUFFER[0],14);
|
||||
COMMENT READ LIST OF SYMBOLS, ONE SYMBOL MUST APPEAR PER CARD,
|
||||
STARTING IN COL.9 (8 CHARS. ARE SIGNIFICANT), THE LIST OF NON-
|
||||
BASIC SYMBOLS IS FOLLOWED BY AN ENDCARD ("*" IN COL.1). THEN
|
||||
FOLLOWS THE LIST OF BASIC SYMBOLS AND AGAIN AN ENDCARD;
|
||||
WRITE (PRINTFIL, < "NONBASIC SYMBOLS:">);
|
||||
A: INPUT;
|
||||
IF FINIS(READBUFFER[0]) THEN GO TO E;
|
||||
M ~ M+1;
|
||||
MOVE(READBUFFER[1], SYTB[M]);
|
||||
EDIT(READBUFFER[0], WRITEBUFFER[1], M);
|
||||
OUTPUT; GO TO A;
|
||||
E: WRITE (</"BASIC SYMBOLS:">); LT ~ M;
|
||||
IF FINIS(READBUFFER[0]) THEN GO TO E;
|
||||
M ~ M+1;
|
||||
MOVE(READBUFFER[1], SYTB[M]);
|
||||
EDIT(READBUFFER[0], WRITEBUFFER[1], M);
|
||||
OUTPUT; GO TO A;
|
||||
E: WRITE (PRINTFIL, </"BASIC SYMBOLS:">); LT ~ M;
|
||||
F: INPUT;
|
||||
IF FINIS(READBUFFER[0]) THEN GO TO G;
|
||||
M ~ M + 1;
|
||||
MOVE(READBUFFER[1], SYTB[M]);
|
||||
EDIT(READBUFFER[0], WRITEBUFFER[1], M);
|
||||
OUTPUT; GO TO F;
|
||||
IF FINIS(READBUFFER[0]) THEN GO TO G;
|
||||
M ~ M + 1;
|
||||
MOVE(READBUFFER[1], SYTB[M]);
|
||||
EDIT(READBUFFER[0], WRITEBUFFER[1], M);
|
||||
OUTPUT; GO TO F;
|
||||
|
||||
COMMENT READ THE LIST OF PRODUCTIONS, ONE PER CARD. THE LEFTPART
|
||||
IS A NONBASIC SYMBOL STARTING IN COL.2. NO FORMAT IS PRESCRIBED
|
||||
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
|
||||
IS SUBSTITUTED. THE MAX. LENGTH OF A PRODUCTION IS 6 SYMBOLS;
|
||||
G: WRITE (</"SYNTAX:">);
|
||||
COMMENT READ THE LIST OF PRODUCTIONS, ONE PER CARD. THE LEFTPART
|
||||
IS A NONBASIC SYMBOL STARTING IN COL.2. NO FORMAT IS PRESCRIBED
|
||||
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
|
||||
IS SUBSTITUTED. THE MAX. LENGTH OF A PRODUCTION IS 6 SYMBOLS;
|
||||
G: WRITE (PRINTFIL, </"SYNTAX:">);
|
||||
B: INPUT;
|
||||
IF FINIS(READBUFFER[0]) THEN GO TO C;
|
||||
MOVETEXT(READBUFFER[0], WRITEBUFFER[1], 10); OUTPUT;
|
||||
MARK(READBUFFER[9], 12); SCAN(READBUFFER[0],TEXT[0],N);
|
||||
IF N { 0 OR N > NPR OR REF[N,0] ! 0 THEN
|
||||
BEGIN WRITE (<"UNACCEPTABLE TAG">); ERRORFLAG ~ TRUE; GO TO B
|
||||
END;
|
||||
IF N > MAX THEN MAX ~ N;
|
||||
COMMENT THE SYNTAX IS STORED IN REF, EACH SYMBOL REPRESENTED BY
|
||||
ITS INDEX IN THE SYMBOL-TABLE;
|
||||
FOR K ~ 0 UPTO 5 DO REF[N,K] ~ INX(TEXT[K]);
|
||||
IF REF[N,0] = 0 THEN REF[N,0] ~ REF[OLDN,0] ELSE
|
||||
IF REF[N,0] > LT THEN
|
||||
BEGIN WRITE (<"ILLEGAL PRODUCTION">); ERRORFLAG ~ TRUE END;
|
||||
OLDN ~ N; GO TO B;
|
||||
IF FINIS(READBUFFER[0]) THEN GO TO C;
|
||||
MOVETEXT(READBUFFER[0], WRITEBUFFER[1], 10); OUTPUT;
|
||||
MARK(READBUFFER[9], 12); SCAN(READBUFFER[0],TEXT[0],N);
|
||||
IF N { 0 OR N > NPR OR REF[N,0] ! 0 THEN
|
||||
BEGIN WRITE (PRINTFIL, <"UNACCEPTABLE TAG">);
|
||||
ERRORFLAG ~ TRUE; GO TO B
|
||||
END;
|
||||
IF N > MAX THEN MAX ~ N;
|
||||
COMMENT THE SYNTAX IS STORED IN REF, EACH SYMBOL REPRESENTED BY
|
||||
ITS INDEX IN THE SYMBOL-TABLE;
|
||||
FOR K ~ 0 UPTO 5 DO REF[N,K] ~ INX(TEXT[K]);
|
||||
IF REF[N,0] = 0 THEN REF[N,0] ~ REF[OLDN,0] ELSE
|
||||
IF REF[N,0] > LT THEN
|
||||
BEGIN WRITE (PRINTFIL, <"ILLEGAL PRODUCTION">);
|
||||
ERRORFLAG ~ TRUE END;
|
||||
OLDN ~ N; GO TO B;
|
||||
C: IF ERRORFLAG THEN GO TO EXIT;
|
||||
N ~ MAX;
|
||||
COMMENT M IS THE LENGTH OF THE SYMBOL-TABLE, N OF THE REF-TABLE;
|
||||
N ~ MAX;
|
||||
COMMENT M IS THE LENGTH OF THE SYMBOL-TABLE, N OF THE REF-TABLE;
|
||||
|
||||
BEGIN COMMENT BLOCK A;
|
||||
INTEGER ARRAY H[0:M, 0:M]; COMMENT PRECEDENCE MATRIX;
|
||||
INTEGER ARRAY F, G [0:M]; COMMENT PRECEDENCE FUNCTIONS;
|
||||
INTEGER ARRAY H[0:M, 0:M]; COMMENT PRECEDENCE MATRIX;
|
||||
INTEGER ARRAY F, G [0:M]; COMMENT PRECEDENCE FUNCTIONS;
|
||||
BEGIN COMMENT BLOCK B1;
|
||||
INTEGER ARRAY LINX, RINX [0:LT]; COMMENT LEFT / RIGHT INDICES;
|
||||
INTEGER ARRAY LEFTLIST, RIGHTLIST[0:1022];
|
||||
INTEGER ARRAY LINX, RINX [0:LT]; COMMENT LEFT / RIGHT INDICES;
|
||||
INTEGER ARRAY LEFTLIST, RIGHTLIST[0:1022];
|
||||
BEGIN COMMENT BLOCK C1, BUILD LEFT- AND RIGHT-SYMBOL LISTS;
|
||||
INTEGER I,J;
|
||||
INTEGER SP, RSP; COMMENT STACK- AND RECURSTACK-POINTERS;
|
||||
INTEGER LP, RP; COMMENT LEFT/RIGHT LIST POINTERS;
|
||||
INTEGER ARRAY INSTACK[0:M];
|
||||
BOOLEAN ARRAY DONE, ACTIVE [0:LT];
|
||||
INTEGER ARRAY RECURSTACK, STACKMARK [0:LT+1];
|
||||
INTEGER ARRAY STACK[0:1022]; COMMENT HERE THE LISTS ARE BUILT;
|
||||
INTEGER I,J;
|
||||
INTEGER SP, RSP; COMMENT STACK- AND RECURSTACK-POINTERS;
|
||||
INTEGER LP, RP; COMMENT LEFT/RIGHT LIST POINTERS;
|
||||
INTEGER ARRAY INSTACK[0:M];
|
||||
BOOLEAN ARRAY DONE, ACTIVE [0:LT];
|
||||
INTEGER ARRAY RECURSTACK, STACKMARK [0:LT+1];
|
||||
INTEGER ARRAY STACK[0:1022]; COMMENT HERE THE LISTS ARE BUILT;
|
||||
|
||||
PROCEDURE PRINTLIST(LX,L); ARRAY LX, L [0];
|
||||
BEGIN INTEGER I,J,K;
|
||||
FOR I ~ 1 UPTO LT DO IF DONE[I] THEN
|
||||
BEGIN K ~ 0; MOVE(SYTB[I], WRITEBUFFER[0]);
|
||||
FOR J ~ LX[I],J+1 WHILE L[J] ! 0 DO
|
||||
BEGIN MOVE(SYTB[L[J]], TEXT[K]); K ~ K+1;
|
||||
IF K } 10 THEN
|
||||
BEGIN EDITTEXT(TEXT[0], WRITEBUFFER[0],10); OUTPUT;
|
||||
K ~ 0;
|
||||
END;
|
||||
END;
|
||||
IF K > 0 THEN
|
||||
BEGIN EDITTEXT(TEXT[0], WRITEBUFFER[0], K); OUTPUT END;
|
||||
END
|
||||
END;
|
||||
BEGIN INTEGER I,J,K;
|
||||
FOR I ~ 1 UPTO LT DO IF DONE[I] THEN
|
||||
BEGIN K ~ 0; MOVE(SYTB[I], WRITEBUFFER[0]);
|
||||
FOR J ~ LX[I],J+1 WHILE L[J] ! 0 DO
|
||||
BEGIN MOVE(SYTB[L[J]], TEXT[K]); K ~ K+1;
|
||||
IF K } 10 THEN
|
||||
BEGIN EDITTEXT(TEXT[0], WRITEBUFFER[0],10);OUTPUT;
|
||||
K ~ 0;
|
||||
END;
|
||||
END;
|
||||
IF K > 0 THEN
|
||||
BEGIN EDITTEXT(TEXT[0], WRITEBUFFER[0], K);
|
||||
OUTPUT END;
|
||||
END
|
||||
END;
|
||||
PROCEDURE DUMPIT;
|
||||
BEGIN INTEGER I,J; WRITE ([PAGE]);
|
||||
WRITE (<X9,"DONE ACTIVE LINX RINX">);
|
||||
WRITE (<5I6>, FOR I ~ 1 UPTO LT DO
|
||||
[I, DONE[I], ACTIVE[I], LINX[I], RINX[I]]);
|
||||
WRITE (</"STACK: SP =",I3>, SP);
|
||||
WRITE (<I10,": ",10I6>, FOR I ~ 0 STEP 10 UNTIL SP DO
|
||||
[I, FOR J ~ I UPTO I+9 DO STACK[J]]);
|
||||
WRITE (</"RECURSTACK:">);
|
||||
WRITE (<3I6>, FOR I ~ 1 UPTO RSP DO
|
||||
[I, RECURSTACK[I], STACKMARK[I]]);
|
||||
END;
|
||||
BEGIN INTEGER I,J; WRITE (PRINTFIL [PAGE]);
|
||||
WRITE (PRINTFIL, <X9,"DONE ACTIVE LINX RINX">);
|
||||
WRITE (PRINTFIL, <5I6>, FOR I ~ 1 UPTO LT DO
|
||||
[I, DONE[I], ACTIVE[I], LINX[I], RINX[I]]);
|
||||
WRITE (PRINTFIL, </"STACK: SP =",I3>, SP);
|
||||
WRITE (PRINTFIL, <I10,": ",10I6>,
|
||||
FOR I ~ 0 STEP 10 UNTIL SP DO
|
||||
[I, FOR J ~ I UPTO I+9 DO STACK[J]]);
|
||||
WRITE (PRINTFIL, </"RECURSTACK:">);
|
||||
WRITE (PRINTFIL, <3I6>, FOR I ~ 1 UPTO RSP DO
|
||||
[I, RECURSTACK[I], STACKMARK[I]]);
|
||||
END;
|
||||
PROCEDURE RESET(X); VALUE X; INTEGER X;
|
||||
BEGIN INTEGER I;
|
||||
FOR I ~ X UPTO RSP DO STACKMARK[I] ~ STACKMARK[X];
|
||||
END;
|
||||
BEGIN INTEGER I;
|
||||
FOR I ~ X UPTO RSP DO STACKMARK[I] ~ STACKMARK[X];
|
||||
END;
|
||||
PROCEDURE PUTINTOSTACK(X); VALUE X; INTEGER X;
|
||||
COMMENT X IS PUT INTO THE WORKSTACK. DUPLICATION IS AVOIDED!
|
||||
BEGIN IF INSTACK[X] = 0 THEN
|
||||
BEGIN SP ~ SP+1; STACK[SP] ~ X; INSTACK[X] ~ SP END
|
||||
ELSE IF INSTACK[X] < STACKMARK[RSP] THEN
|
||||
BEGIN SP ~ SP+1; STACK[SP] ~ X;
|
||||
STACK[INSTACK[X]] ~ 0; INSTACK[X] ~ SP;
|
||||
END;
|
||||
IF SP > 1020 THEN
|
||||
BEGIN WRITE (</"STACK OVERFLOW"/>); DUMPIT; GO TO EXIT END;
|
||||
END;
|
||||
COMMENT X IS PUT INTO THE WORKSTACK. DUPLICATION IS AVOIDED!;
|
||||
BEGIN IF INSTACK[X] = 0 THEN
|
||||
BEGIN SP ~ SP+1; STACK[SP] ~ X; INSTACK[X] ~ SP END
|
||||
ELSE IF INSTACK[X] < STACKMARK[RSP] THEN
|
||||
BEGIN SP ~ SP+1; STACK[SP] ~ X;
|
||||
STACK[INSTACK[X]] ~ 0; INSTACK[X] ~ SP;
|
||||
END;
|
||||
IF SP > 1020 THEN
|
||||
BEGIN WRITE (PRINTFIL, </"STACK OVERFLOW"/>);
|
||||
DUMPIT; GO TO EXIT END;
|
||||
END;
|
||||
PROCEDURE COPYLEFTSYMBOLS(X); VALUE X; INTEGER X;
|
||||
COMMENT COPY THE LIST OF LEFTSYMBOLS OF X INTO THE STACK;
|
||||
BEGIN FOR X ~ LINX[X], X+1 WHILE LEFTLIST[X] ! 0 DO
|
||||
PUTINTOSTACK(LEFTLIST[X]);
|
||||
END;
|
||||
COMMENT COPY THE LIST OF LEFTSYMBOLS OF X INTO THE STACK;
|
||||
BEGIN FOR X ~ LINX[X], X+1 WHILE LEFTLIST[X] ! 0 DO
|
||||
PUTINTOSTACK(LEFTLIST[X]);
|
||||
END;
|
||||
PROCEDURE COPYRIGHTSYMBOLS(X); VALUE X; INTEGER X;
|
||||
COMMENT COPY THE LIST OF RIGHTSYMBOLS OF X INTO THE STACK;
|
||||
BEGIN FOR X ~ RINX[X], X+1 WHILE RIGHTLIST[X] ! 0 DO
|
||||
PUTINTOSTACK(RIGHTLIST[X]);
|
||||
END;
|
||||
COMMENT COPY THE LIST OF RIGHTSYMBOLS OF X INTO THE STACK;
|
||||
BEGIN FOR X ~ RINX[X], X+1 WHILE RIGHTLIST[X] ! 0 DO
|
||||
PUTINTOSTACK(RIGHTLIST[X]);
|
||||
END;
|
||||
PROCEDURE SAVELEFTSYMBOLS(X); VALUE X; INTEGER X;
|
||||
COMMENT THE LEFTSYMBOLLISTS OF ALL SYMBOLS IN THE RECURSTACK
|
||||
WITH INDEX > X HAVE BEEN BUILT AND MUST NOW BE REMOVED, THEY ARE
|
||||
COPIED INTO "LEFTLIST" AND THE SYMBOLS ARE MARKED "DONE";
|
||||
BEGIN INTEGER I,J,U; LABEL L,EX;
|
||||
L: IF STACKMARK[X] = STACKMARK[X+1] THEN
|
||||
BEGIN X ~ X+1; IF X < RSP THEN GO TO L ELSE GO TO EX END;
|
||||
STACKMARK[RSP+1] ~ SP+1;
|
||||
FOR I ~ X+1 UPTO RSP DO
|
||||
BEGIN LINX[RECURSTACK[I]] ~ LP+1;
|
||||
ACTIVE[RECURSTACK[I]] ~ FALSE; DONE[RECURSTACK[I]] ~ TRUE;
|
||||
FOR J ~ STACKMARK[I] UPTO STACKMARK[I+1]-1 DO
|
||||
IF STACK[J] ! 0 THEN
|
||||
BEGIN LP ~ LP+1; LEFTLIST[LP] ~ STACK[J];
|
||||
IF LP > 1020 THEN
|
||||
BEGIN WRITE (</"LEFTLIST OVERFLOW"/>); DUMPIT;
|
||||
PRINTLIST(LINX, LEFTLIST); GO TO EXIT
|
||||
END;
|
||||
END
|
||||
END;
|
||||
LP ~ LP+1; LEFTLIST[LP] ~ 0;
|
||||
EX: RSP ~ X;
|
||||
END;
|
||||
COMMENT THE LEFTSYMBOLLISTS OF ALL SYMBOLS IN THE RECURSTACK
|
||||
WITH INDEX > X HAVE BEEN BUILT AND MUST NOW BE REMOVED, THEY ARE
|
||||
COPIED INTO "LEFTLIST" AND THE SYMBOLS ARE MARKED "DONE";
|
||||
BEGIN INTEGER I,J,U; LABEL L,EX;
|
||||
L: IF STACKMARK[X] = STACKMARK[X+1] THEN
|
||||
BEGIN X ~ X+1; IF X < RSP THEN GO TO L ELSE GO TO EX END;
|
||||
STACKMARK[RSP+1] ~ SP+1;
|
||||
FOR I ~ X+1 UPTO RSP DO
|
||||
BEGIN LINX[RECURSTACK[I]] ~ LP+1;
|
||||
ACTIVE[RECURSTACK[I]] ~ FALSE; DONE[RECURSTACK[I]] ~ TRUE;
|
||||
FOR J ~ STACKMARK[I] UPTO STACKMARK[I+1]-1 DO
|
||||
IF STACK[J] ! 0 THEN
|
||||
BEGIN LP ~ LP+1; LEFTLIST[LP] ~ STACK[J];
|
||||
IF LP > 1020 THEN
|
||||
BEGIN WRITE (PRINTFIL, </"LEFTLIST OVERFLOW"/>);
|
||||
DUMPIT;
|
||||
PRINTLIST(LINX, LEFTLIST);
|
||||
GO TO EXIT
|
||||
END;
|
||||
END
|
||||
END;
|
||||
LP ~ LP+1; LEFTLIST[LP] ~ 0;
|
||||
EX: RSP ~ X;
|
||||
END;
|
||||
PROCEDURE SAVERIGHTSYMBOLS(X); VALUE X; INTEGER X;
|
||||
COMMENT ANALOG TO "SAVELEFTSYMBOLS";
|
||||
BEGIN INTEGER I,J; LABEL L,EX;
|
||||
L: IF STACKMARK[X] = STACKMARK[X+1] THEN
|
||||
BEGIN X ~ X+1; IF X < RSP THEN GO TO L ELSE GO TO EX END;
|
||||
STACKMARK[RSP+1] ~ SP+1;
|
||||
FOR I ~ X+1 UPTO RSP DO
|
||||
BEGIN RINX[RECURSTACK[I]] ~ RP+1;
|
||||
ACTIVE[RECURSTACK[I]] ~ FALSE; DONE[RECURSTACK[I]] ~ TRUE;
|
||||
FOR J ~ STACKMARK[I] UPTO STACKMARK[I+1]-1 DO
|
||||
IF STACK[J] ! 0 THEN
|
||||
BEGIN RP ~ RP+1; RIGHTLIST[RP] ~ STACK[J];
|
||||
IF RP > 1020 THEN
|
||||
BEGIN WRITE (</"RIGHTLIST OVERFLOW"/>); DUMPIT;
|
||||
PRINTLIST(RINX,RIGHTLIST); GO TO EXIT
|
||||
END;
|
||||
END
|
||||
END;
|
||||
RP ~ RP+1; RIGHTLIST[RP] ~ 0;
|
||||
EX: RSP ~ X;
|
||||
END;
|
||||
COMMENT ANALOG TO "SAVELEFTSYMBOLS";
|
||||
BEGIN INTEGER I,J; LABEL L,EX;
|
||||
L: IF STACKMARK[X] = STACKMARK[X+1] THEN
|
||||
BEGIN X ~ X+1; IF X < RSP THEN GO TO L ELSE GO TO EX END;
|
||||
STACKMARK[RSP+1] ~ SP+1;
|
||||
FOR I ~ X+1 UPTO RSP DO
|
||||
BEGIN RINX[RECURSTACK[I]] ~ RP+1;
|
||||
ACTIVE[RECURSTACK[I]] ~ FALSE; DONE[RECURSTACK[I]] ~ TRUE;
|
||||
FOR J ~ STACKMARK[I] UPTO STACKMARK[I+1]-1 DO
|
||||
IF STACK[J] ! 0 THEN
|
||||
BEGIN RP ~ RP+1; RIGHTLIST[RP] ~ STACK[J];
|
||||
IF RP > 1020 THEN
|
||||
BEGIN WRITE (PRINTFIL, </"RIGHTLIST OVERFLOW"/>);
|
||||
DUMPIT;
|
||||
PRINTLIST(RINX,RIGHTLIST); GO TO EXIT
|
||||
END;
|
||||
END
|
||||
END;
|
||||
RP ~ RP+1; RIGHTLIST[RP] ~ 0;
|
||||
EX: RSP ~ X;
|
||||
END;
|
||||
PROCEDURE BUILDLEFTLIST(X); VALUE X; INTEGER X;
|
||||
COMMENT THE LEFTLIST OF THE SYMBOL X IS BUILT BY SCANNING THE
|
||||
SYNTAX FOR PRODUCTIONS WITH LEFTPART = X. THE LEFTMOST SYMBOL IN
|
||||
THE RIGHTPART IS THEN INSPECTED: IF IT IS NONBASIC AND NOT MARKED
|
||||
DONE, ITS LEFTLIST IS BUILT FIRST. WHILE A SYMBOL IS BEING INSPECTED
|
||||
IT IS MARKED ACTIVE;
|
||||
BEGIN INTEGER I,R,OWNRSP;
|
||||
ACTIVE[X] ~ TRUE;
|
||||
RSP ~ OWNRSP ~ LINX[X] ~ RSP+1;
|
||||
RECURSTACK[RSP] ~ X; STACKMARK[RSP] ~ SP+1;
|
||||
FOR I ~ 1 UPTO N DO
|
||||
IF REF[I,0] = X THEN
|
||||
BEGIN IF OWNRSP < RSP THEN SAVELEFTSYMBOLS(OWNRSP);
|
||||
R ~ REF[I,1]; PUTINTOSTACK(R);
|
||||
IF R { LT THEN
|
||||
BEGIN IF DONE[R] THEN COPYLEFTSYMBOLS(R) ELSE
|
||||
IF ACTIVE[R] THEN RESET(LINX[R]) ELSE
|
||||
BUILDLEFTLIST(R);
|
||||
END
|
||||
END;
|
||||
END;
|
||||
COMMENT THE LEFTLIST OF THE SYMBOL X IS BUILT BY SCANNING THE
|
||||
SYNTAX FOR PRODUCTIONS WITH LEFTPART = X. THE LEFTMOST SYMBOL IN
|
||||
THE RIGHTPART IS THEN INSPECTED: IF IT IS NONBASIC AND NOT MARKED
|
||||
DONE, ITS LEFTLIST IS BUILT FIRST. WHILE A SYMBOL IS BEING INSPECTED
|
||||
IT IS MARKED ACTIVE;
|
||||
BEGIN INTEGER I,R,OWNRSP;
|
||||
ACTIVE[X] ~ TRUE;
|
||||
RSP ~ OWNRSP ~ LINX[X] ~ RSP+1;
|
||||
RECURSTACK[RSP] ~ X; STACKMARK[RSP] ~ SP+1;
|
||||
FOR I ~ 1 UPTO N DO
|
||||
IF REF[I,0] = X THEN
|
||||
BEGIN IF OWNRSP < RSP THEN SAVELEFTSYMBOLS(OWNRSP);
|
||||
R ~ REF[I,1]; PUTINTOSTACK(R);
|
||||
IF R { LT THEN
|
||||
BEGIN IF DONE[R] THEN COPYLEFTSYMBOLS(R) ELSE
|
||||
IF ACTIVE[R] THEN RESET(LINX[R]) ELSE
|
||||
BUILDLEFTLIST(R);
|
||||
END
|
||||
END;
|
||||
END;
|
||||
PROCEDURE BUILDRIGHTLIST(X); VALUE X; INTEGER X;
|
||||
COMMENT ANALOG TO "BUILDLEFTLIST";
|
||||
BEGIN INTEGER I,R,OWNRSP; LABEL QQ;
|
||||
ACTIVE[X] ~ TRUE;
|
||||
RSP ~ OWNRSP ~ RINX[X] ~ RSP+1;
|
||||
RECURSTACK[RSP] ~ X; STACKMARK[RSP] ~ SP+1;
|
||||
FOR I ~ 1 UPTO N DO
|
||||
IF REF[I,0] = X THEN
|
||||
BEGIN IF OWNRSP < RSP THEN SAVERIGHTSYMBOLS(OWNRSP);
|
||||
FOR R ~ 2,3,4,5 DO IF REF[I,R] = 0 THEN GO TO QQ;
|
||||
QQ: R ~ REF[I,R-1]; PUTINTOSTACK(R);
|
||||
IF R { LT THEN
|
||||
BEGIN IF DONE[R] THEN COPYRIGHTSYMBOLS(R) ELSE
|
||||
IF ACTIVE[R] THEN RESET(RINX[R]) ELSE
|
||||
BUILDRIGHTLIST(R);
|
||||
END
|
||||
END
|
||||
END;
|
||||
COMMENT ANALOG TO "BUILDLEFTLIST";
|
||||
BEGIN INTEGER I,R,OWNRSP; LABEL QQ;
|
||||
ACTIVE[X] ~ TRUE;
|
||||
RSP ~ OWNRSP ~ RINX[X] ~ RSP+1;
|
||||
RECURSTACK[RSP] ~ X; STACKMARK[RSP] ~ SP+1;
|
||||
FOR I ~ 1 UPTO N DO
|
||||
IF REF[I,0] = X THEN
|
||||
BEGIN IF OWNRSP < RSP THEN SAVERIGHTSYMBOLS(OWNRSP);
|
||||
FOR R ~ 2,3,4,5 DO IF REF[I,R] = 0 THEN GO TO QQ;
|
||||
QQ: R ~ REF[I,R-1]; PUTINTOSTACK(R);
|
||||
IF R { LT THEN
|
||||
BEGIN IF DONE[R] THEN COPYRIGHTSYMBOLS(R) ELSE
|
||||
IF ACTIVE[R] THEN RESET(RINX[R]) ELSE
|
||||
BUILDRIGHTLIST(R);
|
||||
END
|
||||
END
|
||||
END;
|
||||
|
||||
SP ~ RSP ~ LP ~ 0;
|
||||
FOR I ~ 1 UPTO LT DO DONE[I] ~ FALSE;
|
||||
FOR I ~ 1 UPTO LT DO IF NOT DONE[I] THEN
|
||||
BEGIN SP ~ RSP ~ 0;
|
||||
FOR J ~ 1 UPTO M DO INSTACK[J] ~ 0;
|
||||
BUILDLEFTLIST(I); SAVELEFTSYMBOLS(0);
|
||||
END;
|
||||
WRITE ([PAGE]); WRITE (<X20,"*** LEFTMOST SYMBOLS ***"/>);
|
||||
PRINTLIST(LINX, LEFTLIST);
|
||||
SP ~ RSP ~ RP ~ 0;
|
||||
FOR I ~ 1 UPTO LT DO DONE[I] ~ FALSE;
|
||||
FOR I ~ 1 UPTO LT DO IF NOT DONE[I] THEN
|
||||
BEGIN SP ~ RSP ~ 0;
|
||||
FOR J ~ 1 UPTO M DO INSTACK[J] ~ 0;
|
||||
BUILDRIGHTLIST(I); SAVERIGHTSYMBOLS(0);
|
||||
END;
|
||||
WRITE ([3]); WRITE (<X20,"*** RIGHTMOST SYMBOLS ***"/>);
|
||||
PRINTLIST(RINX, RIGHTLIST);
|
||||
SP ~ RSP ~ LP ~ 0;
|
||||
FOR I ~ 1 UPTO LT DO DONE[I] ~ FALSE;
|
||||
FOR I ~ 1 UPTO LT DO IF NOT DONE[I] THEN
|
||||
BEGIN SP ~ RSP ~ 0;
|
||||
FOR J ~ 1 UPTO M DO INSTACK[J] ~ 0;
|
||||
BUILDLEFTLIST(I); SAVELEFTSYMBOLS(0);
|
||||
END;
|
||||
WRITE (PRINTFIL [PAGE]);
|
||||
WRITE (PRINTFIL, <X20,"*** LEFTMOST SYMBOLS ***"/>);
|
||||
PRINTLIST(LINX, LEFTLIST);
|
||||
SP ~ RSP ~ RP ~ 0;
|
||||
FOR I ~ 1 UPTO LT DO DONE[I] ~ FALSE;
|
||||
FOR I ~ 1 UPTO LT DO IF NOT DONE[I] THEN
|
||||
BEGIN SP ~ RSP ~ 0;
|
||||
FOR J ~ 1 UPTO M DO INSTACK[J] ~ 0;
|
||||
BUILDRIGHTLIST(I); SAVERIGHTSYMBOLS(0);
|
||||
END;
|
||||
WRITE (PRINTFIL [3]);
|
||||
WRITE (PRINTFIL, <X20,"*** RIGHTMOST SYMBOLS ***"/>);
|
||||
PRINTLIST(RINX, RIGHTLIST);
|
||||
END BLOCK C1;
|
||||
|
||||
|
||||
BEGIN COMMENT BLOCK C2, BUILD PRECEDENCE RELATIONS;
|
||||
INTEGER J,K,P,Q,R,L,T;
|
||||
LABEL NEXTPRODUCTION;
|
||||
INTEGER J,K,P,Q,R,L,T;
|
||||
LABEL NEXTPRODUCTION;
|
||||
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-
|
||||
OCCUPATION OF THIS POSITION;
|
||||
BEGIN T ~ H[X,Y]; IF T ! NULL AND T ! S THEN
|
||||
BEGIN ERRORFLAG ~ TRUE;
|
||||
WRITE (<"PRECEDENCE VIOLATED BY ",2A1," FOR PAIR",2I4,
|
||||
" BY PRODUCTION",I4>, T, S, X, Y, J);
|
||||
END;
|
||||
H[X,Y] ~ S;
|
||||
END;
|
||||
WRITE ([PAGE]);
|
||||
FOR K ~ 1 UPTO M DO
|
||||
FOR J ~ 1 UPTO M DO H[K,J] ~ NULL;
|
||||
FOR J ~ 1 UPTO N DO
|
||||
BEGIN FOR K ~ 2,3,4,5 DO IF REF[J,K] ! 0 THEN
|
||||
BEGIN P ~ REF[J,K-1]; Q ~ REF[J,K];
|
||||
ENTER(P,Q,EQ);
|
||||
IF P { LT THEN
|
||||
BEGIN FOR R ~ RINX[P],R+1 WHILE RIGHTLIST[R] ! 0 DO
|
||||
ENTER(RIGHTLIST[R],Q,GR);
|
||||
IF Q { LT THEN
|
||||
FOR L ~ LINX[Q],L+1 WHILE LEFTLIST[L] ! 0 DO
|
||||
BEGIN ENTER(P, LEFTLIST[L], LS);
|
||||
FOR R ~ RINX[P],R+1 WHILE RIGHTLIST[R] ! 0 DO
|
||||
ENTER(RIGHTLIST[R],LEFTLIST[L],GR)
|
||||
END
|
||||
END
|
||||
ELSE IF Q { LT THEN
|
||||
FOR L ~ LINX[Q],L+1 WHILE LEFTLIST[L] ! 0 DO
|
||||
ENTER(P, LEFTLIST[L], LS);
|
||||
END
|
||||
ELSE GO TO NEXTPRODUCTION;
|
||||
NEXTPRODUCTION: END J;
|
||||
WRITE (</X3,39I3/>, FOR J ~ 1 UPTO M DO J);
|
||||
FOR K ~ 1 STEP 1 UNTIL M DO
|
||||
WRITE (</X3,39(X2,A1)/>, FOR J ~ 1 UPTO M DO H[K,J]);
|
||||
COMMENT ENTER THE RELATION S INTO POSITION [X,Y]. CHECK FOR DOUBLE-
|
||||
OCCUPATION OF THIS POSITION;
|
||||
BEGIN T ~ H[X,Y]; IF T ! NULL AND T ! S THEN
|
||||
BEGIN ERRORFLAG ~ TRUE;
|
||||
WRITE (PRINTFIL,
|
||||
<"PRECEDENCE VIOLATED BY ",2A1,
|
||||
" FOR PAIR",2I4,
|
||||
" BY PRODUCTION",I4>, T, S, X, Y, J);
|
||||
END;
|
||||
H[X,Y] ~ S;
|
||||
END;
|
||||
WRITE (PRINTFIL [PAGE]);
|
||||
FOR K ~ 1 UPTO M DO
|
||||
FOR J ~ 1 UPTO M DO H[K,J] ~ NULL;
|
||||
FOR J ~ 1 UPTO N DO
|
||||
BEGIN FOR K ~ 2,3,4,5 DO IF REF[J,K] ! 0 THEN
|
||||
BEGIN P ~ REF[J,K-1]; Q ~ REF[J,K];
|
||||
ENTER(P,Q,EQ);
|
||||
IF P { LT THEN
|
||||
BEGIN FOR R ~ RINX[P],R+1 WHILE RIGHTLIST[R] ! 0 DO
|
||||
ENTER(RIGHTLIST[R],Q,GR);
|
||||
IF Q { LT THEN
|
||||
FOR L ~ LINX[Q],L+1 WHILE LEFTLIST[L] ! 0 DO
|
||||
BEGIN ENTER(P, LEFTLIST[L], LS);
|
||||
FOR R ~ RINX[P],R+1 WHILE RIGHTLIST[R] ! 0 DO
|
||||
ENTER(RIGHTLIST[R],LEFTLIST[L],GR)
|
||||
END
|
||||
END
|
||||
ELSE IF Q { LT THEN
|
||||
FOR L ~ LINX[Q],L+1 WHILE LEFTLIST[L] ! 0 DO
|
||||
ENTER(P, LEFTLIST[L], LS);
|
||||
END
|
||||
ELSE GO TO NEXTPRODUCTION;
|
||||
NEXTPRODUCTION: END 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 B1;
|
||||
IF ERRORFLAG THEN GO TO EXIT;
|
||||
WRITE (</"SYNTAX IS A PRECEDENCE GRAMMAR"/>);
|
||||
IF ERRORFLAG THEN GO TO EXIT;
|
||||
WRITE (PRINTFIL, </"SYNTAX IS A PRECEDENCE GRAMMAR"/>);
|
||||
|
||||
|
||||
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;
|
||||
BEGIN WRITE (</"NO PRIORITY FUNCTIONS EXIST ",3I6>, I,J,X);
|
||||
GO TO EXIT
|
||||
END;
|
||||
BEGIN WRITE (PRINTFIL,
|
||||
</"NO PRIORITY FUNCTIONS EXIST ",3I6>, I,J,X);
|
||||
GO TO EXIT
|
||||
END;
|
||||
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;
|
||||
BEGIN INTEGER J; F[I] ~ G[L] + X;
|
||||
IF K1 = K THEN
|
||||
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)
|
||||
END;
|
||||
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]= LS AND F[I] } G[J] THEN FIXUPCOL(I,J,1);
|
||||
END;
|
||||
BEGIN INTEGER J; F[I] ~ G[L] + X;
|
||||
IF K1 = K THEN
|
||||
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)
|
||||
END;
|
||||
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]= LS AND F[I] } G[J] THEN FIXUPCOL(I,J,1);
|
||||
END;
|
||||
PROCEDURE FIXUPCOL(L,J,X); VALUE L,J,X; INTEGER L,J,X;
|
||||
BEGIN INTEGER I; G[J] ~ F[L] + X;
|
||||
IF K1 ! K THEN
|
||||
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)
|
||||
END;
|
||||
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] = GR AND F[I] { G[J] THEN FIXUPROW(I,J,1);
|
||||
END;
|
||||
K1 ~ 0;
|
||||
FOR K ~ 1 UPTO M DO
|
||||
BEGIN FMIN ~ 1;
|
||||
FOR J ~ 1 UPTO K1 DO
|
||||
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;
|
||||
F[K] ~ FMIN;
|
||||
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] = LS AND FMIN } G[J] THEN FIXUPCOL(K,J,1);
|
||||
K1 ~ K1+1; GMIN ~ 1;
|
||||
FOR I ~ 1 UPTO K DO
|
||||
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;
|
||||
G[K] ~ GMIN;
|
||||
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] = GR AND F[I] { GMIN THEN FIXUPROW(I,K,1);
|
||||
END K;
|
||||
BEGIN INTEGER I; G[J] ~ F[L] + X;
|
||||
IF K1 ! K THEN
|
||||
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)
|
||||
END;
|
||||
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] = GR AND F[I] { G[J] THEN FIXUPROW(I,J,1);
|
||||
END;
|
||||
K1 ~ 0;
|
||||
FOR K ~ 1 UPTO M DO
|
||||
BEGIN FMIN ~ 1;
|
||||
FOR J ~ 1 UPTO K1 DO
|
||||
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;
|
||||
F[K] ~ FMIN;
|
||||
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] = LS AND FMIN } G[J] THEN FIXUPCOL(K,J,1);
|
||||
K1 ~ K1+1; GMIN ~ 1;
|
||||
FOR I ~ 1 UPTO K DO
|
||||
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;
|
||||
G[K] ~ GMIN;
|
||||
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] = GR AND F[I] { GMIN THEN FIXUPROW(I,K,1);
|
||||
END K;
|
||||
END BLOCK B2;
|
||||
WRITE ([PAGE]);
|
||||
WRITE (PRINTFIL [PAGE]);
|
||||
|
||||
|
||||
BEGIN COMMENT BLOCK B3. BUILD TABLES OF PRODUCTION REFERENCES;
|
||||
INTEGER I,J,K,L;
|
||||
INTEGER ARRAY MTB[0:M]; COMMENT MASTER TABLE;
|
||||
INTEGER ARRAY PRTB[0:1022]; COMMENT PRODUCTION TABLE;
|
||||
L ~ 0;
|
||||
FOR I ~ 1 UPTO M DO
|
||||
BEGIN MTB[I] ~ L+1;
|
||||
FOR J ~ 1 UPTO N DO
|
||||
IF REF[J,1] = I THEN
|
||||
BEGIN FOR K ~ 2,3,4,5 DO
|
||||
IF REF[J,K] ! 0 THEN
|
||||
BEGIN L ~ L+1; PRTB[L] ~ REF[J,K]
|
||||
END;
|
||||
L ~ L+1; PRTB[L] ~ -J; L ~ L+1; PRTB[L] ~ REF[J,0];
|
||||
END;
|
||||
L ~ L+1; PRTB[L] ~ 0
|
||||
END;
|
||||
COMMENT PRINT AND PUNCH THE RESULTS:
|
||||
SYMBOLTABLE, PRECEDENCE FUNCTIONS, SYNTAX REFERENCE TABLES;
|
||||
WRITE (<X8,"NO.",X5,"SYMBOL",X8, "F",X5,"G",X4,"MTB"/>);
|
||||
FOR I ~ 1 UPTO M DO
|
||||
BEGIN SETTEXT(I,SYTB[I],F[I],G[I], MTB[I], WRITEBUFFER[0]);
|
||||
OUTPUT
|
||||
END;
|
||||
WRITE (</"PRODUCTION TABLE:"/>);
|
||||
FOR I ~ 0 STEP 10 UNTIL L DO
|
||||
WRITE (<I9,X2,10I6>, FOR I ~ 0 STEP 10 UNTIL L DO
|
||||
[I, FOR J ~ I UPTO I+9 DO PRTB[J]]);
|
||||
WRITE (</"SYNTAX VERSION ",A5>, TIME(0));
|
||||
WRITE (PCH, <X4,"FT ~",I3,"; LT ~",I4,"; LP ~",I4,";">,LT+1,M,L);
|
||||
FOR I ~ 1 STEP 6 UNTIL M DO
|
||||
BEGIN PCHTX(SYTB[I], WRITEBUFFER[0], IF M-I } 6 THEN 6 ELSE M-I+1);
|
||||
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]);
|
||||
INTEGER I,J,K,L;
|
||||
INTEGER ARRAY MTB[0:M]; COMMENT MASTER TABLE;
|
||||
INTEGER ARRAY PRTB[0:1022]; COMMENT PRODUCTION TABLE;
|
||||
L ~ 0;
|
||||
FOR I ~ 1 UPTO M DO
|
||||
BEGIN MTB[I] ~ L+1;
|
||||
FOR J ~ 1 UPTO N DO
|
||||
IF REF[J,1] = I THEN
|
||||
BEGIN FOR K ~ 2,3,4,5 DO
|
||||
IF REF[J,K] ! 0 THEN
|
||||
BEGIN L ~ L+1; PRTB[L] ~ REF[J,K]
|
||||
END;
|
||||
L ~ L+1; PRTB[L] ~ -J; L ~ L+1;
|
||||
PRTB[L] ~ REF[J,0];
|
||||
END;
|
||||
L ~ L+1; PRTB[L] ~ 0
|
||||
END;
|
||||
COMMENT PRINT AND PUNCH THE RESULTS:
|
||||
SYMBOLTABLE, PRECEDENCE FUNCTIONS, SYNTAX REFERENCE TABLES;
|
||||
WRITE (PRINTFIL, <X8,"NO.",X5,"SYMBOL",X8,
|
||||
"F",X5,"G",X4,"MTB"/>);
|
||||
FOR I ~ 1 UPTO M DO
|
||||
BEGIN SETTEXT(I,SYTB[I],F[I],G[I], MTB[I], WRITEBUFFER[0]);
|
||||
OUTPUT
|
||||
END;
|
||||
WRITE (PRINTFIL, </"PRODUCTION TABLE:"/>);
|
||||
FOR I ~ 0 STEP 10 UNTIL L DO
|
||||
WRITE (PRINTFIL, <I9,X2,10I6>,
|
||||
FOR I ~ 0 STEP 10 UNTIL L DO
|
||||
[I, FOR J ~ I UPTO I+9 DO PRTB[J]]);
|
||||
WRITE (PRINTFIL, </"SYNTAX VERSION ",A5>, TIME(0));
|
||||
WRITE (PCH, <X4,"FT ~",I3,"; LT ~",I4,"; LP ~",I4,";">,
|
||||
LT+1,M,L);
|
||||
FOR I ~ 1 STEP 6 UNTIL M DO
|
||||
BEGIN PCHTX(SYTB[I], WRITEBUFFER[0],
|
||||
IF M-I } 6 THEN 6 ELSE M-I+1);
|
||||
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 A;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user