2,12c2,8
< %CONSTINTEGER GRAMMAR=1, OLDFILE=2;                  !IN STREAMS
< %CONSTINTEGER REPORT=0, NEWFILE=1, GLIST=2, DLIST=3; !OUT STREAMS
< %CONSTINTEGER IDENT=70
< %CONSTINTEGER LASTBIT=512, EXIT=0
< %OWNINTEGER CHARMAX=0, NMAX=-1, INITS=0
< %OWNINTEGER NEWNAME=0
< %INTEGER SYM,GMIN,GMAX,KMAX
< %BYTEINTEGERARRAY CHAR(1:600)
< %INTEGERARRAY INDEX(0:127)
< %INTEGERARRAY ITEM,NEXT(0:255)
< %INTEGERARRAY INITIAL(1:79)
---
> %OWNINTEGER GRA=1, OLD=2;                   !IN STREAMS
> %OWNINTEGER ERR=0, NEW=1, GLIST=2, DLIST=3; !OUT STREAMS
> %OWNINTEGER SSBASE=92
> %OWNINTEGER EOP=0, NMAX=-1
> %INTEGER SYM,COUNT,ORDINAL,CHARMAX,GMIN,GMAX,KMAX
> %INTEGERARRAY CHAR(1:600),INDEX(0:127)
> %INTEGERARRAY ITEM,NEXT(0:255),PHRASE(SSBASE:111),ATOMIC(64:111)
14,17c10
< %const %integer phrase min = 112
< %const %integer atom max   = 111
< %integer %array phrase(phrase min:255)
< %integer %array atomic(80:111)
---
> %FAULT 9 ->99
20,35c13
<     %CYCLE
<        READ SYMBOL(SYM) %UNTIL SYM # ' '
<        %RETURN %UNLESS SYM = '-' %AND NEXTSYMBOL = NL
<        SKIP SYMBOL
<     %REPEAT
< %END
< 
< %ROUTINE PRINT CHARS(%INTEGER P)
<     PRINT SYMBOL(CHAR(P)) %AND P=P+1 %WHILE CHAR(P) # 0
< %END
< 
< %ROUTINE PRINT NAME(%INTEGER N)
<     PRINT CHARS(INDEX(N&127))
<     %WHILE N&384 # 0 %CYCLE
<        PRINT SYMBOL('<');  N = N-128
<     %REPEAT
---
> 1:  READ SYMBOL(SYM);  ->1 %IF SYM = ' '
39c17
< %INTEGER I,J,K,M
---
> %INTEGER I,J,K
41,45c19,21
<     %CYCLE
<        I = I+1;  CHAR(I) = SYM
<        READ SYMBOL(SYM)
<        %EXIT %UNLESS 'A'<=SYM<='Z' %OR '0'<=SYM<='9' %OR SYM=''''
<     %REPEAT
---
> 1:  I = I+1;  CHAR(I) = SYM
>     READ SYMBOL(SYM)
>     ->1 %IF 'A' <= SYM <= 'Z' %OR '0' <= SYM <= '9' %OR SYM = ''''
47,73c23,39
<     READ SYM %IF SYM = ' '
<     M = NMAX
<     %WHILE M >= 0 %CYCLE
<        J = INDEX(m);  K = CHARMAX+1
<        %WHILE J # 0 %AND CHAR(J) = CHAR(K) %CYCLE
<           ->OK %IF CHAR(J) = 0
<           J = J+1;  K = K+1
<        %REPEAT
<        M = M-1
<     %REPEAT
< OK: %IF NEWNAME # 0 %START
<        %IF M >= 0 %START
<           %PRINTTEXT 'DUPLICATE: '
<           PRINT CHARS(CHARMAX+1)
<           NEWLINE
<        %FINISH
<        INDEX(N) = CHARMAX+1;  CHARMAX = I
<        NMAX = N %IF NMAX < N
<     %FINISH %ELSE %START
<        %IF M < 0 %START
<           %PRINTTEXT 'UNKNOWN: '
<           PRINT CHARS(CHARMAX+1)
<           NEWLINE
<           M = 0
<        %FINISH
<        N = M
<     %FINISH
---
>     N = -1
> 2:  ->5 %IF N = NMAX
>     N = N+1
>     J = INDEX(N);  K = CHARMAX+1
> 3:  ->2 %IF J = 0 %OR CHAR(J) # CHAR(K)
>     ->9 %IF CHAR(J) = 0
>     J = J+1;  K = K+1
>     ->3
> 5:  N = N+1;  NMAX = N
>     INDEX(N) = CHARMAX+1;  CHARMAX = I
> 9:  READ SYM %IF SYM = ' '
> %END
> 
> %ROUTINE PRINT NAME(%INTEGER N)
>     N = INDEX(N&127)
> 1:  PRINT SYMBOL(CHAR(N));  N = N+1
>     ->1 %IF CHAR(N) # 0
77,79c43,44
< %OWNINTEGER MINMIN=0, MAXMAX=0
< %INTEGER I,J,K,L,P,MIN,MAX,EXP,END
< %INTEGERARRAY CONVERTED(-100:150), HEAD,TAIL(-100:-1), TOKEN,LINK(1:150)
---
> %INTEGER I,J,P,MIN,MAX,EXP,END,TERMINAL
> %INTEGERARRAY CONVERTED(-100:125), HEAD,TAIL(-100:-1), TOKEN,LINK(1:125)
82,83c47
< %INTEGERFN CELL(%INTEGER H,T)
< !CREATES A LIST CELL, IF NECESSARY, WITH HEAD H AND TAIL T
---
> %INTEGERFN NEW(%INTEGER H,T)
86,90c50,54
<     %WHILE I # MIN %CYCLE
<        I = I-1
<        %RESULT = I %IF HEAD(I) = H %AND TAIL(I) = T
<     %REPEAT
<     MIN = MIN-1;  HEAD(MIN) = H;  TAIL(MIN) = T
---
> 1:  ->2 %IF I = MIN
>     I = I-1
>     %RESULT = I %IF HEAD(I) = H %AND TAIL(I) = T
>     ->1
> 2:  MIN = MIN-1;  HEAD(MIN) = H;  TAIL(MIN) = T
98,104c62,68
<     HX=X %AND X=Y %AND Y=HX %IF X < Y
<     %IF X >= 0 %START
<        %RESULT = CELL(X,Y) %IF Y >= 0
<        HY = HEAD(Y)
<        %RESULT = CELL(X,Y) %IF X > HY
<        %RESULT = CELL(HY,UNION(X,TAIL(Y))) %IF X # HY
<        %RESULT = Y
---
>     %RESULT = UNION(Y,X) %IF X < Y
>     %IF X >= 0 %THEN %START
>         %RESULT = NEW(X,Y) %IF Y >= 0
>         HY = HEAD(Y)
>         %RESULT = NEW(X,Y) %IF X > HY
>         %RESULT = NEW(HY,UNION(X,TAIL(Y))) %IF X # HY
>         %RESULT = UNION(X,TAIL(Y))
107,109c71,73
<     %RESULT = CELL(HX,UNION(TAIL(X),Y)) %IF HX > HY
<     %RESULT = CELL(HY,UNION(X,TAIL(Y))) %IF HX # HY
<     %RESULT = CELL(HX,UNION(TAIL(X),TAIL(Y)))
---
>     %RESULT = NEW(HX,UNION(TAIL(X),Y)) %IF HX > HY
>     %RESULT = NEW(HY,UNION(X,TAIL(Y))) %IF HX # HY
>     %RESULT = NEW(HX,UNION(TAIL(X),TAIL(Y)))
115,117c79,80
<     %UNTIL I = X %CYCLE
<        J = LINK(I);  LINK(I) = Y;  I = J
<     %REPEAT
---
> 1:  J = LINK(I);  LINK(I) = Y;  I = J
>     ->1 %UNLESS I = X
121d83
< !INPUTS A REGULAR EXPRESSION AND CREATES INTERMEDIATE GRAPH REPRESENTATION
124,129c86,91
< S:  STRING = 0
< U:  %IF SYM = '(' %START
<        READ SYM
<        ACCEPT EXP(UNIT,UNIT END)
<        ->ERR %IF UNIT = 0 %OR SYM # ')'
<        READ SYM
---
> 1:  STRING = 0
> 2:  %IF SYM = '(' %THEN %START
>         READ SYM
>         ACCEPT EXP(UNIT,UNIT END)
>         ->9 %UNLESS UNIT # 0 %AND SYM = ')'
>         READ SYM
131,154c93,115
<        %IF 'A' <= SYM <= 'Z' %START
<           READ NAME(I)
<           I = I+128 %AND READ SYM %WHILE SYM = '<'
<        %FINISH %ELSE %START
<           ->ERR %IF SYM # '+'
<           I = 0
<           I = I+128 %AND READ SYM %WHILE SYM = '+'
<        %FINISH
<        MAX = MAX+1;  TOKEN(MAX) = I; LINK(MAX) = MAX
<        UNIT = MAX;  UNIT END = MAX
<     %FINISH
<     %IF SYM = '*' %OR SYM = '!' %START
<        MAX = MAX+1;  TOKEN(MAX) = -1;  LINK(MAX) = MAX
<        MIN = MIN-1; HEAD(MIN) = MAX; TAIL(MIN) = UNIT
<        CONCATENATE(UNIT END,MIN);  UNIT END = MAX
<        UNIT = MIN %IF SYM = '*'
<        READ SYM
<     %FINISH
<     %IF SYM = '?' %START
<       MAX = MAX+1;  TOKEN(MAX) = -1
<        LINK(MAX) = LINK(UNIT END);  LINK(UNIT END) = MAX
<        MIN = MIN-1;  HEAD(MIN) = MAX;  TAIL(MIN) = UNIT
<        UNIT = MIN
<        READ SYM
---
>         ->9 %UNLESS 'A' <= SYM <= 'Z'
>         READ NAME(I)
> 3:      %IF SYM = '<' %THEN %START
>             I = I+128
>             READ SYM
>             ->3
>         %FINISH
>         MAX = MAX+1;  TOKEN(MAX) = I;  LINK(MAX) = MAX
>         UNIT = MAX;  UNIT END = MAX
>     %FINISH
>     %IF SYM = '*' %OR SYM = '!' %THEN %START
>         MAX = MAX+1;  TOKEN(MAX) = 0;  LINK(MAX) = MAX
>         MIN = MIN-1;  HEAD(MIN) = MAX;  TAIL(MIN) = UNIT
>         CONCATENATE(UNIT END,MIN);  UNIT END = MAX
>         UNIT = MIN %IF SYM = '*'
>         READ SYM
>     %FINISH
>     %IF SYM = '?' %THEN %START
>         MAX = MAX+1;  TOKEN(MAX) = 0
>         LINK(MAX) = LINK(UNIT END);  LINK(UNIT END) = MAX
>         MIN = MIN-1;  HEAD(MIN) = MAX;  TAIL(MIN) = UNIT
>         UNIT = MIN
>         READ SYM
158,161c119,121
<     ->U %UNLESS SYM = ',' %OR SYM = ')' %OR SYM = NL
<     %IF EXP = 0 %START
<        EXP = STRING
<        EXP END = STRING END
---
>     ->2 %UNLESS SYM = ',' %OR SYM = ')' %OR SYM = NL
>     %IF EXP = 0 %THEN %START
>         EXP = STRING;  EXP END = STRING END
163,166c123,125
<        EXP = UNION(STRING,EXP)
<        I = LINK(EXP END)
<        LINK(EXP END) = LINK(STRING END)
<        LINK(STRING END) = I
---
>         EXP = UNION(STRING,EXP)
>         I = LINK(EXP END);  LINK(EXP END) = LINK(STRING END)
>         LINK(STRING END) = I
169,171c128,130
<     READ SYM %UNTIL SYM # NL
<     ->S
< ERR:EXP = 0
---
> 8:  READ SYM;  ->8 %IF SYM = NL
>     ->1
> 9:  EXP = 0
175c134
< %INTEGER I,J,COUNT,M,N,GMAX1,LOOPSTOP
---
> %INTEGER I,J,K,L,M,N,GMAX1,LOOP STOP
179,191c138,150
<     %CYCLE
<        %RETURN %IF X = 0
<        %IF X < 0 %START
<           TCOUNT(TAIL(X))
<           X = HEAD(X)
<        %FINISH
<        T = TOKEN(X)
<        %EXIT %IF T >= 0
<        %RETURN %IF T = LOOPSTOP
<        TOKEN(X) = LOOPSTOP
<        X = LINK(X)
<     %REPEAT
<     COUNT = COUNT-1
---
> 1:  %RETURN %IF X = 0
>     %IF X < 0 %THEN %START
>         TCOUNT(TAIL(X))
>         X = HEAD(X)
>     %FINISH
>     T = TOKEN(X)
>     %IF T <= 0 %THEN %START
>         %RETURN %IF T = LOOP STOP
>         TOKEN(X) = LOOP STOP
>         X = LINK(X)
>         ->1
>     %FINISH
>     K = K-1
195,230c154,184
< %OWNINTEGER I,T,TC,U,UC
<     %WHILE X # 0 %CYCLE
<        %IF X < 0 %START
<        ADD COMPONENTS(TAIL(X))
<        X = HEAD(X)
<     %FINISH
<     T = TOKEN(X)
<     %EXIT %IF T >= 0
<     %RETURN %IF T = LOOPSTOP
<     TOKEN(X) = LOOPSTOP
<        X = LINK(X)
<     %REPEAT
<     %IF X # 0 %THEN X = LINK(X) %ELSE T = EXIT
<     TC = T&127
<     I = GMAX1
<     %CYCLE
<        I = I+1
<        %EXIT %IF I > GMAX
<        U = ITEM(I)
<        NEXT(I)=UNION(NEXT(I),X) %AND %RETURN %IF U = T
<        UC = U&127
<        %IF UC = TC %OR (UC > ATOMMAX %AND TC > ATOMMAX) %START
<           %PRINTTEXT 'CLASH: ';
<           PRINT NAME(U);  SPACE;  PRINT NAME(T)
<           NEWLINE
<        %FINISH
<        %IF TC = IDENT %OR (TC<UC %AND UC>=PHRASEMIN) %OR UC = 0 %START
<           %CYCLE I = GMAX,-1,I
<              ITEM(I+1) = ITEM(I)
<              NEXT(I+1) = NEXT(I)
<           %REPEAT
<           %EXIT
<        %FINISH
<     %REPEAT
<     GMAX = GMAX+1
<     ITEM(I) = T;  NEXT(I) = X
---
> %OWNINTEGER I,J,K,T
> 1:  %IF X # 0 %THEN %START
>         %IF X < 0 %THEN %START
>             ADD COMPONENTS(TAIL(X))
>             X = HEAD(X)
>         %FINISH
>         T = TOKEN(X)
>         %IF T <= 0 %THEN %START
>             %RETURN %IF T = LOOP STOP
>             TOKEN(X) = LOOP STOP;  X = LINK(X)
>             ->1
>         %FINISH
>         I = GMAX1;  X = LINK(X)
> 2:      %IF I # GMAX %THEN %START
>             I = I+1;  K = ITEM(I)
>             %IF K # T %THEN %START
>                 K = K&127
>                 ->2 %UNLESS K>=96 %OR K=48 %OR (K>=64 %AND ATOMIC(K)=48)
>                 ->2 %UNLESS T&127 < K
>                 %CYCLE I = GMAX,-1,I
>                     ITEM(I+1) = ITEM(I)
>                     NEXT(I+1) = NEXT(I)
>                 %REPEAT
>                 GMAX = GMAX+1
>                 ITEM(I) = T;  NEXT(I) = X
>             %FINISH %ELSE NEXT(I) = UNION(NEXT(I),X)
>         %FINISH %ELSE %START
>             GMAX = GMAX+1
>             ITEM(GMAX) = T;  NEXT(GMAX) = X
>         %FINISH
>     %FINISH %ELSE TERMINAL = 512
233c187
<     LOOPSTOP = -1;  GMIN = GMAX+1
---
>     LOOP STOP = 0;  GMIN = GMAX+1
235c189
<        CONVERTED(I) = 0
---
>         CONVERTED(I) = 0
239c193,194
<     LOOPSTOP = LOOPSTOP-1
---
>     LOOP STOP = LOOP STOP - 1
>     TERMINAL = 0
241,244c196,198
<     ITEM(GMAX) = ITEM(GMAX)+LASTBIT
<     %IF GMAX1 = 0 %START
<       INITS = GMAX
<        INITS = INITS-1 %WHILE INITS # 0 %AND ITEM(INITS)&127 >= PHRASEMIN
---
>     %IF TERMINAL # 0 %THEN %START
>         GMAX = GMAX+1
>         ITEM(GMAX) = 0;  NEXT(GMAX) = 0
246c200,201
<     CONVERTED(N) = GMAX+1
---
>     ITEM(GMAX) = ITEM(GMAX)+512
>     CONVERTED(N) = GMAX1+1
249,260c204,215
<        J = NEXT(I)
<        %IF J # 0 %START
<           COUNT = CONVERTED(J)
<           %IF COUNT = 0 %START
<              LOOPSTOP = LOOPSTOP-1
<              TCOUNT(J)
<              CONVERTED(J) = COUNT
<           %FINISH
<           %IF COUNT < M %START
<              M = COUNT;  N = J
<           %FINISH
<        %FINISH
---
>         J = NEXT(I)
>         %IF J # 0 %THEN %START
>             K = CONVERTED(J)
>             %IF K = 0 %THEN %START
>                 LOOP STOP = LOOP STOP - 1
>                 TCOUNT(J)
>                 CONVERTED(J) = K
>             %FINISH
>             %IF K < M %THEN %START
>                 M = K;  N = J
>             %FINISH
>         %FINISH
264,266c219,221
<        J = NEXT(I)
<        J = CONVERTED(J) %IF J # 0
<        NEXT(I) = J
---
>         K = NEXT(I)
>         %IF K # 0 %THEN K = CONVERTED(K) %ELSE K = EOP
>         NEXT(I) = K
276c231
<    J=I %AND I=MAP(I) %UNTIL I = J %OR I = 0
---
> 1:  J = I;  I = MAP(I);  ->1 %UNLESS I = J %OR I = 0
283,291c238,244
< 1:  %CYCLE
<        K = ITEM(MM)
<        ->9 %UNLESS ITEM(NN) = K
<        I = NEXT(NN);  J = NEXT(MM)
<        ->9 %IF (I=0 %AND J#0) %OR (I#0 %AND J=0)
<        POS1 = POS1+1;  STACK(POS1) = NN;  MAP(NN) = MM
<        NN = NN+1;  MM = MM+1
<        %EXIT %IF K&LASTBIT # 0
<     %REPEAT
---
> 1:  K = ITEM(MM)
>     ->9 %UNLESS ITEM(NN) = K
>     I = NEXT(NN);  J = NEXT(MM)
>     ->9 %UNLESS I = J %OR (255#I#0 %AND 255#J#0)
>     POS1 = POS1+1;  STACK(POS1) = NN;  MAP(NN) = MM
>     NN = NN+1;  MM = MM+1
>     ->1 %IF K&512 = 0
293c246
<     POS2 = POS2+1; I = STACK(POS2)
---
>     POS2 = POS2+1;  I = STACK(POS2)
296,297c249,250
<     %IF NN < MM %START
<        I = NN; NN = MM; MM = I
---
>     %IF NN < MM %THEN %START
>         I = NN;  NN = MM;  MM = I
300,304c253,255
< 9:  %WHILE POS1 # 0 %CYCLE
<        I = STACK(POS1);  MAP(I) = I
<        POS1 = POS1-1
<     %REPEAT
<     %RESULT = 0
---
> 9:  %RESULT = 0 %IF POS1 = 0
>     I = STACK(POS1);  MAP(I) = I;  POS1 = POS1-1
>     ->9
307,309c258
<     %CYCLE I = 0,1,GMAX
<        MAP(I) = I
<     %REPEAT
---
>     %CYCLE I = 0,1,255;  MAP(I) = I;  %REPEAT
311,315c260,264
<        %IF MAP(N) = N %START
<           %IF N = GMIN %OR ITEM(N-1)&LASTBIT # 0 %START
<              M = 1
<              %WHILE M # N %CYCLE
<                 %EXIT %IF MAP(M) = M %AND EQUIVALENT(N,M) # 0
---
>         %IF MAP(N) = N %THEN %START
>             ->4 %IF N # GMIN %AND ITEM(N-1)&512 = 0
>             M = 1
> 2:          %IF M # N %THEN %START
>                 ->4 %IF MAP(M) = M %AND EQUIVALENT(N,M) # 0
317,322c266,271
<              %REPEAT
<           %FINISH
<        %FINISH %ELSE %START
<           MAP(N) = ULT MAP(N)
<        %FINISH
<     %REPEAT
---
>                 ->2
>             %FINISH
>         %FINISH %ELSE %START
>             MAP(N) = ULT MAP(N)
>         %FINISH
> 4:  %REPEAT
325,331c274,280
<        K = MAP(I)
<        %IF K = I %START
<           J = J+1;  MAP(I) = J
<           ITEM(J) = ITEM(I); NEXT(J) = NEXT(I)
<        %FINISH %ELSE %START
<           MAP(I) = MAP(K)
<        %FINISH
---
>         K = MAP(I)
>         %IF K = I %THEN %START
>             J = J+1;  MAP(I) = J
>             ITEM(J) = ITEM(I);  NEXT(J) = NEXT(I)
>         %FINISH %ELSE %START
>             MAP(I) = MAP(K)
>         %FINISH
335,336c284,287
<        K = NEXT(I)
<        NEXT(I) = MAP(K) %IF K # 0
---
>         K = NEXT(I)
>         %IF K # 0 %THEN %START
>             NEXT(I) = MAP(K)
>         %FINISH
341,344c292,295
< 1:  READ SYM %UNTIL SYM # NL
<     ->10 %IF SYM = '/'
<     %IF SYM = 'S' %AND NEXT SYMBOL = 'S' %START
<        SKIP SYMBOL;  P = 0
---
> 1:  READ SYM;  ->1 %IF SYM = NL
>     %RETURN %IF SYM = '/'
>     %IF SYM = 'S' %AND NEXT SYMBOL = 'S' %THEN %START
>         SKIP SYMBOL;  READ(I);  P = SSBASE+I;  EOP = 0
346c297
<        READ NAME(P);  ->9 %UNLESS PHRASEMIN <= P <= 127
---
>         READ NAME(P);  EOP = 0255
349c300
<     READ SYM %UNTIL SYM # NL %AND SYM # '-' %AND SYM # '>'
---
> 2:  READ SYM;  ->2 %IF SYM = NL %OR SYM = '-' %OR SYM = '>'
351c302,307
<     ->9 %IF EXP = 0 %OR SYM # NL
---
>     %IF EXP = 0 %OR SYM # NL %THEN %START
>         %PRINTTEXT 'WRONG FORMAT AT: '
> 3:      PRINT SYMBOL(SYM);  ->1 %IF SYM = NL
>         READ SYM
>         ->3
>     %FINISH
355,358c311,312
<     MINMIN = MIN %IF MIN < MINMIN
<     MAXMAX = MAX %IF MAX > MAXMAX
<     I = GMIN
<     MINIMIZE %AND I=MAP(GMIN) %UNLESS P = 112; !APP
---
>     MINIMIZE %UNLESS P = 111;               !APP
>     PHRASE(P) = GMIN
360,382d313
<     %IF P = 0 %START;                      !SS
<        %CYCLE I = 1,1,GMAX
<           J = ITEM(I);  K = NEXT(I)
<           %IF K # 0 %START
<              K = K-INITS;  %STOP %IF K <= 0
<           %FINISH
<           %IF I <= INITS %START
<              L = J&127
<              ->99 %IF L >= PHRASEMIN
<              L = ATOMIC(L) %IF L >= 80
<              %MONITOR 25 %IF INITIAL(L) # 0
<              INITIAL(L) = j<<8+K;! j was jj ***
<           %FINISH %ELSE %START
<              ITEM(I-INITS) = J;  NEXT(I-INITS) = K
<           %FINISH
< 99:    %REPEAT
<        GMAX = GMAX-INITS
<     %FINISH %ELSE %START
<        PHRASE(P) = I
<        PRINT NAME(P);  %PRINTTEXT ' =>'
<        WRITE(I,1)
<     %FINISH
<     K = LASTBIT
384,399c315,326
<        %IF K&LASTBIT # 0 %START
<           NEWLINE;  WRITE(I,3);  J = 0
<        %FINISH
<        J = J+1
<        %IF J > 5 %START
<           NEWLINE;  SPACES(4);  J = 1
<        %FINISH
<        SPACES(3)
<        K = ITEM(I)
<        %IF K&127 # 0 %START
<           PRINT NAME(K)
<        %FINISH %ELSE %START
<           %PRINTTEXT '*E'
<           PRINT SYMBOL('+') %AND K=K-128 %WHILE K&384 # 0
<        %FINISH
<        WRITE(NEXT(I),1)
---
>         %IF I = 1 %OR ITEM(I-1)&512 # 0 %THEN %START
>             NEWLINE;  WRITE(I,3);  J = 0
>         %FINISH
>         J = J+1
>         %IF J > 5 %THEN %START
>             NEWLINE;  SPACES(4);  J = 1
>         %FINISH
>         SPACES(3)
>         %IF ITEM(I)&511 # 0 %THEN %START
>             PRINT NAME(ITEM(I)&127)
>             WRITE(NEXT(I),1)
>         %FINISH %ELSE %PRINTTEXT '*E*'
401,402c328
<     NEWLINE
<     SELECT OUTPUT(REPORT)
---
>     NEWLINE;  SELECT OUTPUT(ERR)
404,438d329
< 9:  PRINT NAME(P) %AND NEWLINE %IF P # 0
<     %PRINTTEXT 'WRONG FORMAT AT: '
<     K = 0
<     %WHILE SYM # NL %OR K = ',' %OR K = '-' %CYCLE
<        PRINT SYMBOL(SYM);  K = SYM;  READ SYMBOL(SYM)
<     %REPEAT
<     NEWLINE
<     ->1
< 10: %PRINTTEXT 'MIN =';  WRITE(MINMIN,1)
<     %PRINTTEXT '  MAX =';  WRITE(MAXMAX,1)
<     NEWLINE
<     !DEAL WITH INITIAL PHRASE
<     !ASSUMES EXACTLY ONE (IMP)
<     P = PHRASE(ITEM(1)&127)
<     %MONITOR 26 %IF P = 0
<     %CYCLE
<        J = ITEM(P);  K = J&127
<        %MONITOR 27 %IF K >= PHRASEMIN
<        K = ATOMIC(K) %IF K >= 80
<        %MONITOR 28 %IF INITIAL(K) # 0
<        INITIAL(K) = (J&127+LASTBIT)<<8+NEXT(P)
<        %EXIT %IF J&LASTBIT # 0
<        P = P+1
<     %REPEAT
<     SELECT OUTPUT(GLIST)
<     NEWLINES(2)
<     %CYCLE I = 1,1,79
<        K = INITIAL(I)
<        %IF K # 0 %START
<           WRITE(I,2);  %PRINTTEXT ':  '
<           PRINT NAME(K>>8);  WRITE(K&255,3)
<           NEWLINE
<        %FINISH
<     %REPEAT
<     SELECT OUTPUT(REPORT)
442c333
< %INTEGER I,J,K,DICT,DMAX,CODE,CLASS,SUB
---
> %INTEGER I,J,K,L,P,S,T
445,471c336,363
< %ROUTINE READ CODE
<     CODE = NEXT SYMBOL;  SUB = 0
<     %IF CODE # ',' %AND CODE # NL %START
<        SKIP SYMBOL
<        %RETURN %UNLESS CODE = '('
<        READ(SUB)
<        SKIP SYMBOL
<     %FINISH
<     CODE = CLASS+128
< %END
< 
< %ROUTINE INSERT WORD(%INTEGERNAME X)
<     %CYCLE
<        CODE = NL %IF CODE = '$'
<        %WHILE CHAR(X) < CODE %CYCLE
<           CONT(X) = SUB %IF CONT(X) = 0
<           X == ALT(X)
<        %REPEAT
<        %IF CHAR(X) # CODE %START
<          DMAX = DMAX+1;  CHAR(DMAX) = CODE
<           CONT(DMAX) = 0;  ALT(DMAX) = X;  X = DMAX
<        %FINISH
<        %EXIT %IF CODE&128 # 0
<        READ CODE
<        X == CONT(X)
<     %REPEAT
<     CONT(X) = SUB
---
> %ROUTINE READ S
>     S = NEXT SYMBOL;  T = 0
>     %IF S # ',' %AND S # NL %THEN %START
>         %UNLESS '0' <= S <= '9' %THEN %START
>             SKIP SYMBOL
>             %RETURN %UNLESS S = '('
>         %FINISH
>         READ(T)
>         SKIP SYMBOL %IF NEXT SYMBOL = ')'
>     %FINISH
>     S = K+128
> %END
> 
> %ROUTINE INSERT IN(%INTEGERNAME X)
>     %IF CHAR(X) < S %THEN %START
>         CONT(X) = T %IF CONT(X) = 0
>         INSERT IN(ALT(X));  %RETURN
>     %FINISH
>     %IF CHAR(X) # S %THEN %START
>         J = J+1;  CHAR(J) = S
>         CONT(J) = 0;  ALT(J) = X;  X = J
>     %FINISH
>     %IF S&128 = 0 %THEN %START
>         READ S;  INSERT IN (CONT(X))
>     %FINISH %ELSE %START
>         T = CONT(ALT(J)) %IF T = 0 %AND ALT(J) # 0
>         CONT(J) = T
>     %FINISH
475,519c367,405
< %INTEGER M,N,V
<     %CYCLE
<        KMAX = KMAX+1;  N = KMAX
<        M = ALT(X)
<        STORE(M) %AND M=-131072 %IF M # 0
<        V = CHAR(X);  X = CONT(X)
<        %EXIT %IF V&128 # 0
<        %IF M = 0 %START;  !NO ALTERNATIVES
<           %IF ALT(X) = 0 %AND CHAR(X)&128 = 0 %START
<              V = CHAR(X)<<7+V;  X = CONT(X)
<           %FINISH
<        %FINISH %ELSE %START
<           V = (KMAX+1)<<7+V-131072
<        %FINISH
<        KEYDICT(N) = V
<     %REPEAT
<     KEYDICT(N) = M + 65536 + X<<6 + V&63
< %END
< 
<     DICT = 0;  DMAX = 0;  CHAR(0) = 999
< 1:  %CYCLE
<        SYM = NEXT SYMBOL
<        %EXIT %UNLESS SYM = '[' %OR SYM = NL
<        READ SYMBOL(SYM) %UNTIL SYM = NL
<     %REPEAT
<     ->10 %IF SYM = '/'
<     READ(CLASS)
<     NEWNAME = 1
<     READ SYM;  READ NAME(CLASS)
<     NEWNAME = 0
<     %IF CLASS < 80 %START
<        %IF SYM # '[' %START
<           %CYCLE
<              CODE = SYM;  INSERT WORD(DICT)
<              READ SYMBOL(SYM)
<              %EXIT %IF SYM # ','
<              READ SYMBOL(SYM) %UNTIL SYM # ' ' %AND SYM # NL
<           %REPEAT
<        %FINISH
<     %FINISH %ELSE %START
<        %IF CLASS < PHRASEMIN %AND SYM = '=' %START
<           READ SYM;  READ NAME(ATOMIC(CLASS))
<        %FINISH
<     %FINISH
<     READ SYMBOL(SYM) %WHILE SYM # NL
---
> %INTEGER M,N
> 1:  %RETURN %IF X = 0
> 2:  KMAX = KMAX+1;  M = KMAX
>     ->2 %IF P # 0 %AND CHAR(X) > M
>     %IF ALT(X) # 0 %THEN %START
>         STORE(ALT(X));  N = \131071
>     %FINISH %ELSE N = 0
>     %IF CHAR(X)&128 = 0 %THEN %START
>         KMAX = 95 %IF KMAX < 95
>         KEYDICT(M) = N + (KMAX+1)<<7 + CHAR(X)
>         X = CONT(X);  P = 0
>         ->1
>     %FINISH
>     KEYDICT(M) = N + 65536 + CONT(X)<<6 + CHAR(X)&63
> %END
> 
>     I = 0;  J = 0;  CHAR(0) = 999
> 1:  SYM = NEXT SYMBOL
>     ->5 %IF SYM = '[' %OR SYM = NL
>     ->6 %IF SYM = '/'
>     READ(ORDINAL)
>     %STOP %IF ORDINAL <= NMAX
>     NMAX = ORDINAL-1
>     READ SYM;  READ NAME(K)
>     %STOP %IF K # ORDINAL
>     %IF K >= 64 %THEN %START
>         ->1 %UNLESS SYM = '/'
>         READ SYM;  READ NAME(L)
>         %STOP %IF L = NMAX
>         ATOMIC(K) = L
>         ->1
>     %FINISH
>     ->5 %IF SYM = '['
> 3:  S = SYM;  INSERT IN(I)
>     ->1 %IF NEXT SYMBOL = NL
>     SKIP SYMBOL
> 4:  READ SYMBOL(SYM);  ->4 %IF SYM = ' ' %OR SYM = NL
>     ->3
> 5:  READ SYMBOL(SYM);  ->5 %UNLESS SYM = NL
520a407,409
> 6:  %CYCLE J = 32,1,95;  KEYDICT(J) = 0;  %REPEAT
>     KMAX = 32;  P = 1;  STORE(I)
>     KEYDICT(94) = KEYDICT(92);  !EQUATE UPARROW TO BACKSLASH
525,535c414,419
<     %IF J&65536 = 0 %START
<        PRINT SYMBOL(J&127)
<        %IF J > 0 %START
<           J = J>>7
<           PRINT SYMBOL(J) %AND S=S+1 %IF J # 0
<           SPACE
<           I = I+1;  S = S+2
<           ->1
<        %FINISH
<        SPACE
<        DISPLAY(J>>7&511,S+2)
---
>     %IF I = 32 %THEN %START
>         PRINT SYMBOL('?');  NEWLINE;  %RETURN
>     %FINISH
>     %IF J&65536 = 0 %THEN %START
>         PRINT SYMBOL(J&127);  SPACE
>         DISPLAY(J>>7&511,S+2)
537,538c421,422
<        PRINT SYMBOL(':');  PRINT NAME(J&63)
<        WRITE(J>>6&1023,1);  NEWLINE
---
>         PRINT SYMBOL(':');  PRINT NAME(J&63)
>         WRITE(J>>6&1023,1);  NEWLINE
544,546c428
< 
< 10: SELECT OUTPUT(DLIST);  NEWLINES(2)
<     KMAX = 95;  KEYDICT(32) = 0
---
>     SELECT OUTPUT(DLIST);  NEWLINES(2)
548,562c430,434
<        PRINT SYMBOL(I);  SPACE
<        %IF CHAR(DICT) = I %START
<           J = (KMAX+1)<<2
<           STORE(CONT(DICT))
<           DICT = ALT(DICT)
<           DISPLAY(J>>2,2)
<        %FINISH %ELSE %START
<           PRINT SYMBOL('?');  NEWLINE
<           J = 32<<2
<        %FINISH
<       !LET:0  DIG:1  TERM:2  OTHER:3
<        J = J+3 %UNLESS 'A'<=I<='Z'
<        J = J-2 %IF '0'<=I<='9'
<        J = J-1 %IF I = ';'
<        KEYDICT(I) = J
---
>         J = (KEYDICT(I)>>7&511)<<2;  J = 32<<2 %IF J = 0
>         J = J+3 %UNLESS 'A'<=I<='Z';  J = J-2 %IF '0'<=I<='9'
>         J = J-1 %IF I = ';'
>         KEYDICT(I) = J
>         PRINT SYMBOL(I);  SPACE;  DISPLAY(J>>2,2)
565c437
<     SELECT OUTPUT(REPORT)
---
>     SELECT OUTPUT(ERR)
571,574c443,446
<     %CYCLE I = 1,1,79;  INITIAL(I) = 0;  %REPEAT
<     SELECT OUTPUT(REPORT)
<     READ SYMBOL(I) %UNTIL I = '/'
<     READ SYMBOL(I) %UNTIL I = NL
---
>     %CYCLE I = 64,1,111;  ATOMIC(I) = I;  %REPEAT
>     %CYCLE I = 96,1,111;  PHRASE(I) = 0;  %REPEAT
> 1:  READ SYMBOL(I);  ->1 %UNLESS I = '/'
> 2:  READ SYMBOL(I);  ->2 %UNLESS I = NL
576c448
<     READ SYMBOL(I) %UNTIL I = NL
---
> 3:  READ SYMBOL(I);  ->3 %UNLESS I = NL
579,587c451,455
<     SELECT OUTPUT(NEWFILE)
<     SELECT INPUT(OLDFILE);  %FAULT 9 ->EOF
<     I = 0
<     %CYCLE
<        READ SYMBOL(K);  PRINT SYMBOL(K)
<        I = 1 %IF K = '!' %AND NEXT SYMBOL = '*'
<        %EXIT %IF I = 1 %AND K = NL
<     %REPEAT
< EOF:%PRINTTEXT '%OWNINTEGER GMAX1=';  WRITE(GMAX,0)
---
>     SELECT OUTPUT(NEW)
>     WRITE(GMAX,1);  WRITE(KMAX,1)
> 5:  WRITE(PHRASE(SSBASE),1)
>     SSBASE = SSBASE+1
>     ->5 %IF SSBASE < 96
589,602c457,459
<     %PRINTTEXT '%OWNINTEGER GMAX=';  WRITE(GMAX,0)
<     NEWLINES(2)
<     %PRINTTEXT '%OWNINTEGERARRAY PHRASE(112:127) = %C'
<     %CYCLE I = 112,1,127
<        NEWLINE %IF I&7 = 0
<        WRITE(phrase(I),3)
<        PRINT SYMBOL(',') %UNLESS I = 127
<     %REPEAT
<     NEWLINES(2)
<     %PRINTTEXT '%OWNINTEGERARRAY ATOMIC(80:111) = %C'
<     %CYCLE I = 80,1,111
<        NEWLINE %IF I&7 = 0
<        WRITE(atomic(I),3)
<        PRINT SYMBOL(',') %UNLESS I = 111
---
>     %CYCLE I = 96,1,111
>         NEWLINE %IF I&7 = 0
>         WRITE(PHRASE(I),3)
604,617c461,464
<     NEWLINES(2)
< 
< %INTEGERFN PACKED(%INTEGER J,K)
<    K = (J&896)<<1+K
<    J = J&127
<    %RESULT = K<<7+J
< %END
< 
<     %PRINTTEXT '%OWNINTEGERARRAY INITIAL(1:79) = %C'
<     NEWLINE;  SPACES(9)
<     %CYCLE I = 1,1,79
<        NEWLINE %IF I&7 = 0
<        WRITE(PACKED(INITIAL(I)>>8,INITIAL(I)&255),7)
<        PRINT SYMBOL(',') %UNLESS I = 79
---
>     NEWLINE
>     %CYCLE I = 64,1,111
>         NEWLINE %IF I&7 = 0
>         WRITE(ATOMIC(I),7)
619,626c466,477
<     NEWLINES(2)
<     %PRINTTEXT '%OWNINTEGERARRAY GRAM(0:255) = %C'
<     %CYCLE I = 0,1,255
<        NEWLINE %IF I&7 = 0
<        K = 0
<        K = PACKED(ITEM(I)!!512,NEXT(I)) %IF I # 0 %AND I <= GMAX
<        WRITE(K,7)
<        PRINT SYMBOL(',') %UNLESS I = 255
---
>     NEWLINE
>     %CYCLE I = 1,1,255
>         NEWLINE %IF (I-1)&7 = 0
>         K = 0
>         %IF I <= GMAX %THEN %START
>             J = ITEM(I)
>             K = -131072 %IF J&512 = 0
>             K = (J&384)<<8+K
>             K = NEXT(I)<<7+K
>             K = J&127+K
>         %FINISH
>         WRITE(K,7)
628,634c479,482
<     NEWLINES(2)
<     %PRINTTEXT '%OWNINTEGERARRAY KDICT(32:';  WRITE(KMAX,0)
<     %PRINTTEXT ') = %C'
<     %CYCLE I = 32,1,KMAX
<        NEWLINE %IF I&7 = 0
<        WRITE(KEYDICT(I),7)
<        PRINT SYMBOL(',') %UNLESS I = KMAX
---
>     NEWLINE
>     %CYCLE I = 32,1,511
>         NEWLINE %IF (I-1)&7 = 0
>         WRITE(KEYDICT(I),7)
637,644c485,487
<     %FAULT 9 ->99
<     %CYCLE
<        %EXIT %IF NEXT SYMBOL = '!'
<        READ SYMBOL(K) %UNTIL K = NL
<     %REPEAT
<     %CYCLE
<        READ SYMBOL(K);  PRINT SYMBOL(K)
<     %REPEAT
---
>     SELECT INPUT(OLD)
> 10: READ SYMBOL(I);  ->10 %UNLESS I = '%' %OR I = '!'
> 20: PRINT SYMBOL(I);  READ SYMBOL(I);  ->20
646a490
> 
