1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-01-13 15:17:03 +00:00

Apply sequence numbers to EULER and XBASIC Algol source files.

Commit updated version of STQB64.BAS from James Fehlinger as of 2014-04-04.
This commit is contained in:
Paul Kimpel 2014-04-05 21:57:34 +00:00
parent 2fb19ea809
commit bb575e68ce
4 changed files with 4426 additions and 4454 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,454 +1,453 @@
BEGIN COMMENT SYNTAX-PROCESSOR. NIKLAUS WIRTH DEC.1964;
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;
STREAM PROCEDURE MARK(D,S); VALUE S;
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;
STREAM PROCEDURE EDIT(S,D,N);
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;
STREAM PROCEDURE MOVETEXT(S,D,N); VALUE N;
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;
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;
STREAM PROCEDURE EDITTEXT(S,D,N); VALUE N;
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;
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;
PROCEDURE INPUT;
READ (CARDFIL, 10, READBUFFER[*]) [EXIT];
PROCEDURE OUTPUT;
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 (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 (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 (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;
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 (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;
BEGIN COMMENT BLOCK A;
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];
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;
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;
PROCEDURE DUMPIT;
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;
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 (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;
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;
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 (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 (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;
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;
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;
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 (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 (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;
PROCEDURE THRU(I,J,X); VALUE I,J,X; INTEGER I,J,X;
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;
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;
END BLOCK B2;
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 (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;
EXIT:
END.
BEGIN COMMENT SYNTAX-PROCESSOR. NIKLAUS WIRTH DEC.1964; 00010000
DEFINE NSY =180#; COMMENT MAX. NO. OF SYMBOLS; 00020000
DEFINE NPR =180#; COMMENT MAX. NO. OF PRODUCTIONS; 00030000
DEFINE UPTO =STEP 1 UNTIL#; 00040000
DEFINE LS ="<"#, EQ ="="#, GR =">"#, NULL =" "#; 00050000
FILE IN CARDFIL (1,10); FILE PRINTFIL 1 (1,15); 00060000
FILE OUT PCH 0 (2,10); COMMENT PUNCH FILE; 00070000
INTEGER LT; COMMENT NUMBER OF LAST NONBASIC SYMBOL; 00080000
INTEGER K,M,N, MAX, OLDN; BOOLEAN ERRORFLAG; 00090000
ALPHA ARRAY READBUFFER[0:9], WRITEBUFFER[0:14]; 00100000
ALPHA ARRAY TEXT[0:11]; COMMENT AUXILIARY TEXT ARRAY; 00110000
ALPHA ARRAY SYTB[0:NSY]; COMMENT SYMBOLTABLE; 00120000
INTEGER ARRAY REF[0:NPR,0:5]; COMMENT SYNTAX REFERENCE TABLE; 00130000
LABEL START,EXIT; 00140000
LABEL A,B,C,E,F,G; 00150000
00160000
STREAM PROCEDURE CLEAR(D,N); VALUE N; 00170000
BEGIN DI ~ D; DS ~ 8 LIT " "; SI ~ D; DS ~ N WDS 00180000
END; 00190000
STREAM PROCEDURE MARK(D,S); VALUE S; 00200000
BEGIN DI ~ D; SI ~ LOC S; SI ~ SI+7; DS ~ CHR 00210000
END; 00220000
BOOLEAN STREAM PROCEDURE FINIS(S); 00230000
BEGIN TALLY ~ 1; SI ~ S; IF SC = "*" THEN FINIS ~ TALLY 00240000
END; 00250000
STREAM PROCEDURE EDIT(S,D,N); 00260000
BEGIN DI ~ D; SI ~ N; DS ~ 3 DEC; SI ~ S; DS ~ 9 WDS; 00270000
END; 00280000
STREAM PROCEDURE MOVE(S,D); 00290000
BEGIN SI ~ S; DI ~ D; DS ~ WDS; 00300000
END; 00310000
STREAM PROCEDURE MOVETEXT(S,D,N); VALUE N; 00320000
BEGIN DI ~ D; SI ~ S; DS ~ N WDS; 00330000
END; 00340000
BOOLEAN STREAM PROCEDURE EQUAL(S,D); 00350000
BEGIN SI ~ S; DI ~ D; TALLY ~ 1; IF 8 SC = DC THEN EQUAL ~ TALLY; 00360000
END; 00370000
STREAM PROCEDURE SCAN(S,DD,N); 00380000
BEGIN LABEL A,B,C,D,E; 00390000
SI ~ S; DI ~ DD; DS ~ 48 LIT "0"; DI ~ DD; SI ~ SI+1; 00400000
IF SC = " " THEN DI ~ DI+8; 00410000
A: IF SC = " " THEN BEGIN SI ~ SI+1; GO TO A END; 00420000
IF SC > "9" THEN GO TO D; 00430000
8 (IF SC = " " THEN BEGIN DS ~ LIT " "; GO TO E END; DS ~ CHR; E:);00440000
B: IF SC ! " " THEN BEGIN SI ~ SI+1; GO TO B END; 00450000
C: SI ~ SI+1; GO TO A; 00460000
D: DI ~ N; SI ~ SI+5; DS ~ 3 OCT 00470000
END; 00480000
STREAM PROCEDURE EDITTEXT(S,D,N); VALUE N; 00490000
BEGIN SI ~ S; DI ~ D; DI ~ DI+10; N(DI ~ DI+2; DS ~ 8 CHR) 00500000
END; 00510000
STREAM PROCEDURE SETTEXT(A,B,C,D,E,Z); 00520000
BEGIN DI ~ Z; DI ~ DI+8; SI ~ A; DS ~ 3 DEC; SI ~ B; DS ~ WDS; 00530000
DI ~ DI+5; SI ~ C; DS ~ 3 DEC; DI ~ DI+3; SI ~ D; DS ~ 3 DEC; 00540000
DI ~ DI+3; SI ~ E; DS ~ 3 DEC; 00550000
END; 00560000
STREAM PROCEDURE PCHTX(S,D,N); VALUE N; 00570000
BEGIN SI ~ S; DI ~ D; DI ~ DI+4; 00580000
N(DS ~ LIT """; DS ~ 8 CHR; DS ~ LIT """; DS ~ LIT ","); 00590000
END; 00600000
PROCEDURE INPUT; 00610000
READ (CARDFIL, 10, READBUFFER[*]) [EXIT]; 00620000
PROCEDURE OUTPUT; 00630000
BEGIN WRITE (PRINTFIL, 15, WRITEBUFFER[*]); 00640000
CLEAR(WRITEBUFFER[0], 14); 00650000
END; 00660000
INTEGER PROCEDURE INX(X); REAL X; 00670000
BEGIN INTEGER I; LABEL F; 00680000
FOR I ~ 0 UPTO M DO 00690000
IF EQUAL(SYTB[I], X) THEN GO TO F; 00700000
WRITE (PRINTFIL, <"UNDEFINED SYMBOL">); 00710000
ERRORFLAG ~ TRUE; 00720000
F: INX ~ I; 00730000
END; 00740000
00750000
START: 00760000
FOR N ~ 0 UPTO 5 DO 00770000
FOR M ~ 0 UPTO NPR DO REF[M,N] ~ 0; 00780000
M ~ N ~ MAX ~ OLDN ~ 0; ERRORFLAG ~ FALSE; 00790000
CLEAR(WRITEBUFFER[0],14); 00800000
COMMENT READ LIST OF SYMBOLS, ONE SYMBOL MUST APPEAR PER CARD, 00810000
STARTING IN COL.9 (8 CHARS. ARE SIGNIFICANT), THE LIST OF NON- 00820000
BASIC SYMBOLS IS FOLLOWED BY AN ENDCARD ("*" IN COL.1). THEN 00830000
FOLLOWS THE LIST OF BASIC SYMBOLS AND AGAIN AN ENDCARD; 00840000
WRITE (PRINTFIL, < "NONBASIC SYMBOLS:">); 00850000
A: INPUT; 00860000
IF FINIS(READBUFFER[0]) THEN GO TO E; 00870000
M ~ M+1; 00880000
MOVE(READBUFFER[1], SYTB[M]); 00890000
EDIT(READBUFFER[0], WRITEBUFFER[1], M); 00900000
OUTPUT; GO TO A; 00910000
E: WRITE (PRINTFIL, </"BASIC SYMBOLS:">); LT ~ M; 00920000
F: INPUT; 00930000
IF FINIS(READBUFFER[0]) THEN GO TO G; 00940000
M ~ M + 1; 00950000
MOVE(READBUFFER[1], SYTB[M]); 00960000
EDIT(READBUFFER[0], WRITEBUFFER[1], M); 00970000
OUTPUT; GO TO F; 00980000
00990000
COMMENT READ THE LIST OF PRODUCTIONS, ONE PER CARD. THE LEFTPART 01000000
IS A NONBASIC SYMBOL STARTING IN COL.2. NO FORMAT IS PRESCRIBED 01010000
FOR THE RIGHT PART. ONE OR MORE BLANKS ACT AS SYMBOL SEPARATORS. 01020000
IF COL.2 IS BLANK, THE SAME LEFTPART AS IN THE PREVIOUS PRODUCTION 01030000
IS SUBSTITUTED. THE MAX. LENGTH OF A PRODUCTION IS 6 SYMBOLS; 01040000
G: WRITE (PRINTFIL, </"SYNTAX:">); 01050000
B: INPUT; 01060000
IF FINIS(READBUFFER[0]) THEN GO TO C; 01070000
MOVETEXT(READBUFFER[0], WRITEBUFFER[1], 10); OUTPUT; 01080000
MARK(READBUFFER[9], 12); SCAN(READBUFFER[0],TEXT[0],N); 01090000
IF N { 0 OR N > NPR OR REF[N,0] ! 0 THEN 01100000
BEGIN WRITE (PRINTFIL, <"UNACCEPTABLE TAG">); 01110000
ERRORFLAG ~ TRUE; GO TO B 01120000
END; 01130000
IF N > MAX THEN MAX ~ N; 01140000
COMMENT THE SYNTAX IS STORED IN REF, EACH SYMBOL REPRESENTED BY 01150000
ITS INDEX IN THE SYMBOL-TABLE; 01160000
FOR K ~ 0 UPTO 5 DO REF[N,K] ~ INX(TEXT[K]); 01170000
IF REF[N,0] = 0 THEN REF[N,0] ~ REF[OLDN,0] ELSE 01180000
IF REF[N,0] > LT THEN 01190000
BEGIN WRITE (PRINTFIL, <"ILLEGAL PRODUCTION">); 01200000
ERRORFLAG ~ TRUE END; 01210000
OLDN ~ N; GO TO B; 01220000
C: IF ERRORFLAG THEN GO TO EXIT; 01230000
N ~ MAX; 01240000
COMMENT M IS THE LENGTH OF THE SYMBOL-TABLE, N OF THE REF-TABLE; 01250000
01260000
BEGIN COMMENT BLOCK A; 01270000
INTEGER ARRAY H[0:M, 0:M]; COMMENT PRECEDENCE MATRIX; 01280000
INTEGER ARRAY F, G [0:M]; COMMENT PRECEDENCE FUNCTIONS; 01290000
BEGIN COMMENT BLOCK B1; 01300000
INTEGER ARRAY LINX, RINX [0:LT]; COMMENT LEFT / RIGHT INDICES; 01310000
INTEGER ARRAY LEFTLIST, RIGHTLIST[0:1022]; 01320000
BEGIN COMMENT BLOCK C1, BUILD LEFT- AND RIGHT-SYMBOL LISTS; 01330000
INTEGER I,J; 01340000
INTEGER SP, RSP; COMMENT STACK- AND RECURSTACK-POINTERS; 01350000
INTEGER LP, RP; COMMENT LEFT/RIGHT LIST POINTERS; 01360000
INTEGER ARRAY INSTACK[0:M]; 01370000
BOOLEAN ARRAY DONE, ACTIVE [0:LT]; 01380000
INTEGER ARRAY RECURSTACK, STACKMARK [0:LT+1]; 01390000
INTEGER ARRAY STACK[0:1022]; COMMENT HERE THE LISTS ARE BUILT; 01400000
01410000
PROCEDURE PRINTLIST(LX,L); ARRAY LX, L [0]; 01420000
BEGIN INTEGER I,J,K; 01430000
FOR I ~ 1 UPTO LT DO IF DONE[I] THEN 01440000
BEGIN K ~ 0; MOVE(SYTB[I], WRITEBUFFER[0]); 01450000
FOR J ~ LX[I],J+1 WHILE L[J] ! 0 DO 01460000
BEGIN MOVE(SYTB[L[J]], TEXT[K]); K ~ K+1; 01470000
IF K } 10 THEN 01480000
BEGIN EDITTEXT(TEXT[0], WRITEBUFFER[0],10);OUTPUT; 01490000
K ~ 0; 01500000
END; 01510000
END; 01520000
IF K > 0 THEN 01530000
BEGIN EDITTEXT(TEXT[0], WRITEBUFFER[0], K); 01540000
OUTPUT END; 01550000
END 01560000
END; 01570000
PROCEDURE DUMPIT; 01580000
BEGIN INTEGER I,J; WRITE (PRINTFIL [PAGE]); 01590000
WRITE (PRINTFIL, <X9,"DONE ACTIVE LINX RINX">); 01600000
WRITE (PRINTFIL, <5I6>, FOR I ~ 1 UPTO LT DO 01610000
[I, DONE[I], ACTIVE[I], LINX[I], RINX[I]]); 01620000
WRITE (PRINTFIL, </"STACK: SP =",I3>, SP); 01630000
WRITE (PRINTFIL, <I10,": ",10I6>, 01640000
FOR I ~ 0 STEP 10 UNTIL SP DO 01650000
[I, FOR J ~ I UPTO I+9 DO STACK[J]]); 01660000
WRITE (PRINTFIL, </"RECURSTACK:">); 01670000
WRITE (PRINTFIL, <3I6>, FOR I ~ 1 UPTO RSP DO 01680000
[I, RECURSTACK[I], STACKMARK[I]]); 01690000
END; 01700000
PROCEDURE RESET(X); VALUE X; INTEGER X; 01710000
BEGIN INTEGER I; 01720000
FOR I ~ X UPTO RSP DO STACKMARK[I] ~ STACKMARK[X]; 01730000
END; 01740000
PROCEDURE PUTINTOSTACK(X); VALUE X; INTEGER X; 01750000
COMMENT X IS PUT INTO THE WORKSTACK. DUPLICATION IS AVOIDED!; 01760000
BEGIN IF INSTACK[X] = 0 THEN 01770000
BEGIN SP ~ SP+1; STACK[SP] ~ X; INSTACK[X] ~ SP END 01780000
ELSE IF INSTACK[X] < STACKMARK[RSP] THEN 01790000
BEGIN SP ~ SP+1; STACK[SP] ~ X; 01800000
STACK[INSTACK[X]] ~ 0; INSTACK[X] ~ SP; 01810000
END; 01820000
IF SP > 1020 THEN 01830000
BEGIN WRITE (PRINTFIL, </"STACK OVERFLOW"/>); 01840000
DUMPIT; GO TO EXIT END; 01850000
END; 01860000
PROCEDURE COPYLEFTSYMBOLS(X); VALUE X; INTEGER X; 01870000
COMMENT COPY THE LIST OF LEFTSYMBOLS OF X INTO THE STACK; 01880000
BEGIN FOR X ~ LINX[X], X+1 WHILE LEFTLIST[X] ! 0 DO 01890000
PUTINTOSTACK(LEFTLIST[X]); 01900000
END; 01910000
PROCEDURE COPYRIGHTSYMBOLS(X); VALUE X; INTEGER X; 01920000
COMMENT COPY THE LIST OF RIGHTSYMBOLS OF X INTO THE STACK; 01930000
BEGIN FOR X ~ RINX[X], X+1 WHILE RIGHTLIST[X] ! 0 DO 01940000
PUTINTOSTACK(RIGHTLIST[X]); 01950000
END; 01960000
PROCEDURE SAVELEFTSYMBOLS(X); VALUE X; INTEGER X; 01970000
COMMENT THE LEFTSYMBOLLISTS OF ALL SYMBOLS IN THE RECURSTACK 01980000
WITH INDEX > X HAVE BEEN BUILT AND MUST NOW BE REMOVED, THEY ARE 01990000
COPIED INTO "LEFTLIST" AND THE SYMBOLS ARE MARKED "DONE"; 02000000
BEGIN INTEGER I,J,U; LABEL L,EX; 02010000
L: IF STACKMARK[X] = STACKMARK[X+1] THEN 02020000
BEGIN X ~ X+1; IF X < RSP THEN GO TO L ELSE GO TO EX END; 02030000
STACKMARK[RSP+1] ~ SP+1; 02040000
FOR I ~ X+1 UPTO RSP DO 02050000
BEGIN LINX[RECURSTACK[I]] ~ LP+1; 02060000
ACTIVE[RECURSTACK[I]] ~ FALSE; DONE[RECURSTACK[I]] ~ TRUE; 02070000
FOR J ~ STACKMARK[I] UPTO STACKMARK[I+1]-1 DO 02080000
IF STACK[J] ! 0 THEN 02090000
BEGIN LP ~ LP+1; LEFTLIST[LP] ~ STACK[J]; 02100000
IF LP > 1020 THEN 02110000
BEGIN WRITE (PRINTFIL, </"LEFTLIST OVERFLOW"/>); 02120000
DUMPIT; 02130000
PRINTLIST(LINX, LEFTLIST); 02140000
GO TO EXIT 02150000
END; 02160000
END 02170000
END; 02180000
LP ~ LP+1; LEFTLIST[LP] ~ 0; 02190000
EX: RSP ~ X; 02200000
END; 02210000
PROCEDURE SAVERIGHTSYMBOLS(X); VALUE X; INTEGER X; 02220000
COMMENT ANALOG TO "SAVELEFTSYMBOLS"; 02230000
BEGIN INTEGER I,J; LABEL L,EX; 02240000
L: IF STACKMARK[X] = STACKMARK[X+1] THEN 02250000
BEGIN X ~ X+1; IF X < RSP THEN GO TO L ELSE GO TO EX END; 02260000
STACKMARK[RSP+1] ~ SP+1; 02270000
FOR I ~ X+1 UPTO RSP DO 02280000
BEGIN RINX[RECURSTACK[I]] ~ RP+1; 02290000
ACTIVE[RECURSTACK[I]] ~ FALSE; DONE[RECURSTACK[I]] ~ TRUE; 02300000
FOR J ~ STACKMARK[I] UPTO STACKMARK[I+1]-1 DO 02310000
IF STACK[J] ! 0 THEN 02320000
BEGIN RP ~ RP+1; RIGHTLIST[RP] ~ STACK[J]; 02330000
IF RP > 1020 THEN 02340000
BEGIN WRITE (PRINTFIL, </"RIGHTLIST OVERFLOW"/>); 02350000
DUMPIT; 02360000
PRINTLIST(RINX,RIGHTLIST); GO TO EXIT 02370000
END; 02380000
END 02390000
END; 02400000
RP ~ RP+1; RIGHTLIST[RP] ~ 0; 02410000
EX: RSP ~ X; 02420000
END; 02430000
PROCEDURE BUILDLEFTLIST(X); VALUE X; INTEGER X; 02440000
COMMENT THE LEFTLIST OF THE SYMBOL X IS BUILT BY SCANNING THE 02450000
SYNTAX FOR PRODUCTIONS WITH LEFTPART = X. THE LEFTMOST SYMBOL IN 02460000
THE RIGHTPART IS THEN INSPECTED: IF IT IS NONBASIC AND NOT MARKED 02470000
DONE, ITS LEFTLIST IS BUILT FIRST. WHILE A SYMBOL IS BEING INSPECTED 02480000
IT IS MARKED ACTIVE; 02490000
BEGIN INTEGER I,R,OWNRSP; 02500000
ACTIVE[X] ~ TRUE; 02510000
RSP ~ OWNRSP ~ LINX[X] ~ RSP+1; 02520000
RECURSTACK[RSP] ~ X; STACKMARK[RSP] ~ SP+1; 02530000
FOR I ~ 1 UPTO N DO 02540000
IF REF[I,0] = X THEN 02550000
BEGIN IF OWNRSP < RSP THEN SAVELEFTSYMBOLS(OWNRSP); 02560000
R ~ REF[I,1]; PUTINTOSTACK(R); 02570000
IF R { LT THEN 02580000
BEGIN IF DONE[R] THEN COPYLEFTSYMBOLS(R) ELSE 02590000
IF ACTIVE[R] THEN RESET(LINX[R]) ELSE 02600000
BUILDLEFTLIST(R); 02610000
END 02620000
END; 02630000
END; 02640000
PROCEDURE BUILDRIGHTLIST(X); VALUE X; INTEGER X; 02650000
COMMENT ANALOG TO "BUILDLEFTLIST"; 02660000
BEGIN INTEGER I,R,OWNRSP; LABEL QQ; 02670000
ACTIVE[X] ~ TRUE; 02680000
RSP ~ OWNRSP ~ RINX[X] ~ RSP+1; 02690000
RECURSTACK[RSP] ~ X; STACKMARK[RSP] ~ SP+1; 02700000
FOR I ~ 1 UPTO N DO 02710000
IF REF[I,0] = X THEN 02720000
BEGIN IF OWNRSP < RSP THEN SAVERIGHTSYMBOLS(OWNRSP); 02730000
FOR R ~ 2,3,4,5 DO IF REF[I,R] = 0 THEN GO TO QQ; 02740000
QQ: R ~ REF[I,R-1]; PUTINTOSTACK(R); 02750000
IF R { LT THEN 02760000
BEGIN IF DONE[R] THEN COPYRIGHTSYMBOLS(R) ELSE 02770000
IF ACTIVE[R] THEN RESET(RINX[R]) ELSE 02780000
BUILDRIGHTLIST(R); 02790000
END 02800000
END 02810000
END; 02820000
02830000
SP ~ RSP ~ LP ~ 0; 02840000
FOR I ~ 1 UPTO LT DO DONE[I] ~ FALSE; 02850000
FOR I ~ 1 UPTO LT DO IF NOT DONE[I] THEN 02860000
BEGIN SP ~ RSP ~ 0; 02870000
FOR J ~ 1 UPTO M DO INSTACK[J] ~ 0; 02880000
BUILDLEFTLIST(I); SAVELEFTSYMBOLS(0); 02890000
END; 02900000
WRITE (PRINTFIL [PAGE]); 02910000
WRITE (PRINTFIL, <X20,"*** LEFTMOST SYMBOLS ***"/>); 02920000
PRINTLIST(LINX, LEFTLIST); 02930000
SP ~ RSP ~ RP ~ 0; 02940000
FOR I ~ 1 UPTO LT DO DONE[I] ~ FALSE; 02950000
FOR I ~ 1 UPTO LT DO IF NOT DONE[I] THEN 02960000
BEGIN SP ~ RSP ~ 0; 02970000
FOR J ~ 1 UPTO M DO INSTACK[J] ~ 0; 02980000
BUILDRIGHTLIST(I); SAVERIGHTSYMBOLS(0); 02990000
END; 03000000
WRITE (PRINTFIL [3]); 03010000
WRITE (PRINTFIL, <X20,"*** RIGHTMOST SYMBOLS ***"/>); 03020000
PRINTLIST(RINX, RIGHTLIST); 03030000
END BLOCK C1; 03040000
03050000
03060000
BEGIN COMMENT BLOCK C2, BUILD PRECEDENCE RELATIONS; 03070000
INTEGER J,K,P,Q,R,L,T; 03080000
LABEL NEXTPRODUCTION; 03090000
PROCEDURE ENTER(X,Y,S); VALUE X,Y,S; INTEGER X,Y,S; 03100000
COMMENT ENTER THE RELATION S INTO POSITION [X,Y]. CHECK FOR DOUBLE- 03110000
OCCUPATION OF THIS POSITION; 03120000
BEGIN T ~ H[X,Y]; IF T ! NULL AND T ! S THEN 03130000
BEGIN ERRORFLAG ~ TRUE; 03140000
WRITE (PRINTFIL, 03150000
<"PRECEDENCE VIOLATED BY ",2A1, 03160000
" FOR PAIR",2I4, 03170000
" BY PRODUCTION",I4>, T, S, X, Y, J); 03180000
END; 03190000
H[X,Y] ~ S; 03200000
END; 03210000
WRITE (PRINTFIL [PAGE]); 03220000
FOR K ~ 1 UPTO M DO 03230000
FOR J ~ 1 UPTO M DO H[K,J] ~ NULL; 03240000
FOR J ~ 1 UPTO N DO 03250000
BEGIN FOR K ~ 2,3,4,5 DO IF REF[J,K] ! 0 THEN 03260000
BEGIN P ~ REF[J,K-1]; Q ~ REF[J,K]; 03270000
ENTER(P,Q,EQ); 03280000
IF P { LT THEN 03290000
BEGIN FOR R ~ RINX[P],R+1 WHILE RIGHTLIST[R] ! 0 DO 03300000
ENTER(RIGHTLIST[R],Q,GR); 03310000
IF Q { LT THEN 03320000
FOR L ~ LINX[Q],L+1 WHILE LEFTLIST[L] ! 0 DO 03330000
BEGIN ENTER(P, LEFTLIST[L], LS); 03340000
FOR R ~ RINX[P],R+1 WHILE RIGHTLIST[R] ! 0 DO 03350000
ENTER(RIGHTLIST[R],LEFTLIST[L],GR) 03360000
END 03370000
END 03380000
ELSE IF Q { LT THEN 03390000
FOR L ~ LINX[Q],L+1 WHILE LEFTLIST[L] ! 0 DO 03400000
ENTER(P, LEFTLIST[L], LS); 03410000
END 03420000
ELSE GO TO NEXTPRODUCTION; 03430000
NEXTPRODUCTION: END J; 03440000
WRITE (PRINTFIL, </X3,39I3/>, FOR J ~ 1 UPTO M DO J); 03450000
FOR K ~ 1 STEP 1 UNTIL M DO 03460000
WRITE (PRINTFIL, </X3,39(X2,A1)/>, FOR J ~ 1 UPTO M DO H[K,J]); 03470000
END BLOCK C2; 03480000
END BLOCK B1; 03490000
IF ERRORFLAG THEN GO TO EXIT; 03500000
WRITE (PRINTFIL, </"SYNTAX IS A PRECEDENCE GRAMMAR"/>); 03510000
03520000
03530000
BEGIN COMMENT BLOCK B2. BUILD F AND G PRECEDENCE FUNCTIONS; 03540000
INTEGER I, J, K,K1, N, FMIN, GMIN, T; 03550000
PROCEDURE THRU(I,J,X); VALUE I,J,X; INTEGER I,J,X; 03560000
BEGIN WRITE (PRINTFIL, 03570000
</"NO PRIORITY FUNCTIONS EXIST ",3I6>, I,J,X); 03580000
GO TO EXIT 03590000
END; 03600000
PROCEDURE FIXUPCOL(L,J,X); VALUE L,J,X; INTEGER L,J,X; FORWARD; 03610000
PROCEDURE FIXUPROW(I,L,X); VALUE I,L,X; INTEGER I,L,X; 03620000
BEGIN INTEGER J; F[I] ~ G[L] + X; 03630000
IF K1 = K THEN 03640000
BEGIN IF H[I,K]= EQ AND F[I] ! G[K] THEN THRU(I,K,0) ELSE 03650000
IF H[I,K]= LS AND F[I] } G[K] THEN THRU(I,K,0) 03660000
END; 03670000
FOR J ~ K1 STEP -1 UNTIL 1 DO 03680000
IF H[I,J]= EQ AND F[I] ! G[J] THEN FIXUPCOL(I,J,0) ELSE 03690000
IF H[I,J]= LS AND F[I] } G[J] THEN FIXUPCOL(I,J,1); 03700000
END; 03710000
PROCEDURE FIXUPCOL(L,J,X); VALUE L,J,X; INTEGER L,J,X; 03720000
BEGIN INTEGER I; G[J] ~ F[L] + X; 03730000
IF K1 ! K THEN 03740000
BEGIN IF H[K,J] = EQ AND F[K] ! G[J] THEN THRU(K,J,1) ELSE 03750000
IF H[K,J] = GR AND F[K] { G[J] THEN THRU(K,J,1) 03760000
END; 03770000
FOR I ~ K STEP -1 UNTIL 1 DO 03780000
IF H[I,J] = EQ AND F[I] ! G[J] THEN FIXUPROW(I,J,0) ELSE 03790000
IF H[I,J] = GR AND F[I] { G[J] THEN FIXUPROW(I,J,1); 03800000
END; 03810000
K1 ~ 0; 03820000
FOR K ~ 1 UPTO M DO 03830000
BEGIN FMIN ~ 1; 03840000
FOR J ~ 1 UPTO K1 DO 03850000
IF H[K,J] = EQ AND FMIN < G[J] THEN FMIN ~ G[J] ELSE 03860000
IF H[K,J] = GR AND FMIN { G[J] THEN FMIN ~ G[J]+1; 03870000
F[K] ~ FMIN; 03880000
FOR J ~ K1 STEP -1 UNTIL 1 DO 03890000
IF H[K,J] = EQ AND FMIN > G[J] THEN FIXUPCOL(K,J,0) ELSE 03900000
IF H[K,J] = LS AND FMIN } G[J] THEN FIXUPCOL(K,J,1); 03910000
K1 ~ K1+1; GMIN ~ 1; 03920000
FOR I ~ 1 UPTO K DO 03930000
IF H[I,K]= EQ AND F[I] > GMIN THEN GMIN ~ F[I] ELSE 03940000
IF H[I,K]= LS AND F[I] } GMIN THEN GMIN ~ F[I]+1; 03950000
G[K] ~ GMIN; 03960000
FOR I ~ K STEP -1 UNTIL 1 DO 03970000
IF H[I,K] = EQ AND F[I] < GMIN THEN FIXUPROW(I,K,0) ELSE 03980000
IF H[I,K] = GR AND F[I] { GMIN THEN FIXUPROW(I,K,1); 03990000
END K; 04000000
END BLOCK B2; 04010000
WRITE (PRINTFIL [PAGE]); 04020000
04030000
04040000
BEGIN COMMENT BLOCK B3. BUILD TABLES OF PRODUCTION REFERENCES; 04050000
INTEGER I,J,K,L; 04060000
INTEGER ARRAY MTB[0:M]; COMMENT MASTER TABLE; 04070000
INTEGER ARRAY PRTB[0:1022]; COMMENT PRODUCTION TABLE; 04080000
L ~ 0; 04090000
FOR I ~ 1 UPTO M DO 04100000
BEGIN MTB[I] ~ L+1; 04110000
FOR J ~ 1 UPTO N DO 04120000
IF REF[J,1] = I THEN 04130000
BEGIN FOR K ~ 2,3,4,5 DO 04140000
IF REF[J,K] ! 0 THEN 04150000
BEGIN L ~ L+1; PRTB[L] ~ REF[J,K] 04160000
END; 04170000
L ~ L+1; PRTB[L] ~ -J; L ~ L+1; 04180000
PRTB[L] ~ REF[J,0]; 04190000
END; 04200000
L ~ L+1; PRTB[L] ~ 0 04210000
END; 04220000
COMMENT PRINT AND PUNCH THE RESULTS: 04230000
SYMBOLTABLE, PRECEDENCE FUNCTIONS, SYNTAX REFERENCE TABLES; 04240000
WRITE (PRINTFIL, <X8,"NO.",X5,"SYMBOL",X8, 04250000
"F",X5,"G",X4,"MTB"/>); 04260000
FOR I ~ 1 UPTO M DO 04270000
BEGIN SETTEXT(I,SYTB[I],F[I],G[I], MTB[I], WRITEBUFFER[0]); 04280000
OUTPUT 04290000
END; 04300000
WRITE (PRINTFIL, </"PRODUCTION TABLE:"/>); 04310000
FOR I ~ 0 STEP 10 UNTIL L DO 04320000
WRITE (PRINTFIL, <I9,X2,10I6>, 04330000
FOR I ~ 0 STEP 10 UNTIL L DO 04340000
[I, FOR J ~ I UPTO I+9 DO PRTB[J]]); 04350000
WRITE (PRINTFIL, </"SYNTAX VERSION ",A5>, TIME(0)); 04360000
WRITE (PCH, <X4,"FT ~",I3,"; LT ~",I4,"; LP ~",I4,";">, 04370000
LT+1,M,L); 04380000
FOR I ~ 1 STEP 6 UNTIL M DO 04390000
BEGIN PCHTX(SYTB[I], WRITEBUFFER[0], 04400000
IF M-I } 6 THEN 6 ELSE M-I+1); 04410000
WRITE (PCH,10,WRITEBUFFER[*]); 04420000
CLEAR(WRITEBUFFER[0],9) 04430000
END; 04440000
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO M DO F[I]); 04450000
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO M DO G[I]); 04460000
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO M DO MTB[I]); 04470000
WRITE (PCH, <X4,12(I4,",")>, FOR I ~ 1 UPTO L DO PRTB[I]); 04480000
END BLOCK B3 04490000
END BLOCK A; 04500000
04510000
EXIT: 04520000
END. 99999900

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff