begin
comment         ALGOL 60 - version of the ALGOL 60 - translator
                for the EL - X8, F.E.J. Kruseman Aretz;

comment         basic symbols;
integer plus, minus, mul, div, idi, ttp, equ, uqu, les, mst, mor, lst,
        non, qvl, imp, or, and, goto, for, step, until, while, do,
        comma, period, ten, colon, semicolon, colonequal, space sbl,
        if, then, else, comment, open, close, sub, bus, quote, unquote,
        begin, end, own, rea, integ, boole, stri, array, proced, switch,
        label, value, true, false, new line, underlining, bar;

comment         other global integers;
integer case, lower case, stock, stock1, last symbol, line counter,
        last identifier, last identifierl,
        quote counter, run number, shift,
        type, chara, character, value character, arr decla macro,
        value of constant, decimal exponent, decimal count,
        word count, nlp, last nlp, n, integer label,
        block cell pointer, next block cell pointer,
        dimension, for count, instruct counter, dp0,
        function letter, function digit, c variant,
        nl base, prog base, text base, text pointer,
        end of text, end of memory, start, end of list,
        d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14,
        d15, d16, d17, d18, d19, d20, d21, d22, d23, d24, d25,
        re, in, bo, st, ar, nondes, des, un, arbo, intlab;

comment         macro identifiers;
integer STACK, NEG, ADD, SUB, MUL, DIV, IDI, TTP,
        EQU, UQU, LES, MST, MOR, LST, STAB, NON, QVL, IMP, OR, AND,
        STAA, TSR, TSI, TSB, TSST, TFSU, TSL, TFSL, TCST,
        STSR, STSI, SSTSI, STSB, STSST, STFSU,
        ENTRIS, TFD, SAS, DECS, FAD, TASR, TASI, TASB, TASST, TASU,
        EXITIS, FADCV, TRSCV, TISCV, TSCVU, EXIT, TEST1, TEST2,
        CRV, CIV, CBV, CSTV, CLV, CEN, CLPN, TAV, TIAV,
        RAD, IAD, BAD, STAD, ORAD, OIAD, OBAD, OSTAD,
        LOS, EXITP, EXITPC, REJST, JUA, EMPTY,
        ABS, SIGN, ENTIER, SQRT, EXP, LN, END;

comment         macro2 identifiers;
integer TRV, TIV, TRC, TIC, TSIC, TBV, TBC, TSTV, TLV, TAK, TSWE,
        STR, STI, SSTI, STB, STST, DOS, DOS2, DOS3,
        JU, JU1, LJU, LJU1, COJU, YCOJU, SUBJ, ISUBJ, DECB, DO,
        TBL, ENTRB, DPTR, INCRB, TDL, ENTRPB, NIL, LAST,
        LAD, TDA, TNA, TAA, SWP, EXITB, EXITC, EXITSV,
        CODE, SLNC, RLNC, LNC;

comment         global Booleans;
Boolean letter last symbol, digit last symbol, arr declarator last symbol,
        type declarator last symbol, in array declaration, in formal list,
        text in memory, own type, int labels, real number, small,
        erroneous, derroneous, wanted;





comment         global arrays;
integer  array internal representation[0 : 127], word delimiter[0 : 23],
               macro list[0 : 511], tabel[5 : 59],
               instruct list[0 : 203], mask[0 : 9];

comment         start of initialization;
        plus:= read;    minus:= read;   mul:= read;     div:= read;
        idi:= read;     ttp:= read;     equ:= read;     uqu:= read;
        les:= read;     mst:= read;     mor:= read;     lst:= read;
        non:= read;     qvl:= read;     imp:= read;     or:= read;
        and:= read;     goto:= read;    for:= read;     step:= read;
        until:= read;   while:= read;   do:= read;      comma:= read;
        period:= read;  ten:= read;     colon:= read;   semicolon:= read;
        colonequal:= read; space sbl:= read; if:= read; then:= read;
        else:= read;    comment:= read; open:= read;    close:= read;
        sub:= read;     bus:= read;     quote:= read;   unquote:= read;
        begin:= read;   end:= read;     own:= read;     rea:= read;
        integ:= read;   boole:= read;   stri:= read;    array:= read;
        proced:= read;  switch:= read;  label:= read;   value:= read;
        true:= read;    false:= read;   new line:= read;
        underlining:= read; bar:= read; lower case:= read;

        STACK:= read;   NEG:= read;     ADD:= read;     SUB:= read;
        MUL:= read;     DIV:= read;     IDI:= read;     TTP:= read;
        EQU:= read;     UQU:= read;     LES:= read;     MST:= read;
        MOR:= read;     LST:= read;     STAB:= read;    NON:= read;
        QVL:= read;     IMP:= read;     OR:= read;      AND:= read;
        STAA:= read;    TSR:= read;     TSI:= read;     TSB:= read;
        TSST:= read;    TFSU:= read;    TSL:= read;     TFSL:= read;
        TCST:= read;    STSR:= read;    STSI:= read;    SSTSI:= read;
        STSB:= read;    STSST:= read;   STFSU:= read;   ENTRIS:= read;
        TFD:= read;     SAS:= read;     DECS:= read;    FAD:= read;
        TASR:= read;    TASI:= read;    TASB:= read;    TASST:= read;
        TASU:= read;    EXITIS:= read;  FADCV:= read;   TRSCV:= read;
        TISCV:= read;   TSCVU:= read;   EXIT:= read;    TEST1:= read;
        TEST2:= read;   CRV:= read;     CIV:= read;     CBV:= read;
        CSTV:= read;    CLV:= read;     CEN:= read;     CLPN:= read;
        TAV:= read;     TIAV:= read;    RAD:= read;     IAD:= read;
        BAD:= read;     STAD:= read;    ORAD:= read;    OIAD:= read;
        OBAD:= read;    OSTAD:= read;   LOS:= read;     EXITP:= read;
        EXITPC:= read;  REJST:= read;   JUA:= read;     EMPTY:= read;
        ABS:= read;     SIGN:= read;    ENTIER:= read;  SQRT:= read;
        EXP:= read;     LN:= read;      END:= read;





        TRV:= read;     TIV:= read;     TRC:= read;      TIC:= read;
        TSIC:= read;    TBV:= read;     TBC:= read;      TSTV:= read;
        TLV:= read;     TAK:= read;     TSWE:= read;     STR:= read;
        STI:= read;     SSTI:= read;    STB:= read;      STST:= read;
        DOS:= read;     DOS2:= read;    DOS3:= read;     JU:= read;
        JU1:= read;     LJU:= read;     LJU1:= read;     COJU:= read;
        YCOJU:= read;   SUBJ:= read;    ISUBJ:= read;    DECB:= read;
        DO:= read;      TBL:= read;     ENTRB:= read;    DPTR:= read;
        INCRB:= read;   TDL:= read;     ENTRPB:= read;   NIL:= read;
        LAST:= read;    LAD:= read;     TDA:= read;      TNA:= read;
        TAA:= read;     SWP:= read;     EXITB:= read;    EXITC:= read;
        EXITSV:= read;  CODE:= read;    SLNC:= read;     RLNC:= read;
        LNC:= read;

        d0 := 1;        d1 := 2;        d2 := 4;         d3 := 8;
        d4 := 16;       d5 := 32;       d6 := 64;        d7 := 128;
        d8 := 256;      d9 := 512;      d10:= 1024;      d11:= 2048;
        d12:= 4096;     d13:= 8192;     d14:= 16384;     d15:= 32768;
        d16:= 65536;    d17:= 131072;   d18:= 262144;    d19:= 524288;
        d20:= 1048576;  d21:= 2097152;  d22:= 4194304;   d23:= 8388608;
        d24:= 16777216; d25:= 33554432;

        re:= 0;         in:= 1;         bo:= 2;          st:= 3;
        ar:= 4;         nondes:= 5;     des:= 6;         un:= 7;
        arbo:= 8;       intlab:= 9;

        function letter:= read; function digit:= read; c variant:= read;

        for n:= 0 step 1 until 127 do internal representation[n]:= read;
        for n:= 0 step 1 until  23 do word delimiter[n]:= read;
        for n:= 0 step 1 until 511 do macro list[n]:= read;
        for n:= 5 step 1 until  59 do tabel[n]:= read;
        for n:= 0 step 1 until 203 do instruct list[n]:= read;
        for n:= 0 step 1 until   9 do mask[n]:= d20 × read;

        end of memory:= read;
        end of list:= instruct list[174];
        text in memory:= true; erroneous:= derroneous:= false;
        wanted:= read = 0;


begin   integer array space[0 : end of memory];

procedure ERRORMESSAGE (n); integer n;
begin   integer i;
        erroneous:= true;
        if n = 122 ∨ n = 123 ∨ n = 126 ∨ n = 127 ∨ n = 129
        then derroneous:= true;
        if n ≥ run number
        then begin NLCR; PRINTTEXT («er»); print (n);
                   print (line counter); print (last symbol);
                   for i:= 0 step 1 until word count do
                   print (space[nl base - last nlp - i])
             end
end ERRORMESSAGE;





integer procedure next symbol;
begin   integer symbol;
next0:  symbol:= if stock1 ≥ 0 then stock1 else next basic symbol;
        stock1 := -1;
        if (last symbol = semicolon ∨ last symbol = begin) ∧
           symbol = comment
        then begin skip0: symbol:= next basic symbol;
                          if symbol ≠ semicolon then goto skip0;
                          goto next0
             end;
        if last symbol = end
        then begin
             skip1: if symbol ≠ end ∧ symbol ≠ semicolon ∧ symbol ≠ else
                    then begin symbol:= next basic symbol; goto skip1 end
             end
        else
        if symbol = 125
        then begin stock1:= next basic symbol;
                   if stock1 > 9 ∧ stock1 < 64
                   then begin skip2: stock1:= next basic symbol;
                              if stock1 > 9 ∧ stock1 < 64
                              then goto skip2;
                              if stock1 = colon
                              then stock1:= next basic symbol
                              else ERRORMESSAGE (100);
                              if stock1 = open  then stock1:= - stock1
                                                else ERRORMESSAGE (101);
                              symbol:= comma
                        end
                   else symbol:= close
             end;
        digit last symbol := symbol < 10 ∨ symbol = period ∨
                             symbol = ten;
        letter last symbol:= symbol < 64 ∧ ¬ digit last symbol;
        next symbol:= last symbol:= symbol;
        outsymbol (run number, symbol);
        test pointers
end  next symbol;


integer procedure  next basic symbol;
begin   integer  symbol;
next0:  insymbol (run number, symbol);
        if symbol = new line
        then begin line counter:= line counter + 1;
                   if quote counter = 0
                   then begin outsymbol (run number, symbol);
                              goto next0
                        end
             end;
        next basic symbol:= symbol
end  next basic symbol;







procedure  insymbol (source, destination); integer  source, destination;
begin   integer  symbol, i;
        if (source = 200 ∨ source = 300) ∧ text in memory
        then
        begin destination:= bit string(d8 × shift, shift,
                            space[text base + text pointer]);
              if shift < 257
              then shift:= d8 × shift
              else begin shift:= 1; text pointer:= text pointer + 1 end
        end
        else
        begin symbol:= if stock > 0 then stock else next tape symbol;
              stock:= - 1;
              if symbol > bus
              then
              begin if symbol = 123 then symbol:= space sbl;
                    if quote counter > 0
                    then
                    begin if symbol = bar
                          then
                          begin next0: stock:= next tape symbol;
                                       if stock = bar then goto next0;
                                if stock = les
                                then quote counter:= quote counter + 1
                                else
                                if stock = mor
                                then
                                begin if quote counter = 1
                                      then begin symbol:= unquote;
                                                 stock:= - symbol
                                           end
                                      else quote counter:=
                                           quote counter - 1
                                end
                          end
                          else if symbol = 124
                               then symbol:= colon
                               else if symbol = 125 then symbol:= close
                    end
                    else
                    if symbol ≥ newline
                    then
                    begin if symbol = bar
                          then
                          begin next1: symbol:= next tape symbol;
                                       if symbol = bar then goto next1;
                              symbol:= if symbol = and then ttp else
                                       if symbol = equ then uqu else
                                       if symbol = les then quote else
                                       if symbol = mor then unquote
                                                       else 160
                          end
                          else
                          if symbol = underlining
                          then
                          begin symbol:= the underlined symbol;
                                if symbol > 63
                                then symbol:=
                                     if symbol = 124 then idi else
                                     if symbol = les then mst else
                                     if symbol = mor then lst else
                                     if symbol = non then imp else
                                     if symbol = equ then qvl
                                                     else 161
                                     else
                                     begin stock:= next tape symbol;
                                           if stock = underlining
                                           then
                                           begin
                                            symbol:= the underlined symbol +
                                                     d7 × symbol;
                                            for i:= 0 step 1 until 23 do
                                            begin
                                            if word delimiter[i] ÷ d7 = symbol
                                            then
                                             begin
                                             symbol:= word delimiter[i];
                                             symbol:= symbol -
                                                      symbol ÷ d7 × d7;
                                             goto next2
                                             end
                                            end;
                                            symbol:= 162;
                                     next2: stock:= next tape symbol;
                                            if stock = underlining
                                            then
                                            begin the underlined symbol;
                                                  goto next2
                                            end
                                           end
                                           else symbol:= 161
                                     end
                                end
                                else
                                if symbol = 124
                                then begin stock:= next tape symbol;
                                           if stock = equ
                                           then begin symbol:= colonequal;
                                                      stock:= - symbol
                                                end
                                           else symbol:= colon
                                     end
                          end
                          else insymbol (runnumber, symbol)
                    end;
                    destination:= symbol
        end
end  insymbol;





integer procedure  the underlined symbol;
begin   integer  symbol;
        symbol:= next tape symbol;
        the underlined symbol:= if symbol = underlining
                                then the underlined symbol
                                else symbol
end  the underlined symbol;

integer procedure  next tape symbol;
begin   integer  symbol, head;
        symbol:= internal representation[REHEP];
        if symbol > 0
        then begin head:= symbol ÷ d8;
                   next tape symbol:= abs (if case = lower case
                                           then symbol - d8 × head
                                           else head)
             end
        else begin if symbol < - 2 then case:= - symbol else
                   if symbol =   0 then ERRORMESSAGE (102) else
                   if symbol = - 1 then ERRORMESSAGE (103);
                   next tape symbol:= next tape symbol
             end
end  next tape symbol;

procedure  outsymbol (destination, source); integer destination, source;
begin   if destination = 100 ∧ text in memory
        then begin space[text base + text pointer]:=
                   space[text base + text pointer] + shift × source;
                   if shift < 257
                   then shift:= d8 × shift
                   else begin shift:= 1; text pointer:= text pointer + 1;
                              space[text base + text pointer]:= 0
                        end
             end
end  outsymbol;


Boolean procedure  arithoperator last symbol;
begin   arithoperator last symbol:= last symbol = plus  ∨
                                    last symbol = minus ∨
                                    last symbol = mul   ∨
                                    last symbol = div   ∨
                                    last symbol = idi   ∨
                                    last symbol = ttp
end  arithoperator last symbol;






Boolean procedure  relatoperator last symbol;
begin   relatoperator last symbol:= last symbol = les ∨
                                    last symbol = mst ∨
                                    last symbol = equ ∨
                                    last symbol = lst ∨
                                    last symbol = mor ∨
                                    last symbol = uqu
end  relatoperator last symbol;


Boolean procedure  booloperator last symbol;
begin   booloperator last symbol:= last symbol = qvl ∨
                                   last symbol = imp ∨
                                   last symbol = or  ∨
                                   last symbol = and
end  booloperator last symbol;


Boolean procedure  declarator last symbol;
begin   own type:= last symbol = own; if  own type then  next symbol;
        type:= if last symbol = rea   then 0 else
               if last symbol = integ then 1 else
               if last symbol = boole then 2 else
               if last symbol = stri  then 3 else 1000;
        if type < 4 then next symbol
                    else begin if own type then  ERRORMESSAGE (104);
                               if last symbol = array then  type:= 0
                         end;
        arr declarator last symbol:= last symbol = array;
        if arr declarator last symbol ∧ run number = 300
        then arr decla macro:= if own type
                               then (if type = 0 then ORAD else
                                     if type = 1 then OIAD else
                                     if type = 2 then OBAD else OSTAD)
                               else (if type = 0 then RAD else
                                     if type = 1 then IAD else
                                     if type = 2 then BAD else STAD);
        chara:= if arr declarator last symbol
                then 8
                else if last symbol = switch
                     then 14
                     else if last symbol = proced
                          then (if type < 4 then 16 else 24)
                          else type;
        type declarator last symbol:= chara < 4;
        if own type ∧ chara > 8 then ERRORMESSAGE (105);
        if type < 4 ∧ last symbol = switch then ERRORMESSAGE (106);
        if chara < 25 ∧ run number = 100
        then character:= ((if type declarator last symbol
                           then type
                           else if type < 4
                                then type + chara
                                else chara) +
                           (if own type then 32 else 0)) × d19;
        declarator last symbol:= chara < 25
end  declarator last symbol;






Boolean procedure  specifier last symbol;
begin   type:= if last symbol = rea   then 0 else
               if last symbol = integ then 1 else
               if last symbol = boole then 2 else
               if last symbol = stri  then 3 else
               if last symbol = array then 5 else 1000;
        if type < 4 then next symbol;
        chara:= if last symbol = label  then 6 else
                if last symbol = switch then 14 else 1000;
        if type + chara < 1000 then ERRORMESSAGE(107);
        chara:= if last symbol = array  then 8 else
                if last symbol = proced then (if type < 4 then 16
                                                          else 24)
                                        else chara;
        if chara < 25 then next symbol;
        if chara + type < 2000 ∧ run number = 100
        then begin value character:= (if chara > 8 then type else
                                      if chara = 6 then    6 else
                                      if  type = 5 then    8
                                      else type + chara) + 64;
                   character:= ((if type > 5
                                 then chara
                                 else (if type > 1 then type else 4) +
                                      (if chara < 1000 then chara
                                                       else 0))
                                + 96) × d19
             end;
        specifier last symbol:= chara + type < 2000
end  specifier last symbol;


Boolean procedure  operator last symbol;
begin   operator last symbol:= arithoperator last symbol ∨
                               relatoperator last symbol ∨
                               booloperator last symbol
end  operator last symbol;






procedure  unsigned number;
begin   integer  sign of exponent;
        if last symbol < 10
        then begin value of constant:= unsigned integer (0);
                   real number:= digit last symbol
             end
        else begin value of constant:= if last symbol = ten then 1
                                                            else 0;
                   real number:= true
             end;
        decimal exponent:= 0;
        if real number
        then begin
             next0: if last symbol < 10
                    then begin decimal exponent:= decimal exponent + 1;
                               next symbol; goto next0
                         end;
                    if last symbol = period
                    then begin next symbol;
                               value of constant:=
                               unsigned integer (value of constant);
                               decimal exponent:= decimal exponent -
                                                  decimal count;
                        next1: if last symbol < 10
                               then begin next symbol; goto next1 end
                         end;
                    if last symbol = ten
                    then begin next symbol; sign of exponent:= 1;
                               if last symbol = plus
                               then next symbol
                               else if last symbol = minus
                                    then begin next symbol;
                                               sign of exponent:= - 1
                                         end;
                               decimal exponent:= decimal exponent +
                                                  sign of exponent ×
                                                  unsigned integer (0);
                               if last symbol < 10
                               then begin  ERRORMESSAGE (108);
                                    next2: if next symbol < 9
                                           then goto next2
                                    end
                         end
             end;
        small:= value of constant < d15 ∧ ¬ real number
end  unsigned number;






integer procedure  unsigned integer (start); integer start;
begin   integer  word;
        word:= start; decimal count:= 0;
        if last symbol > 9 then ERRORMESSAGE (109);
next0:  if last symbol < 10
        then begin if word < 6710886 ∨ (word = 6710886 ∧ last symbol < 4)
                   then begin word:= 10 × word + last symbol;
                              decimal count:= decimal count + 1;
                              next symbol; goto next0
                        end
             end;
        unsigned integer:= word
end  unsigned integer;


procedure  read identifier;
begin   integer  word, count;
        word:= count:= word count:= 0;
        if letter last symbol
        then
        begin
        next0: if last symbol < 64
               then
               begin if count = 4
                     then begin word count:= word count + 1;
                                word:= count:= 0
                          end;
                     word:= space[nl base - nlp - word count]:=
                     d6 × word - last symbol - 1;
                     count:= count + 1; next symbol; goto next0
               end
               else
               begin last identifier:= space[nl base - nlp];
                     last identifierl:= if word count = 0
                                        then 0
                                        else space[nl base - nlp - 1]
               end
        end
        else begin ERRORMESSAGE (110); space[nl base - nlp]:= - 1 end;
        space[nl base - nlp - word count - 1]:= 127 × d19
end  read identifier;


integer procedure  next pointer (n); integer n;
begin   integer  word, pointer;
        pointer:= n;
next0:  word:= - space[nl base - pointer];
        if word ≤   0 then begin pointer:= pointer + 1; goto next0 end;
        if word ≥ d25 then begin pointer:= word - word ÷ d13 × d13;
                                 goto next0
                           end;
        next pointer:= pointer
end  next pointer;






integer procedure  look up;
begin   integer  count, pointer;
        pointer:= block cell pointer +
                  (if in formal list ∨ in array declaration
                   then 5 else 4);
next0:  pointer:= next pointer (pointer);
        for count:= 0 step 1 until word count do
        begin if space[nl base - pointer - count] ≠
                 space[nl base - last nlp - count]
              then goto next1
        end;
        pointer:= pointer + word count + 1;
        if space[nl base - pointer] < 0
        then begin next1: pointer:= pointer + 1;
                          goto if space[nl base - pointer] < 0 then next1
                                                               else next0
             end;
        look up:= pointer
end  look up;


Boolean procedure  in name list;
begin   integer head;
        if real number ∨ ¬ int labels
        then in name list:= false
        else begin head:= value of constant ÷ d18;
                   space[nl base - nlp]:= - d12 - head;
                   space[nl base - nlp - 1]:=
                   (head - 1) × d18 - value of constant;
                   word count:= 1;
                   space[nl base - nlp - 2]:= 6 × d19;
                   last nlp:= nlp; integer label:= look up;
                   in name list:= integer label < nlp
             end
end  in name list;


integer procedure  next identifier (n); integer n;
begin   integer  pointer;
        pointer:= next pointer (n) + 1;
next0:  if space[nl base - pointer] < 0
        then begin pointer:= pointer + 1; goto next0 end;
        next identifier:= pointer
end  next identifier;






procedure  skip identifier;
begin   if last symbol < 64 then begin next symbol; skip identifier end
end  skip identifier;


procedure  skip type declaration;
begin   if letter last symbol then skip identifier;
        if last symbol = comma
        then begin next symbol; skip type declaration end
end  skip type declaration;


procedure  skip value list;
begin   if last symbol = value
        then begin next symbol; skip type declaration;
                   if last symbol = semicolon then next symbol
             end
end  skip value list;


procedure  skip specification list;
begin   if specifier last symbol
        then begin skip type declaration;
                   if last symbol = semicolon then next symbol;
                   skip specification list
             end
end  skip specification list;


procedure skip string;
begin   quote counter:= 1;
next0:  if next symbol ≠ unquote then goto next0;
        quote counter:= 0
end  skip string;


procedure skip rest of statement (pr); procedure pr;
begin   if last symbol = do
        then begin next symbol; pr end
        else
        if last symbol = goto ∨ last symbol = for ∨
           last symbol = begin
        then pr;
        if last symbol = quote then skip string;
        if last symbol ≠ semicolon ∧ last symbol ≠ end
        then begin next symbol;
                   skip rest of statement (pr)
             end
end  skip rest of statement;






integer procedure bit string (kn, n, code word); integer kn,n,code word;
begin   integer  k;
        k:= code word ÷ kn; bit string:= (code word - k × kn) ÷ n
end  bit string;


integer procedure  display level;
begin   display level:=
        bit string (d6, d0, space[nl base - block cell pointer - 1])
end  display level;


integer procedure  top of display;
begin   top of display:=
        bit string (d13, d6, space[nl base - block cell pointer - 1])
end  top of display;


integer procedure  local space;
begin   local space:= space[nl base - block cell pointer - 1] ÷ d13
end  local space;


integer procedure  proc level;
begin   proc level:=
        bit string (d6, d0, space[nl base - block cell pointer - 2])
end  proc level;


Boolean procedure  use of counter stack;
begin   use of counter stack:=
        bit string (d7, d6, space[nl base - block cell pointer - 2]) = 1
end  use of counter stack;


integer procedure  status;
begin   status:= space[nl base - block cell pointer - 2] ÷ d13
end status;


Boolean procedure  in code (n); integer n;
begin   in code:= bit string (d25, d24, space[nl base - n - 1]) = 1
end  in code;


integer procedure  type bits (n); integer n;
begin   type bits:= bit string (d22, d19, space[nl base - n])
end type bits;






Boolean procedure  local label (n); integer n;
begin   local label:=
        nonformal label (n) ∧
        bit string(d6, d0,
        space[nl base - corresponding block cell pointer (n) - 1]) =
        display level
end  local label;


Boolean procedure  nonformal label (n); integer n;
begin   nonformal label:= space[nl base - n] ÷ d19 = 6
end nonformal label;


integer procedure  corresponding block cell pointer (n); integer n;
begin   integer p;
        p:= block cell pointer;
next0:  if n < p ∨ (n > space[nl base - p - 2] ÷ d13 ∧ p > 0)
        then begin p:= space[nl base - p] ÷ d13; goto next0 end;
        corresponding block cell pointer:= p
end  corresponding block cell pointer;


procedure  entrance block;
begin   block cell pointer:= next block cell pointer;
        next block cell pointer:=
        bit string (d13, d0, space[nl base - block cell pointer])
end  entrance block;


procedure  exit block;
begin   block cell pointer:= space[nl base - block cell pointer] ÷ d13
end  exit block;


procedure  init;
begin   stock:= stock1:= last symbol:= word count:= - 1;
        shift:= 1;
        line counter:= quote counter:= for count:= 0;
        in formal list:= in array declaration:= false;
        case:= lower case; text pointer:= 0
end  init;






procedure test pointers;
begin   integer fprog, fnl, i, shift;
        if text in memory
        then
        begin fprog:= text base +
                      (if runnumber = 300 then text pointer else 0) -
                      instruct counter;
              fnl:= nl base - nlp -
                    (text base +
                     (if runnumber = 100 then text pointer
                                         else end of text));
              if fprog + fnl < 40
              then begin text in memory:= false; test pointers end
              else if fprog < 20
                   then begin shift:= (fnl - fprog) ÷ 2;
                              for i:= text base + text pointer
                              step - 1 until text base do
                              space[i + shift]:= space[i];
                              text base:= text base + shift
                        end
                   else if fnl < 20
                        then
                        begin shift:= (fprog - fnl) ÷ 2;
                              for i:= text base step 1
                              until text base + text pointer do
                              space[i]:= space[i + shift];
                              text base:= text base - shift
                        end
        end
        else if nl base - nlp - instruct counter < 20
             then begin ERRORMESSAGE (492); goto endrun end
end  test pointers;






procedure prescan0;
begin   integer old block cell pointer, displ level, prc level,
                global count, local count, label count, local for count,
                max for count, internal block depth, string occurrence,
                subcount, array pointer;


procedure  Program;
begin   integer  n;
        character:= 6 × d19;
        if letter last symbol
        then begin read identifier;
                   if last symbol = colon
                   then begin n:= Process identifier;
                              Label declaration (n)
                        end
                   else ERRORMESSAGE (111);
                   Program
             end
        else
        if digit last symbol
        then begin unsigned number;
                   if last symbol = colon then Int lab declaration
                                          else ERRORMESSAGE (112);
                   Program
             end
        else
        if last symbol = begin
        then Begin statement
        else begin ERRORMESSAGE (113); next symbol; Program end
end  Program;


integer procedure  Block (proc identifier); integer  proc identifier;
begin   integer  dump1, dump2, dump3, dump4, dump5, dump6, dump7, dump8,
                 n, formal count;
        dump1:= block cell pointer; dump2:= local for count;
        dump3:= max for count;      dump4:= local count;
        dump5:= label count;        dump6:= internal block depth;
        dump7:= string occurrence;  dump8:= prc level;
        local for count:= max for count:= local count:= label count:=
        internal block depth:= string occurrence:= 0;
        block cell pointer:= nlp + 1;
        space[nl base - old block cell pointer]:=
        space[nl base - old block cell pointer] + block cell pointer;
        old block cell pointer:= block cell pointer;
        space[nl base - block cell pointer]:= dump1 × d13;
        space[nl base - block cell pointer - 1]:= displ level:=
                                                  displ level + 1;
        space[nl base - block cell pointer - 3]:= 0;
        nlp:= nlp + 6;




        if proc identifier > 0
        then
        begin prc level:= displ level; formal count:= 0;
              space[nl base - block cell pointer - 4]:= - d25 - nlp;
              if last symbol = open
              then begin  character:= 127 × d19;
                   next0: next symbol; Identifier;
                          space[nl base - nlp]:= 0; nlp:= nlp + 1;
                          formal count:= formal count + 1;
                          if last symbol = comma then goto next0;
                          if last symbol = close then next symbol
                                                 else ERRORMESSAGE (114)
                   end;
              if last symbol = semicolon then next symbol
                                         else ERRORMESSAGE (115);
              space[nl base - proc identifier - 1]:=
                                         d22 + formal count + 1 ;
              if last symbol = value
              then
              begin
              next1: next symbol; n:= Identifier;
                     if n > last nlp  then ERRORMESSAGE (116)
                                      else space[nl base - n]:= 95 × d19;
                     nlp:= last nlp;
                     if last symbol = comma then goto next1;
                     if last symbol = semicolon then next symbol
                                                else ERRORMESSAGE (117)
              end;
        next2: if specifier last symbol
              then
              begin
              next3: n:= Identifier;
                     if n > last nlp
                     then ERRORMESSAGE (118)
                     else if space[nl base - n] = 127 × d19
                          then space[nl base - n]:= character
                          else if space[nl base - n] ≠  95 × d19
                               then ERRORMESSAGE (119)
                               else if value character > 75
                                    then ERRORMESSAGE (120)
                                    else
                                    begin space[nl base - n]:=
                                          value character × d19;
                                          if type = 3
                                          then string occurrence:= d6
                                    end;
                     nlp:= last nlp;
                     if last symbol = comma
                     then begin next symbol; goto next3 end;
                     if last symbol = semicolon then next symbol
                                                else ERRORMESSAGE (121);
                     goto next2
              end;




              space[nl base - nlp]:= - d25 - 4 - dump1; nlp:= nlp + 1;
              space[nl base - block cell pointer - 4]:= - d25 - nlp;
              if last symbol = quote
              then begin  space[nl base - proc identifier - 1]:=
                          space[nl base - proc identifier - 1] + d24;
                   next4: next symbol;
                          if last symbol ≠ unquote then goto next4;
                          next symbol
                   end
              else
              if last symbol = begin
              then begin next symbol;
                         if declarator last symbol then Declaration list;
                         Compound tail; next symbol
                   end
              else Statement
        end
        else
        begin space[nl base - nlp]:= - d25 - 4 - dump1; nlp:= nlp + 1;
              space[nl base - block cell pointer - 4]:= - d25 - nlp;
              Declaration list; Compound tail
        end;

        space[nl base - block cell pointer - 2]:=
        d13 × nlp + string occurrence + prc level;
        for n:= 0 step 1 until max for count - 1 do
        space[nl base - nlp - 1]:= d19;
        space[nl base - block cell pointer - 1]:=
        space[nl base - block cell pointer - 1] +
        d6 × (internal block depth + 1);
        if prc level > 1
        then space[nl base - block cell pointer - 1]:=
             space[nl base - block cell pointer - 1] +
             d13 × (max for count + local count)
        else global count:= global count + max for count +
                            local count + label count;
        nlp:= nlp + max for count;
        space[nl base - nlp]:= - d25 - 5 - block cell pointer;
        nlp:= nlp + 1;
        space[nl base - block cell pointer + 1]:= - d25 - nlp;
        displ level:= space[nl base - dump1 - 1];
        Block:= internal block depth + 1;
        block cell pointer:= dump1; local for count:= dump2;
        max for count:= dump3;      local count:= dump4;
        label count:= dump5;        internal block depth:= dump6;
        string occurrence:= dump7;  prc level:= dump8
end  Block;


procedure  Compound tail;
begin   Statement; if  last symbol = semicolon
                   then begin next symbol; Compound tail end
end  Compound tail;






procedure  Declaration list;
begin   integer  n, count;
next0:  if type declarator last symbol
        then begin  count:= 0;
             next1: count:= count + 1;
                    n:= Identifier;
                    if n < last nlp then ERRORMESSAGE (122);
                    if last symbol = comma
                    then begin next symbol; goto next1 end;
                    if type = 0 ∨ type = 3 then count:= 2 × count;
                    if own type then global count:= global count + count
                                else local count:= local count + count;
                    if type = 3 then string occurrence:= d6
             end
        else
        if arr declarator last symbol
        then begin  count:= array pointer:= 0;
            next2:  count:= count + 1;
                    next symbol; n:= Identifier;
                    if n < last nlp then ERRORMESSAGE (123);
                    space[nl base - nlp]:= array pointer;
                    array pointer:= nlp; nlp:= nlp + 1;
                    if last symbol = comma then goto next2;
                    dimension:= 0;
                    if last symbol = sub
                    then
                    begin  subcount:= 1;
                    next3: next symbol;
                           if letter last symbol
                           then skip identifier
                           else if digit last symbol
                                then begin unsigned number;
                                           Store numerical constant
                                     end;
                           if last symbol = quote then skip string;
                           if last symbol = colon
                           then begin dimension:= dimension + 1;
                                      goto next3
                                end;
                           if last symbol = sub
                           then begin subcount:= subcount + 1;
                                      goto next3
                                end;
                           if last symbol ≠ bus then goto next3;
                           if subcount > 1
                           then begin subcount:= subcount - 1;
                                      goto next3
                                end;
                           next symbol;
                           if dimension = 0 then ERRORMESSAGE (124)
                           else dimension:= dimension + 1
                    end
                    else ERRORMESSAGE (125);




             next4: n:= space[nl base - array pointer];
                   space[nl base - array pointer]:= dimension;
                   array pointer:= n;
                   if n ≠ 0 then goto next4;
                   if own type
                   then global count:=
                        global count + (3 × dimension + 3) × count
                   else local count:= local count + count;
                   if last symbol = comma
                   then begin count:= 0; goto next2 end;
                   if type = 3 then string occurrence:= d6
             end
        else
        if last symbol = switch
        then begin next symbol; n:= Identifier;
                   if n < last nlp then ERRORMESSAGE (126);
                   space[nl base - nlp]:= 0; nlp:= nlp + 1;
            next5: next symbol;
                   if letter last symbol
                   then skip identifier
                   else if digit last symbol
                        then begin unsigned number;
                                   Store numerical constant
                             end;
                   if last symbol = quote then skip string;
                   if last symbol ≠ semicolon then goto next5
            end
        else begin next symbol; n:= Identifier;
                   if n < last nlp then ERRORMESSAGE (127);
                   nlp:= nlp + 1;
                   if type < 4
                   then begin space[nl base - nlp]:= type × d19;
                              nlp:= nlp + 1
                        end;
                   Block (n)
             end;
        if last symbol = semicolon then next symbol
                                   else ERRORMESSAGE (128);
        if declarator last symbol then goto next0
end  Deciaration list;






procedure  Statement;
begin   integer  n, lfc;
        lfc:= local for count;
next0:  character:= 6 × d19;
next1:  if letter last symbol
        then begin read identifier;
                   if last symbol = colon
                   then begin n:= Process identifier;
                              Label declaration (n);
                              goto next1
                        end
             end
        else
        if digit last symbol
        then begin unsigned number;
                   if last symbol = colon
                   then begin Int lab declaration; goto next1 end
                   else Store numerical constant
             end
        else
        if last symbol = for
        then begin local for count:= local for count + 1;
                   if local for count > max for count
                   then max for count:= local for count
             end
        else
        if last symbol = begin
        then begin Begin statement; next symbol; goto next1 end
        else
        if last symbol = quote then skip string;
        if last symbol ≠ semicolon ∧ last symbol ≠ end
        then begin next symbol; goto next1 end;
        local for count:= lfc
end  Statement;


procedure  Label declaration (n); integer n;
begin   if n < last nlp then ERRORMESSAGE (129);
        if label count = 0
        then space[nl base - block cell pointer - 3]:= d13 × (nlp - 1);
        label count:= label count + 2;
        space[nl base - nlp]:= d18; nlp:= nlp + 1;
        next symbol
end  Label declaration;


procedure Int lab declaration;
begin   if real number
        then begin ERRORMESSAGE (130); next symbol end
        else begin int labels:= true;
                   in name list; nlp:= nlp + 3;
                   Label declaration (integer label)
             end
end  Int lab declaration;






procedure Begin statement;
begin   integer n;
        next symbol;
        if declarator last symbol
        then begin n:= Block (0);
                   if n > internal block depth
                   then internal block depth:= n
             end
        else Compound tail
end  Begin statement;


procedure  Store numerical constant;
begin   if ¬ small
        then begin space[prog base + instruct counter]:=
                   value of constant;
                   space[prog base + instruct counter + 1]:=
                   decimal exponent;
                   instruct counter:= instruct counter + 2
             end
end  Store numerical constant;


integer procedure  Process identifier;
begin   last nlp:= nlp; nlp:= nlp + word count + 2;
        space[nl base - nlp + 1]:= character;
        Process identifier:= look up
end  Process identifier;


integer procedure  Identifier;
begin   read identifier;
        Identifier:= Process identifier
end  Identifier;






main program of prescan0:
        runnumber:= 100; init;
        local for count:= max for count:= local count:= label count:=
        global count:= internal block depth:= string occurrence:=
        displ level:= prc level:= 0;
        old block cell pointer:= block cell pointer:= nlp;
        int labels:= false;
        space[text base]:=
        space[nl base - block cell pointer]:=
        space[nl base - block cell pointer - 1]:=
        space[nl base - block cell pointer - 3]:= 0;
        nlp:= block cell pointer + 6;
        space[nl base - block cell pointer - 4]:= - d25 - nlp;
        next symbol;
        Program;
        space[nl base - block cell pointer - 1]:=
                (global count + max for count + label count) × d13 +
                (internal block depth + 1) × (d13 + d6);
        space[nl base - block cell pointer - 2]:= nlp × d13;
        for n:= 0 step 1 until max for count - 1 do
        space[nl base - nlp - n]:= d19;
        nlp:= nlp + max for count;
        space[nl base - block cell pointer - 5]:= - d25 - nlp;
        end of text:= text pointer;
        output
end  prescan0;






procedure prescan1;
begin


procedure  Arithexp;
begin   if last symbol = if then Ifclause (Arithexp)
                            else Simple arithexp
end  Arithexp;


procedure  Simple arithexp;
begin   integer n;
        if last symbol = plus ∨ last symbol = minus
        then
next0:  next symbol;
        if last symbol = open
        then begin next symbol; Arithexp;
                   if last symbol = close then next symbol
             end
        else
        if digit last symbol then unsigned number
        else
        if letter last symbol
        then begin n:= Identifier; Arithmetic (n);
                   Subscripted variable(n); Function designator(n)
             end
        else
        if last symbol = if then Arithexp;
        if arithoperator last symbol then goto next0
end  Simple arithexp;


procedure  Subscripted variable (n); integer n;
begin   if last symbol = sub then begin Subscrvar (n);
                                        dimension:= Subscrlist;
                                        List length (n)
                                  end
end  Subscripted variable;


integer procedure  Subscrlist;
begin next symbol;  Arithexp;
      if last symbol = comma then Subscrlist:= Subscrlist + 1
                             else begin if last symbol = bus
                                        then next symbol;
                                        Subscrlist:= 1
                                  end
end  Subscrlist;


procedure  Boolexp;
begin   if last symbol = if then Ifclause (Boolexp)
                            else Simple boolean
end  Boolexp;






procedure  Simple boolean;
begin   integer  n, type;
        if last symbol = non  then next symbol;
        if last symbol = open then begin next symbol; Exp (type);
                                         if last symbol = close
                                         then next symbol
                                   end
        else
        if letter last symbol then begin n:= Identifier;
                                         Subscripted variable (n);
                                         Function designator (n);
                                         if arithoperator last symbol ∨
                                            relatoperator last symbol
                                         then Arithmetic (n)
                                         else Boolean (n)
                                   end
        else
        if digit last symbol ∨ last symbol = plus ∨ last symbol = minus
        then Simple arithexp
        else
        if last symbol = true ∨ last symbol = false then next symbol;
        Rest of exp (type)
end  Simple boolean;


procedure  Stringexp;
begin   if last symbol = if then Ifclause (Stringexp)
                            else Simple stringexp
end  Stringexp;


procedure  Simple stringexp;
begin   integer n;
        if last symbol = open
        then begin next symbol; Stringexp;
                   if last symbol = close then next symbol
             end
        else
        if letter last symbol
        then begin n:= Identifier; String (n);
                   Subscripted variable (n);
                   Function designator (n)
             end
        else
        if last symbol = quote
        then begin  quote counter:= 1;
             next0: next symbol;
                    if last symbol = unquote
                    then begin quote counter:= 0;
                               next symbol
                         end
                    else goto next0
             end
end  Simple stringexp;






procedure  Desigexp;
begin   if last symbol = if then Ifclause (Desigexp)
                            else Simple desigexp
end  Desigexp;


procedure  Simple desigexp;
begin   integer n;
        if last symbol = open
        then begin next symbol; Desigexp;
                   if last symbol = close then next symbol
             end
        else
        if letter last symbol
        then begin n:= Identifier; Designational (n);
                   Subscripted variable (n)
             end
        else
        if digit last symbol
        then begin unsigned number;
                   if in name list
                   then Designational (integer label)
             end
end  Simple desigexp;


procedure  Exp (type); integer type;
begin   if last symbol = if
        then begin next symbol; Boolexp;
                   next symbol; Simplexp (type);
                   if last symbol = else
                   then begin next symbol; Type exp (type) end
             end
        else Simplexp (type)
end  Exp;


procedure  Type exp (type); integer type;
begin   if type = ar ∨ type = re ∨ type = in
        then Arithexp
        else if type = bo
             then Boolexp
             else if type = st
                  then Stringexp
                  else if type = des
                       then Desigexp
                       else Exp (type)
end  Type exp;






procedure  Simplexp (type); integer type;
begin   integer n;
        type:= un;
        if last symbol = open
        then begin next symbol; Exp ( type);
                   if last symbol = close then next symbol
             end
        else
        if letter last symbol
        then begin n:= Identifier; Subscripted variable (n);
                   Function designator (n);
                   if arithoperator last symbol ∨
                      relatoperator last symbol
                   then Arithmetic (n)
                   else if booloperator last symbol
                        then Boolean (n)
                        else begin if nonformal label (n)
                                   then Designational (n);
                                   type:= type bits (n)
                             end
              end
        else
        if digit last symbol
        then begin unsigned number;
                   if in name list
                   then Designational (integer label)
                   else type:= ar
             end
        else
        if last symbol = plus ∨ last symbol = minus
        then begin Simple arithexp; type:= ar end
        else
        if last symbol = non ∨ last symbol = true ∨ last symbol = false
        then begin Simple boolean; type:= bo end
        else
        if last symbol = quote
        then begin Simple stringexp; type:= st; goto end end;
        Rest of exp (type);
end:
end  Simplexp;


procedure Rest of exp (type); integer type;
begin   if arithoperator last symbol
        then begin next symbol; Simple arithexp;
                   type:= ar
             end;
        if relatoperator last symbol
        then begin next symbol; Simple arithexp;
                   type:= bo
             end;
        if booloperator last symbol
        then begin next symbol; Simple boolean;
                   type:= bo
             end
end  Rest of exp;






procedure  Assignstat (n); integer n;
begin   Subscripted variable (n);
        if  last symbol = colonequal then  Right hand side (n)
end  Assignstat;


procedure  Right hand side (n); integer n;
begin   integer  m, type, type n;
        Assigned to (n); type n:= type bits (n);
        next symbol;
        if letter last symbol
        then begin m:= Identifier; Subscripted variable (m);
                   if  last symbol = colonequal
                   then
                   begin Insert (type n, m);
                         Right hand side (m); type:= type bits (m)
                   end
                   else
                   begin Function designator (m);
                         if arithoperator last symbol ∨
                            relatoperator last symbol
                         then Arithmetic (m)
                         else if booloperator last symbol
                              then Boolean (m)
                              else
                              begin Arbost (m);
                                    type:= if type n = re ∨ type n = in
                                           then ar
                                           else type n;
                                    Insert (type, m);
                                    type:= type bits (m);
                                    if type = re ∨ type = in
                                    then type:= ar
                              end;
                         Rest of exp (type)
                   end
             end
        else begin m:= type n; Type exp (type n);
                   if m ≠ nondes then type n:= m;
                   type:= if type n = re ∨ type n = in then ar
                                                       else type n
             end;
        Insert (type, n)
end  Right hand side;






procedure  Insert (type, n); integer  type, n;
begin   if type = re
        then Real (n)
        else if type = in
             then Integer (n)
             else if type = bo
                  then Boolean (n)
                  else if type = ar then Arithmetic (n)
end  Insert;


procedure  Function designator (n); integer  n;
begin   if last symbol = open then begin Function (n);
                                         dimension:= Parlist;
                                         List length (n)
                                   end
end  Function designator;


integer procedure  Parlist;
begin   next symbol; Actual parameter;
        if last symbol = comma
        then Parlist:= Parlist + 1
        else begin if last symbol = close then next symbol;
                   Parlist:= 1
             end
end  Parlist;


procedure  Actual parameter;
begin   integer  type;
        Exp (type)
end  Actual parameter;


procedure  Procstat (n); integer n;
begin   Proc (n);
        dimension:= if last symbol = open then Parlist else 0;
        List length (n)
end  Procstat;






procedure  Statement;
begin   integer n;
        if letter last symbol
        then begin n:= Identifier;
                   if last symbol = colon
                   then Labelled statement (n)
                   else begin if last symbol = sub ∨
                                 last symbol = colonequal
                              then Assignstat (n)
                              else Procstat (n)
                        end
            end
        else
        if digit last symbol
        then begin unsigned number;
                   if last symbol = colon
                   then  Intlabelled statement
             end
        else
        if last symbol = goto then Gotostat
        else
        if last symbol = begin
        then begin next symbol;
                   if declarator last symbol then Block
                                             else Compound tail;
                   next symbol
             end
        else
        if last symbol = if then Ifclause (Statement)
        else
        if last symbol = for then Forstat
end  Statement;


procedure  Gotostat;
begin   integer n;
        next symbol;
        if letter last symbol
        then begin n:= Identifier;
                   if ¬ local label (n)
                   then begin Designational (n);
                              Subscripted variable (n)
                        end
             end
        else Desigexp
end Gotostat;


procedure  Compound tail;
begin   Statement;
        if last symbol ≠ semicolon ∧ last symbol ≠ end
        then skip rest of statement (Statement);
        if last symbol = semicolon
        then begin next symbol; Compound tail end
end  Compound tail;






procedure  Ifclause (pr); procedure  pr;
begin   next symbol; Boolexp;
        if last symbol = then then next symbol;
        pr;
       if last symbol = else then begin next symbol; pr end
end Ifclause;


procedure  Forstat;
begin   integer n;
        next symbol;
        if letter last symbol
        then begin  n:= Identifier; Arithmetic (n);
                    Subscripted variable (n);
                    if last symbol = colonequal
                    then
             next0: next symbol; Arithexp;
                    if last symbol = step
                    then begin next symbol; Arithexp;
                               if last symbol = until
                               then begin next symbol;
                                          Arithexp
                                    end
                         end
                    else
                    if last symbol = while
                    then begin next symbol; Boolexp end;
                    if last symbol = comma then goto next0;
                    if last symbol = do    then next symbol;
                    for count:= for count + 1;
                    Statement;
                    for count:= for count - 1
             end
end  Forstat;


procedure  Switch declaration;
begin   integer n;
        next symbol;
        if letter last symbol
        then begin n:= Identifier;
                   if last symbol = colonequal
                   then begin dimension:= Switchlist;
                              Switch length (n)
                        end
             end
end Switch declaration;


integer procedure  Switchlist;
begin   next symbol; Desigexp;
        if last symbol = comma then Switchlist:= Switchlist + 1
                               else Switchlist:= 1
end Switchlist;






procedure  Array declaration;
begin   integer  i, n, count;
        next symbol; n:= Identifier; count:= 1;
next0:  if last symbol = comma then begin next symbol;
                                          if letter last symbol
                                          then skip identifier;
                                          count:= count + 1; goto next0
                                    end;
        if last symbol = sub   then begin in array declaration:= true;
                                          dimension:= Bound pair list;
                                          in array declaration:= false
                                    end
                               else dimension:= 0;
        Check dimension (n);
        if own type then for i:= 1 step 1 until count do
                         begin Address (n, instruct counter);
                               instruct counter:= instruct counter +
                                                  3 × dimension + 6;
                               n:= next identifier (n)
                         end;
        if last symbol = comma then Array declaration
end  Array declaration;


integer procedure  Bound pair list;
begin   next symbol; Arithexp;
        if last symbol = colon then begin next symbol; Arithexp end;
        if last symbol = comma
        then Bound pair list:= Bound pair list + 1
        else begin if last symbol = bus then next symbol;
                   Bound pair list:= 1
             end
end Bound pair list;






procedure  Procedure declaration;
begin   integer  n, m;
        next symbol; n:= Identifier; entrance block;
        if last symbol = open
        then begin  in formal list:= true ;
             next0: next symbol; m:= Identifier;
                    if space[nl base - m] = 95 × d19
                    then begin ERRORMESSAGE (201);
                               space[nl base - m]:= 127 × d19
                         end;
                    if last symbol = comma then goto next0;
                    if last symbol = close then next symbol;
                    in formal list:= false
             end;
        if last symbol = semicolon then next symbol;
        skip value list; skip specification list;
        if in code (n)
        then Scan code (n)
        else begin if space[nl base - n] ÷ d19 = 19 ∧
                      ¬ use of counter stack
                   then space[nl base - block cell pointer - 2]:=
                        space[nl base - block cell pointer - 2] + 64;
                   if last symbol = begin
                   then begin next symbol;
                              if declarator last symbol
                              then Declaration list;
                              Compound tail; next symbol
                        end
                   else Statement;
                   Addressing of block identifiers (n)
            end
end Procedure declaration;


procedure  Block;
begin   entrance block; Declaration list; Compound tail;
        Addressing of block identifiers (0)
end Block;


procedure  Declaration list;
begin   if typedeclarator last symbol then skip type declaration
        else
        if arr declarator last symbol then Array declaration
        else
        if last symbol = switch       then Switch declaration
                                      else Procedure declaration;
        if last symbol = semicolon    then next symbol;
        if declarator last symbol     then Declaration list
end  Declaration list;






procedure  Program;
begin   integer  n;
        if letter last symbol
        then begin n:= Identifier;
                   if last symbol = colon
                   then Label declaration (n);
                   Program
             end
        else
        if digit last symbol
        then begin unsigned number;
                   if in name list
                   then Label declaration (integer label);
                   Program
             end
        else
        if last symbol = begin
        then begin next symbol;
                   if declarator last symbol
                   then Block
                   else Compound tail
             end
        else begin next symbol; Program end
end  Program;


procedure  Labelled statement (n); integer  n;
begin   if nonformal label (n) then Label declaration (n);
        Statement
end  Labelled statement;


procedure  Intlabelled statement;
begin   if in name list then Label declaration (integer label);
        Statement
end  Intlabelled statement;


procedure  Label declaration (n); integer n;
begin   if proc level = 0
        then begin Designational (n); Address (n, instruct counter);
                   space[nl base - n - 1]:=
                   space[nl base - n - 1] + instruct counter +
                   d20 × for count;
                   space[prog base + instruct counter]:= 0;
                   space[prog base + instruct counter + 1]:=
                   d18 × display level + dp0;
                   instruct counter:= instruct counter + 2
             end
        else space[nl base - n - 1]:= space[nl base - n - 1] +
                                      d20 × for count;
             next symbol
end  Label declaration;






procedure  Addressing of block identifiers (n); integer n;
begin   integer  counter, f, code, code1;
        if n = 0 then space[nl base - block cell pointer - 1]:=
                      space[nl base - block cell pointer - 1] + d13;
        if proc level > 0
        then
        begin counter:= d9 × display level + d8;
              if n = 0
              then counter:= counter + 1 + d18
              else
              begin counter:= counter + display level + top of display;
                    f:= block cell pointer + 5;
             next0: f:= next identifier (f);
                    if f > block cell pointer
                    then
                    begin Address (f, counter);
                          code1:= space[nl base - f] ÷ d18;
                          code:= code1 ÷ 2;
                          counter:= counter +
                          (if code = 64 ∨ code = 67 ∨ code = 70
                           then 2
                           else if code < 96
                                then 1
                                else if code1 = 2 × code
                                     then 2 else 4);
                           goto next0
                    end;
                    counter:= counter + d18;
                    code:= space[nl base - n] ÷ d19;
                    if code ≠ 24
                    then
                    begin f:= if wanted then 3 else
                              if code = 16 ∨ code = 19 then 2 else 1;
                          Address (n + 2, counter);
                          counter:= counter + f;
                          space[nl base - block cell pointer - 1] :=
                          space[nl base - block cell pointer - 1] +
                          d13 × f
                    end
              end;




              f:= status;
       next1: if space[nl base - f] > 0
              then begin Address (f, counter); counter:= counter + 1;
                         f:= f + 1;
                         goto next1
                   end;
              f:= block cell pointer + 4;
       next2: f:= next identifier (f); code:= space[nl base - f] ÷ d19;
              if f > block cell pointer ∧ f < status ∧ code < 64
              then begin if code > 24
                       then
                       begin if code < 36
                             then
                             begin Address (f, instruct counter);
                                   instruct counter:=
                                   instruct counter +
                                   (if code= 32 ∨ code = 35
                                    then 2 else 1)
                             end
                         end
                         else
                         if code < 14
                         then
                         begin if code ≠ 6 ∨
                                 (code = 6 ∧
                                   bit string (d19, d18,
                                   space[nl base - f - 1]) = 0)
                               then
                               begin Address (f, counter);
                                     counter:=
                                     counter +
                                     (if code = 0 ∨ code = 3 ∨ code = 6
                                      then 2 else 1)
                               end
                         end;
                         goto next2
                   end;
              if counter > d18 + d9 × (display level + 1)
              then ERRORMESSAGE (202);
              exit block
        end
        else Static addressing
end  Addressing of block identifiers;






procedure  Static addressing;
begin   integer  f, code;
        f:= status;
next0:  if space[nl base - f] > 0
        then begin Address (f, instruct counter);
                   instruct counter:= instruct counter + 1; f:= f + 1;
                   goto next0
             end;
        f:= block cell pointer + 4;
next1:  f:= next identifier (f); code:= space[nl base - f] ÷ d19;
        if f > block cell pointer ∧ f < status
        then begin if code > 24 ∧ code < 36 ∨ code < 14 ∧ code ≠ 6
                   then begin Address (f, instruct counter);
                              instruct counter:=
                              instruct counter +
                              (if code = 0 ∨ code = 3 ∨
                                  code = 32 ∨ code = 35 then 2
                                                        else 1)
                        end;
                   goto next1
             end;
        exit block
end Static addressing;






procedure  Add type (n, t); integer  n, t;
begin   integer code, new code, type;
        new code:= code:= space[nl base - n] ÷ d19;
        if code > 95
        then begin if code = 127
                   then new code:= 96 + t
                   else if code = 120 ∧ t < 6
                        then new code:= 112 + t
                        else
                        begin type:= code - code ÷ 8 × 8;
                              if type = un ∨ (type = nondes ∧ t < 5) ∨
                                 (type = ar ∧ t < 2)
                              then new code:= code - type + t
                        end;
                   space[nl base - n]:=
                   space[nl base - n] - (code - new code) × d19
             end
end  Add type;


procedure  Real (n); integer n; begin Add type (n, re) end Real;


procedure  Integer (n); integer n; begin Add type (n, in) end Integer;


procedure  Boolean (n); integer n; begin Add type (n, bo) end Boolean;


procedure  String (n); integer n; begin Add type (n, st) end String;


procedure  Arithmetic (n); integer  n;
begin  Add type (n, ar) end  Arithmetic;


procedure  Arbost (n); integer n;
begin   Add type (n, nondes) end  Arbost;






procedure  Designational (n); integer n;
begin   integer  p;
        if nonformal label (n)
        then
        begin if bit string (d19, d18, space[nl base - n - 1]) = 1
              then
              begin space[nl base - n - 1]:=
                    abs (space[nl base - n - 1] - d18);
                    p:= corresponding block cell pointer (n);
                    if bit string (d6, d0, space[nl base - p - 2]) > 0
                    then begin space[nl base - p - 3]:=
                               space[nl base - p - 3] + 1;
                               space[nl base - p - 1]:=
                               space[nl base - p - 1] + d14
                         end
              end
        end
        else Add type (n, des)
end  Designational;


procedure  Assigned to (n); integer n;
begin   integer  code;
        code:= space[nl base - n] ÷ d19;
        if code > 95
        then
        begin if code = 127 then code:= 101;
              if code < 102 then space[nl base - n]:= code × d19 + d18
                            else Add type (n, nondes)
        end
end Assigned to;


procedure  Subscrvar (n); integer  n;
begin   integer code, new code;
        code:= space[nl base - n] ÷ d19;
        if code > 95
        then begin new code:= if code = 127
                              then 111
                              else if code < 104
                                   then code + 8
                                   else code;
                   space[nl base - n]:= space[nl base - n] +
                                        (new code - code) × d19
             end
end  Subscrvar;






procedure  Proc (n); integer  n;
begin   integer  code, new code;
        code:= space[nl base - n] ÷ d19;
        if code > 95
        then begin new code:= if code = 127
                              then 120
                              else if code < 102
                                   then code + 16
                                   else code;
                   space[nl base - n]:= space[nl base - n] +
                                        (new code- code) × d19
             end
end  Proc;


procedure  Function (n); integer  n;
begin   Arbost (n); Proc (n) end Function;


procedure  List length (n); integer  n;
begin   integer  word;
        if space[nl base - n] ÷ d19 > 95
        then begin word:= space[nl base - n - 1 ];
                   if bit string (d18, d0, word) = 0
                   then space[nl base - n - 1]:= word + dimension + 1
             end
end  List length;


procedure  Switch length (n);  integer  n;
begin   space[nl base - n - 1]:= dimension + 1 end  Switch length;


procedure  Address (n, m); integer  n, m;
begin   integer  word;
        word:= space[nl base - n] ÷ d18;
        space[nl base - n]:= word × d18 + m
end  Address;


procedure  Check dimension (n); integer  n;
begin   if space[nl base - n - 1] ≠ dimension + 1
        then begin ERRORMESSAGE (203);
                   space[nl base - n - 1]:= dimension + 1
             end
end  Check dimension;






integer procedure  Identifier;
begin   integer  n;
        last nlp:= nlp; read identifier; Identifier:= n:= look up;
        if n > nlp then Ask librarian;
        if n > nlp then begin ERRORMESSAGE (204);
                              nlp:= nlp + word count + 3;
                              space[nl base - nlp + 1]:= 0
                        end
end  Identifier;


procedure  Scan code (n); integer  n;
begin   block cell pointer:= space[nl base - block cell pointer] ÷ d13;
next0:  next symbol; if  last symbol = minus then next symbol;
        if letter last symbol then Identifier else unsigned integer (0);
        if last symbol = comma then goto next0;
        if last symbol = unquote then next symbol
end  Scan code;


procedure  Ask librarian;
begin   comment if the current identifier occurs in the library
                then this procedure will add a new namecell to
                the name list and increase nlp;
end  Ask librarian;






main program of prescan 1:
        if ¬ text in memory
        then begin NEWPAGE;
                   PRINTTEXT («input tape for prescan1»)
             end;
        runnumber:= 200; init;
        block cell pointer:= next block cell pointer:= 0;
        dp0:= instruct counter;
        instruct counter:= instruct counter + top of display;
        space[nl base - nlp] := -1;
        next symbol; entrance block;
        Program; Static addressing;
        output
end prescan1;












procedure translate;
begin

integer last lnc, lnc, last lncr, macro, parameter, state,
        stack0, stack1, b, ret level, max depth,
        ret max depth, max depth isr, max display length,
        max proc level, ecount, controlled variable, increment,
        l0, l1, l2, l3, l4, l5, number of switch elements,
        switch identifier, switch list count, sword,
        address of constant, sum of maxima;

Boolean in switch declaration, in code body, if statement forbidden,
        complicated, complex step element;


procedure  Arithexp;
begin   integer  future1, future2;
        if last symbol = if
        then begin  future1:= future2:= 0;
                    next symbol; Boolexp; Macro2 (COJU, future1);
                    if last symbol ≠ then then ERRORMESSAGE (300)
                                          else next symbol;
                    Simple arithexp;
                    if last symbol = else
                    then begin  Macro2 (JU, future2);
                                Substitute (future1);
                                next symbol; Arithexp;
                                Substitute (future2)
                         end
                    else ERRORMESSAGE (301)
             end
        else Simple arithexp
end  Arithexp;


procedure  Simple arithexp;
begin   if last symbol = minus then begin  next symbol; Term;
                                           Macro (NEG)
                                    end
                                    else begin if last symbol = plus
                                               then next symbol;
                                               Term
                                         end;
        Next term
end  Simple arithexp;






procedure  Next term;
begin   if last symbol = plus  then begin  Macro (STACK);
                                           next symbol; Term;
                                           Macro (ADD); Next term
                                    end
        else
        if last symbol = minus then begin Macro (STACK);
                                          next symbol; Term;
                                          Macro (SUB); Next term
                                    end
end  Next term;


procedure  Term;  begin  Factor; Next factor end  Term;


procedure  Next factor;
begin   if last symbol = mul then begin  Macro (STACK);
                                         next symbol; Factor;
                                         Macro (MUL); Next factor
                                  end
        else
        if last symbol = div then begin  Macro (STACK);
                                         next symbol; Factor;
                                         Macro (DIV); Next factor
                                  end
        else
        if last symbol = idi then begin  Macro (STACK);
                                         next symbol; Factor;
                                         Macro (IDI); Next factor
                                  end
end  Next factor;


procedure  Factor;  begin  Primary; Next primary end  Factor;


procedure  Next primary;
begin   if last symbol = ttp then begin  Macro (STACK);
                                         next symbol; Primary;
                                         Macro (TTP); Next primary
                                  end
end  Next primary;






procedure  Primary;
begin   integer n;
        if last symbol = open then begin  next symbol; Arithexp;
                                          if last symbol = close
                                          then next symbol
                                          else ERRORMESSAGE (302)
                                   end
        else
        if digit last symbol  then begin  Unsigned number;
                                          Arithconstant
                                   end
        else
        if letter last symbol then begin  n:= Identifier;
                                          Subscripted variable (n);
                                          Function designator (n);
                                         Arithname (n)
                                   end
        else
        begin  ERRORMESSAGE (303);
               if last symbol = if ∨ last symbol = plus ∨
                  last symbol = minus
               then Arithexp
        end
end  Primary;


procedure  Arithname (n); integer n;
begin   if Nonarithmetic (n) then  ERRORMESSAGE (304);
        complicated:= Formal (n) ∨ Function (n);
        if Simple (n)
        then begin if Formal (n)  then Macro2 (DOS, n) else
                   if Integer (n) then Macro2 (TIV, n)
                                  else Macro2 (TRV, n)
             end
end  Arithname;


procedure  Subscripted variable (n); integer n;
begin   if Subscrvar (n) then begin  Address description (n);
                                     if last symbol = colonequal
                                     then begin Macro (STACK);
                                                Macro (STAA)
                                          end
                                     else Evaluation of (n)
                            end
end  Subscripted variable;






procedure  Address description (n); integer  n;
begin   if last symbol = sub
        then begin  next symbol; dimension:= Subscript list;
                    Check dimension (n);
                    if Formal (n)        then Macro2 (DOS, n) else
                    if Designational (n) then Macro2 (TSWE, n)
                                         else Macro2 (TAK, n)
             end
        else ERRORMESSAGE (305)
end  Address description;


procedure  Evaluation of (n); integer  n;
begin   if  Designational(n)
        then begin  if Formal (n) then  Macro (TFSL)
                                  else  Macro (TSL)
             end
        else
        if Boolean (n) then Macro (TSB)  else
        if String (n)  then Macro (TSST) else
        if Formal (n)  then Macro (TFSU) else
        if Integer (n) then Macro (TSI)  else Macro (TSR)
end  Evaluation of;


integer procedure  Subscript list;
begin   Arithexp;
        if last symbol = comma
        then begin  Macro (STACK); next symbol;
                    Subscript list:= Subscript list + 1
             end
        else begin  if last symbol = bus
                    then next symbol
                    else ERRORMESSAGE (306);
                    Subscript list:= 1
             end
end  Subscript list;






procedure  Boolexp;
begin   integer future1, future2;
        if last symbol = if
        then begin  future1:= future2:= 0;
                    next symbol; Boolexp; Macro2 (COJU, future1);
                    if last symbol ≠ then then ERRORMESSAGE (307)
                                          else next symbol;
                    Simple boolean;
                    if last symbol = else
                    then begin Macro2 (JU, future2);
                               Substitute (future1);
                               next symbol; Boolexp;
                               Substitute (future2)
                         end
                    else ERRORMESSAGE (308)
             end
             else Simple boolean
end  Boolexp;


procedure  Simple boolean;
begin   Implication; Next implication end  Simple boolean;


procedure  Next implication;
begin   if last symbol = qvl then begin Macro (STAB);
                                        next symbol; Implication;
                                        Macro (QVL); Next implication
                                  end
end  Next implication;


procedure  Implication;  begin  Boolterm; Next boolterm end  Implication;


procedure  Next boolterm;
begin   if last symbol = imp then begin  Macro (STAB);
                                         next symbol; Boolterm;
                                         Macro (IMP); Next boolterm
                                  end
end  Next boolterm;


procedure  Boolterm;  begin  Boolfac; Next boolfac end  Boolterm;


procedure  Next boolfac;
begin   if last symbol = or  then begin  Macro (STAB);
                                         next symbol; Boolfac;
                                         Macro (OR); Next boolfac
                                  end
end  Next boolfac;


procedure  Boolfac;  begin  Boolsec; Next boolsec end  Boolfac;






procedure  Next boolsec;
begin   if last symbol = and then begin  Macro (STAB);
                                         next symbol; Boolsec;
                                         Macro (AND); Next boolsec
                                  end
end  Next boolsec;


procedure  Boolsec;
begin   if last symbol = non then begin  next symbol; Boolprim;
                                         Macro (NON)
                                  end
                             else Boolprim
end  Boolsec;


procedure  Boolprim;
begin   integer type, n;
        if last symbol = open
        then begin next symbol; Arboolexp (type);
                   if last symbol = close then next symbol
                                          else ERRORMESSAGE (309);
                   if type = ar   then Rest of relation else
                   if type = arbo then begin if arithoperator last symbol
                                             then Rest of relation
                                             else Relation
                                       end
             end
        else
        if letter last symbol then begin n:= Identifier;
                                         Subscripted variable (n);
                                         Boolprimrest (n)
                                   end
        else
        if digit last symbol ∨ last symbol = plus ∨ last symbol = minus
        then begin Simple arithexp; Rest of relation end
        else
        if last symbol = true ∨ last symbol = false
        then begin Macro2 (TBC, last symbol); next symbol end
        else ERRORMESSAGE (310)
end  Boolprim;






Boolean procedure  Relation;
begin   integer relmacro;
        if relatoperator last symbol
        then begin relmacro:= Relatmacro; Macro (STACK);
                   next symbol; Simple arithexp;
                   Macro (relmacro); Relation:= true
             end
       else Relation:= false
end  Relation;


procedure  Rest of relation;
begin   Rest of arithexp;
        if ¬ Relation then  ERRORMESSAGE (311)
end  Rest of relation;


procedure  Boolprimrest (n); integer  n;
begin   Function designator (n);
        if Arithmetic (n) ∨ arithoperator last symbol
           ∨ relatoperator last symbol
        then begin  Arithname (n); Rest of relation end
        else Boolname (n)
end  Boolprimrest;


procedure  Boolname (n); integer  n;
begin   if Nonboolean (n) then ERRORMESSAGE (312);
        if Simple (n)     then begin if Formal (n) then Macro2 (DOS, n)
                                                   else Macro2 (TBV, n)
                               end
end  Boolname;


procedure  Arboolexp (type); integer  type;
begin   integer future1, future2;
        if last symbol = if
        then begin  future1:= future2:= 0;
                    next symbol; Boolexp; Macro2 (COJU, future1);
                    if last symbol ≠ then then ERRORMESSAGE (313)
                                          else next symbol;
                    Simple arboolexp (type);
                    if last symbol = else
                    then
                    begin  Macro2 (JU, future2); Substitute (future1);
                           next symbol;
                           if type = bo then Boolexp else
                           if type = ar then Arithexp
                                        else Arboolexp (type);
                           Substitute (future2)
                    end
                    else ERRORMESSAGE (314)
             end
        else Simple arboolexp (type)
end Arboolexp;






procedure  Simple arboolexp (type); integer  type;
begin   integer n;
        if last symbol = open
        then begin  next symbol; Arboolexp (type);
                    if last symbol = close then next symbol
                                           else ERRORMESSAGE (315);
                    if type = bo ∨
                       type = arbo ∧ booloperator last symbol
                    then begin Rest of boolexp; type:= bo end
                    else if type = ar ∨
                            arithoperator last symbol ∨
                            relatoperator last symbol
                         then Rest of arboolexp (type)
             end
        else
        if letter last symbol
        then begin  n:= Identifier; Subscripted variable (n);
                    Arboolrest (type, n)
             end
        else
        if digit last symbol ∨ last symbol = plus ∨ last symbol = minus
        then begin Simple arithexp; Rest of arboolexp (type) end
        else
        if last symbol = non ∨ last symbol = true ∨ last symbol = false
        then begin Simple boolean; type:= bo end
        else
        begin ERRORMESSAGE (316); type:= arbo end
end  Simple arboolexp;


procedure  Rest of arithexp;
begin   Next primary; Next factor; Next term end Rest of arithexp;


procedure  Rest of boolexp;
begin   Next boolsec; Next boolfac; Next boolterm; Next implication
end Rest of boolexp;


procedure  Rest of arboolexp (type); integer  type;
begin   Rest of arithexp;
        if Relation
        then begin  Rest of boolexp; type:= bo end else type:= ar
end  Rest of arboolexp;






procedure  Arboolrest (type, n); integer  type, n;
begin   Function designator (n);
        if Boolean (n) ∨ booloperator last symbol
        then begin  Boolname (n); Rest of boolexp; type:= bo end
        else
        if  Arithmetic (n) ∨ arithoperator last symbol ∨
            relatoperator last symbol
        then begin  Arithname (n); Rest of arboolexp (type) end
        else begin  if String (n) ∨ Designational (n)
                    then ERRORMESSAGE (317);
                    Macro2 (DOS, n); type:= arbo
             end
end  Arboolrest;


procedure  Stringexp;
begin   integer  futurel, future2;
        if last symbol = if
        then begin  futurel:= future2:= 0;
                    next symbol; Boolexp; Macro2 ( COJU, futurel);
                    if last symbol ≠ then then ERRORMESSAGE (318)
                                          else next symbol;
                    Simple stringexp;
                    if last symbol = else
                    then begin  Macro2 (JU, future2);
                                Substitute (futurel);
                                next symbol; Stringexp;
                                Substitute (future2)
                         end
                    else ERRORMESSAGE (319)
             end
        else Simple stringexp
end  Stringexp;


procedure  Simple stringexp;
begin   integer  future, n;
        if last symbol = open
        then begin  next symbol; Stringexp;
                    if last symbol = close then next symbol
                                           else ERRORMESSAGE (320)
             end
        else
        if  letter last symbol
        then begin  n:= Identifier; Subscripted variable (n);
                    Stringname (n)
             end
        else
        if last symbol = quote
        then begin  Macro (TCST); future:= 0; Macro2 (JU, future);
                    Constant string; Substitute (future)
             end
        else ERRORMESSAGE (321)
end  Simple stringexp;






procedure  Stringname (n); integer  n;
begin   if Nonstring (n) then ERRORMESSAGE (322);
        Function designator (n);
        if Simple (n) then begin  if Formal (n) then Macro2 (DOS, n)
                                                else Macro2 (TSTV, n)
                           end
end  Stringname;


procedure  Desigexp;
begin   integer  futurel, future2;
        if last symbol = if
        then begin  futurel:= future2:= 0;
                    next symbol; Boolexp; Macro2 (COJU, futurel);
                    if last symbol ≠ then then ERRORMESSAGE (323)
                                          else next symbol;
                    Simple desigexp;
                    if last symbol = else
                    then begin Macro2 (JU, future2);
                               Substitute (futurel);
                               next symbol; Desigexp;
                               Substitute (future2)
                         end
                    else ERRORMESSAGE (324)
             end
        else Simple desigexp
end  Desigexp;


procedure  Simple desigexp;
begin   integer n;
        if  last symbol = open
        then begin  next symbol; Desigexp;
                    if last symbol = close then next symbol
                                           else ERRORMESSAGE (325)
             end
        else
        if letter last symbol then begin n:= Identifier;
                                         Subscripted variable (n);
                                         Designame (n)
                                   end
        else
        if  digit last symbol then begin Unsigned number;
                                         if in name list
                                         then Macro2 (TLV, integer label)
                                         else ERRORMESSAGE (326)
                                   end
        else ERRORMESSAGE (327)
end  Simple desigexp;






procedure  Designame (n); integer  n;
begin   if Nondesignational (n) then ERRORMESSAGE (328);
        if Simple (n)
        then begin  if Formal (n) then Macro2 (DOS, n)
                                  else Macro2 (TLV, n)
             end
end  Designame;


procedure  Ardesexp (type); integer  type;
begin   Exp (type);
        if type = bo ∨ type = st then ERRORMESSAGE (329);
        if type = un             then type:= intlab else
        if type = nondes         then type:= ar
end  Ardesexp;


procedure  Nondesexp (type); integer  type;
begin   Exp (type);
        if type = des    then ERRORMESSAGE (330);
        if type = un     then type:= nondes else
        if type = intlab then type:= ar
end  Nondesexp;


procedure  Exp (type); integer  type;
begin   integer  future1, future2;
        if last symbol = if
        then begin  future1:= future2:= 0;
                    next symbol; Boolexp; Macro2 (COJU, future1);
                    if last symbol ≠ then then ERRORMESSAGE (331)
                                          else next symbol;
                    Simplexp (type);
                    if last symbol = else
                    then
                    begin  Macro2 (JU, future2);
                           Substitute (future1); next symbol;
                           if type = ar     then Arithexp        else
                           if type = bo     then Boolexp         else
                           if type = st     then Stringexp       else
                           if type = des    then Desigexp        else
                           if type = intlab then Ardesexp (type) else
                           if type = nondes then Nondesexp (type)
                                            else Exp (type);
                           Substitute (future2)
                    end
                    else ERRORMESSAGE (332)
             end
        else  Simplexp (type)
end Exp;






procedure  Simplexp (type); integer  type;
begin   integer n;
        if last symbol = open
        then begin  next symbol; Exp (type);
                    if last symbol = close then next symbol
                                           else ERRORMESSAGE (333);
                    if type = bo ∨ (type = nondes ∨ type = un) ∧
                       booloperator last symbol
                    then begin Rest of boolexp; type:= bo end
                    else
                    if type ≠ st ∧ type ≠ des ∧ operator last symbol
                    then  Rest of arboolexp (type)
             end
        else
        if letter last symbol
        then begin  n:= Identifier; Subscripted variable (n);
                    Exprest (type, n)
             end
        else
        if digit last symbol
        then begin  Unsigned number; Arithconstant;
                    if in name list ∧ ( ¬ operator last symbol)
                    then begin  Macro2 (TLV, integer label);
                                type:= intlab
                         end
                    else Rest of arboolexp (type)
             end
        else
        if last symbol = plus ∨ last symbol = minus
        then Simple arboolexp (type)
        else
        if last symbol = non ∨ last symbol = true ∨ last symbol = false
        then begin Simple boolean; type:= bo end
        else
        if last symbol = quote then begin Simple stringexp; type:= st end
        else
        begin  ERRORMESSAGE (334); type:= un end
end  Simplexp;






procedure  Exprest (type, n); integer type, n;
begin   if Designational (n) then begin Designame (n); type:= des end
        else
        if String (n)        then begin Stringname (n); type:= st end
        else
        begin  Function designator (n);
               if Boolean (n) ∨ booloperator last symbol
               then begin Boolname (n); Rest of boolexp; type:= bo end
               else
               if Arithmetic (n) ∨ arithoperator last symbol ∨
                  relatoperator last symbol
               then begin Arithname (n); Rest of arboolexp (type) end
               else begin if Simple (n) then  Macro2 (DOS, n);
                          type:= if Unknown (n) then un else nondes
                    end
       end
end  Exprest;


procedure  Assignstat (n); integer  n;
begin   Subscripted variable (n);
        if last symbol = colonequal then Distribute on type (n)
                                    else ERRORMESSAGE (335)
end  Assignstat;


integer procedure  Distribute on type (n); integer  n;
begin   if Integer (n)
        then begin  Intassign (n); Distribute on type:= in end
        else
        if  Real (n)
        then begin  Realassign (n); Distribute on type:= re end
        else
        if Boolean (n)
        then begin  Boolassign (n); Distribute on type:= bo end
        else
        if String (n)
        then begin  Stringassign (n); Distribute on type:= st end
        else Distribute on type:= if Arithmetic (n) then Arassign (n)
                                                    else Unassign (n)
end  Distribute on type;


procedure  Prepare (n); integer  n;
begin   if Function (n)
        then begin  if Formal (n) then ERRORMESSAGE (336)
                    else
                    if  Outside declaration (n) then ERRORMESSAGE (337)
                    else n:= Local position (n)
             end
        else if Simple (n) ∧ Formal (n) then Macro2 (DOS2, n);
        next symbol
end  Prepare;






Boolean procedure  Intassign (n); integer  n;
begin   integer m;  Boolean  rounded;
        if  Noninteger (n) then  ERRORMESSAGE (338);
        Prepare (n); rounded:= false;
        if letter last symbol
        then begin  m:= Identifier; Subscripted variable (m);
                    if last symbol = colonequal
                    then rounded:= Intassign (m)
                    else begin  Function designator (m);
                                Arithname (m); Rest of arithexp
                         end
             end
        else Arithexp;
        if Subscrvar (n)
        then begin   if Formal (n) then Macro (STFSU)
                     else
                     if rounded    then Macro (SSTSI)
                                   else Macro (STSI)
             end
        else if Formal (n) then Macro2 (DOS3, n)
        else if rounded    then Macro2 (SSTI, n)
                           else Macro2 (STI, n);
        Intassign:= Formal (n) ⊃  rounded
end Intassign;


procedure  Realassign (n); integer  n;
begin   integer  m;
        if Nonreal (n) then ERRORMESSAGE (339);
        Prepare (n);
        if letter last symbol
        then begin m:= Identifier; Subscripted variable (m);
                   if last symbol = colonequal
                   then Realassign (m)
                   else begin Function designator (m);
                              Arithname (m); Rest of arithexp
                        end
             end
        else Arithexp;
        if  Subscrvar (n)
        then begin if Formal (n) then Macro (STFSU)
                                 else Macro (STSR)
             end
        else if Formal (n) then Macro2 (DOS3, n)
                           else Macro2 (STR, n)
end  Realassign;






procedure  Boolassign (n); integer  n;
begin   integer m;
        if Nonboolean (n) then  ERRORMESSAGE (340);
        Prepare (n);
        if letter last symbol
        then begin m:= Identifier; Subscripted variable (m);
                   if last symbol = colonequal
                   then Boolassign (m)
                   else begin Boolprimrest (m); Rest of boolexp end
             end
        else Boolexp;
        if  Subscrvar (n) then Macro (STSB)
                          else if Formal (n) then Macro2 (DOS3, n)
                                             else Macro2 (STB, n)
end  Boolassign;


procedure  Stringassign (n); integer  n;
begin   integer m;
        if  Nonstring (n) then  ERRORMESSAGE (341);
        Prepare (n);
        if letter last symbol
        then begin m:= Identifier; Subscripted variable (m);
                   if last symbol = colonequal
                   then Stringassign (m)
                   else Stringname (m)
             end
        else Stringexp;
        if Subscrvar (n) then Macro (STSST)
                         else if Formal (n) then Macro2 (DOS3, n)
                                            else Macro2 (STST, n)
end  Stringassign;


integer procedure  Arassign (n); integer  n;
begin   integer type, m;
        if  Nonarithmetic (n) then  ERRORMESSAGE (342);
        Prepare (n); type:= ar;
        if letter last symbol
        then begin m:= Identifier; Subscripted variable (m);
                   if last symbol = colonequal
                   then begin if Nonarithmetic (m)
                              then ERRORMESSAGE (343);
                              type:= Distribute on type (m)
                        end
                   else begin Function designator (m);
                              Arithname (m); Rest of arithexp
                        end
             end
        else Arithexp;
        if Subscrvar (n) then Macro (STFSU) else Macro2 (DOS3, n);
        Arassign:= type
end  Arassign;






integer procedure  Unassign (n); integer  n;
begin   integer  type, m;
        if  Nontype (n) then  ERRORMESSAGE (344);
        Prepare (n);
        if letter last symbol
        then begin m:= Identifier; Subscripted variable (m);
                   if Nontype (m) then ERRORMESSAGE (345);
                   if last symbol = colonequal
                   then type:= Distribute on type (m)
                   else Exprest (type, m)
             end
        else Nondesexp (type);
        if Subscrvar (n)
        then begin if type = bo then Macro (STSB)
                   else
                   if type = st then Macro (STSST)
                                else Macro (STFSU)
             end
        else Macro2 (DOS3, n);
        Unassign:= type
end  Unassign;


procedure  Function designator (n); integer  n;
begin   if Proc (n)
        then begin if Nonfunction (n) then ERRORMESSAGE (346);
                   Procedure call (n)
             end
end  Function designator;


procedure  Procstat (n); integer  n;
begin   if  Proc (n)
        then begin Procedure call (n);
                   if  ¬ (In library (n) ∨ Function (n))
                   then last lnc:= - n;
                   if  Formal (n) ∨ (Function (n) ∧ String (n))
                   then  Macro (REJST)
             end
        else ERRORMESSAGE (347)
end  Procstat;






procedure  Procedure call (n); integer  n;
begin   integer  number of parameters;
        if Operator like (n)
        then Process operator (n)
        else begin number of parameters:= List length (n);
                   if number of parameters ≠ 0
                   then Parameter list (n, number of parameters)
                   else if Formal (n)
                        then Macro2 (DOS, n)
                        else if In library(n) then Macro2 (ISUBJ, n)
                                              else Macro2 (SUBJ, n)
             end
end Procedurecall;


integer procedure  Ordinal number (n); integer  n;
begin   Ordinal number:= if Formal (n) then 15
                         else
                         if Subscrvar (n)
                         then (if Arithmetic (n)
                               then (if Real (n) then 8 else 9)
                               else if Boolean (n)
                                    then 10 else 11)
                         else
                         if Function (n)
                         then (if Arithmetic (n)
                               then (if Real (n) then 24 else 25)
                                else if Boolean (n) then 26 else 27)
                         else
                         if Proc (n) then 30
                         else
                         if Arithmetic(n)
                         then (if Real (n) then 0 else 1)
                         else if Boolean (n)
                              then 2
                              else if String (n) then 3 else 14
end  Ordinal number;






procedure  Parameter list (n, number of parameters);
integer  n, number of parameters;
begin integer  count, m, f, apd, type, future;
      Boolean  simple identifier;
      integer  array  descriptor list[1 : number of parameters];
      count:= future:= 0; f:= n;
      if last symbol = open
      then
      begin
      next: count:= count + 1; next symbol;
           Actual parameter (apd, simple identifier, type, future);
           if count ≤ number of parameters
           then
           begin descriptor list[count]:= apd;
                 if  ¬ Formal (n)
                 then
                 begin f:= Next formal identifier (f);
                       if simple identifier
                       then
                       begin if Subscrvar (f)
                             then
                             begin if Nonsubscrvar (type)
                                   then  ERRORMESSAGE (348);
                                   Check type (f, type);
                                   Check list length (f, type)
                             end
                             else
                             if Proc (f)
                             then
                             begin if Nonproc (type)
                                   then ERRORMESSAGE (349);
                                   Check list length (f, type);
                                   if Function (f)
                                   then begin if Nonfunction (type)
                                              then ERRORMESSAGE (350);
                                              Check type (f, type)
                                        end
                             end
                             else
                             if Simple (f)
                             then
                             begin if Nonsimple (type)
                                   then ERRORMESSAGE (351);
                                   Check type (f, type)
                             end
                       end
                       else
                       begin if Subscrvar (f) ∨ Proc (f)
                             then ERRORMESSAGE (352);
                             if Assigned to (f) ∧ Nonassignable (apd)
                             then ERRORMESSAGE (353);
                             if Arithmetic(f) ∧
                                (type = bo ∨ type = st ∨ type = des)
                             then ERRORMESSAGE (354) else
                             if Boolean (f) ∧
                                type ≠ bo ∧ type ≠ nondes ∧ type ≠ un
                             then ERRORMESSAGE (355) else
                             if String (f) ∧
                                type ≠ st ∧ type ≠ nondes ∧ type ≠ un
                             then ERRORMESSAGE (356) else
                             if Designational (f) ∧
                                type ≠ des ∧ type ≠ un
                             then ERRORMESSAGE (357) else
                             if Arbost (f) ∧ type = des
                             then ERRORMESSAGE (358)
                       end
                 end
           end
           else ERRORMESSAGE (359);
           if last symbol = comma then goto next;
           if last symbol = close
           then begin next symbol;
                      if count < number of parameters
                      then ERRORMESSAGE (360)
                end
           else ERRORMESSAGE (361)
      end
      else ERRORMESSAGE (362);
      if future ≠ 0 then  Substitute (future);
      if Formal (n) then  Macro2 (DOS, n) else  if In library (n)
                                                then Macro2 (ISUBJ, n)
                                                else Macro2 (SUBJ, n);
      m:= 0;
next apd: if m < count ∧ m < number of parameters
      then begin m:= m + 1; apd:= descriptor list[m];
                 Macro2 (CODE, apd); goto next apd
           end
end  Parameter list;






procedure  Actual parameter (apd, simple identifier, type, future);
integer  apd, type, future; Boolean  simple identifier;
begin integer  n, begin address;
      begin address:= Order counter + (if future = 0 then 1 else 0);
      simple identifier:= false;
      if letter last symbol
      then
      begin n:= Identifier;
            if last symbol = comma ∨ last symbol = close
            then
            begin type:= n; simple identifier:= true;
                  if Proc (n) ∧ ¬ Formal (n)
                  then
                  begin if future = 0 then Macro2 (JU, future);
                        Macro (TFD);
                         if In library (n) then Macro2 (LJU1, n)
                                           else Macro2 (JU1, n);
                         apd:= d20 × Ordinal number (n) + begin address
                  end
                  else if Subscrvar (n) ∧ Designational (n) ∧
                          ¬ Formal (n)
                       then begin if future = 0
                                  then Macro2 (JU, future);
                                  Macro2 (TSWE, n);
                                  apd:= 12 × d20 + begin address
                            end
                       else apd:= d20 × Ordinal number (n) +
                                  Address (n) +
                                  (if Dynamic (n) then d18 else 0)
            end
            else
            begin Start implicit subroutine (future);
                  if Subscrvar (n) then Address description (n);
                  if (last symbol = comma ∨ last symbol = close) ∧
                     ( ¬ Designational (n))
                  then
                  begin if Unknown (n) then Macro (SAS);
                        Macro2 (EXITSV, -2 × dimension);
                        apd:= d20 × (if Boolean (n) then 18 else
                                     if String (n)  then 19 else
                                     if Formal (n)  then 32 else
                                     if Real (n)    then 16 else 17)
                              + Ordercounter;
                        type:= if Arithmetic (n) then ar else
                               if Boolean (n)    then bo else
                               if String (n)     then st else
                               if Arbost (n)     then nondes else un;
                        Macro2 (SUBJ, -begin address);
                        if Boolean (n) then Macro (TASB)  else
                        if String (n)  then Macro (TASST) else
                        if Formal (n)  then Macro (TASU)  else
                        if Integer (n) then Macro (TASI)
                                       else Macro (TASR);
                        Macro (DECS); Macro2 (SUBJ, -begin address);
                        Macro (FAD)
                  end

                  else
                  begin if Subscrvar (n) then Evaluation of (n);
                        Exprest (type, n); Macro (EXITIS);
                        apd:= mask[type] + begin address
                  end
            end
      end
      else
      if digit last symbol
      then begin Unsigned number;
                 if (last symbol = comma ∨ last symbol = close) ∧
                    ( ¬ in name list)
                 then begin type:= ar; apd:= Number descriptor end
                 else begin Start implicit subroutine (future);
                            Arithconstant;
                            if in name list ∧ ( ¬ operator last symbol)
                            then begin Macro2 (TLV, integer label);
                                       type:= intlab
                                 end
                            else Rest of arboolexp (type);
                            Macro (EXITIS);
                            apd:= mask[type] + begin address
                      end
           end
      else
      if last symbol = plus
      then
      begin next symbol;
            if digit last symbol
            then begin Unsigned number;
                       if last symbol = comma ∨ last symbol = close
                       then begin type:= ar; apd:= Number descriptor end
                       else begin Start implicit subroutine (future);
                                  Arithconstant;
                                  Rest of arboolexp (type);
                                  Macro (EXITIS);
                                  apd:= mask[type] + begin address
                            end
                 end
            else begin Start implicit subroutine (future);
                       Arboolexp (type);
                       Macro (EXITIS); apd:= mask[type] + begin address
                 end
      end
      else
      if last symbol = minus
      then
      begin next symbol;
            if digit last symbol
            then begin Unsigned number;
                       if (last symbol = comma ∨ last symbol = close) ∧
                           small
                       then
                       begin type:= ar;
                             apd:= d20 × 13 + value of constant
                       end
                       else
                       begin Start implicit subroutine (future);
                             Arithconstant; Next primary; Next factor;
                             Macro (NEG); Rest of arboolexp (type);
                             Macro (EXITIS);
                             apd:= mask[type] + begin address
                       end
                 end
            else begin Start implicit subroutine (future);
                       Term; Macro (NEG);
                       Rest of arboolexp (type);
                       Macro (EXITIS); apd:= mask[type] + begin address
                 end
      end
      else
      if last symbol = true ∨ last symbol = false
      then
      begin type:= bo; n:= last symbol; next symbol;
            if last symbol = comma ∨ last symbol = close
            then apd:= d20 × 6 + (if n = true then 0 else 1)
            else begin Start implicit subroutine (future);
                       Macro2 (TBC, n);
                       Rest of boolexp;
                       Macro (EXITIS);
                       apd:= mask[type] + begin address
                 end
      end
      else begin Start implicit subroutine (future); Exp (type);
                 Macro (EXITIS); apd:= mask[type] + begin address
           end
end  Actual parameter;






procedure  Start implicit subroutine (future); integer  future;
begin   if future = 0 then  Macro2 (JU, future);
        Macro (ENTRIS)
end  Start implicit subroutine;


integer procedure Number descriptor;
begin   Number descriptor:=
        if small then d20 × 7 + value of constant
                 else d20 × (if  real number then 4 else 5)
                      + address of constant
end  Number descriptor;


procedure  Process operator (n); integer  n;
begin   integer  count;
        count:= 0;
        if last symbol = open
        then begin
             next: next symbol; Arithexp; count:= count + 1;
                   if last symbol = comma
                   then begin Macro (STACK); goto next end;
                   if last symbol = close
                   then next symbol
                   else ERRORMESSAGE (361)
             end;
        if count ≠ List length (n) then ERRORMESSAGE (363);
        Macro (Operator macro (n))
end  Process operator;


Boolean procedure  Nonassignable (apd); integer  apd;
begin   integer  rank;
        rank:= apd ÷ d20;
        Nonassignable:= (rank ≠ 15) ∧ (rank - rank ÷ 16 × 16) > 3
end  Nonassignable;


procedure  Line;
begin   if lnc ≠ last lnc then Line1 end  Line;


procedure  Line1;
begin   if wanted then begin last lnc:= lnc; Macro2 (LNC, lnc) end
end  Line1;






procedure Statement;
begin   if statement forbidden:= false; Stat end  Statement;


procedure  Unconditional statement;
begin   if statement forbidden:= true; Stat end  Unconditional statement;


procedure  Stat;
begin   integer n, save lnc;
        if letter last symbol
        then begin save lnc:= line counter;
                   n:= Identifier;
                   if Designational (n)
                   then begin Label declaration (n); Stat end
                   else begin lnc:= save lnc; Line;
                              if Subscrvar (n) ∨ last symbol = colonequal
                              then Assignstat (n)
                              else Procstat (n)
                        end
             end
        else
        if digit last symbol
        then begin Unsigned number;
                   if in name list
                   then begin Label declaration (integer label); Stat end
                   else ERRORMESSAGE (364)
             end
        else begin if last symbol = goto
                   then begin lnc:= line counter; Line; Gotostat end
                   else
                   if last symbol = begin
                   then begin save lnc:= line counter; next symbol;
                              if declarator last symbol
                              then begin lnc:= save lnc; Line; Block end
                              else Compound tail;
                              next symbol
                        end
                   else
                   if last symbol = if
                   then begin if if statement forbidden
                              then ERRORMESSAGE (365);
                              lnc:= line counter; Line; Ifstat
                        end
                   else
                   if last symbol = for
                   then begin lnc:= line counter; Line; Forstat;
                              if last symbol = else
                              then ERRORMESSAGE (366)
                        end
             end
end Stat;







procedure Gotostat;
begin   integer n;
        next symbol;
        if letter last symbol
        then begin n:= Identifier; Subscripted variable (n);
                   if local label (n)
                   then begin Test for count (n); Macro2 (JU, n) end
                   else begin Designame (n); Macro (JUA) end
             end
        else begin Desigexp; Macro (JUA) end
end Gotostat;


procedure Compound tail;
begin   Statement;
        if last symbol ≠ semicolon ∧ last symbol ≠ end
        then begin ERRORMESSAGE (367);
                   skip rest of statement (Statement)
             end;
        if last symbol = semi colon
        then begin next symbol; Compound tail end
end Compound tail;


procedure  Ifstat;
begin   integer  future1, future2, save lnc, last lnc1;
        future1:= future2:= 0; save lnc:= line counter;
        next symbol; Boolexp; Macro2 (COJU, future1);
        if last symbol = then then next symbol else ERRORMESSAGE (368);
        Unconditional statement;
        if last symbol = else
        then begin Macro2 (JU, future2); Substitute (future1);
                   last lnc1:= last lnc; last lnc:= save lnc;
                   next symbol; Statement; Substitute (future2);
                   if last lnc > last lnc1 then last lnc:= last lnc1
             end
        else begin Substitute (future1);
                   if last lnc > save lnc then last lnc:= save lnc
             end
end  Ifstat;


procedure Forstat;
begin   integer  future, save lnc;
        save lnc:= line counter;
        l0:= 0; next symbol; For list;
        future:= 0; Macro2 (JU, future); if l0 ≠ 0 then Substitute(l0);
        if last symbol = do then next symbol else ERRORMESSAGE (369);
        Increase status (increment); for count:= for count + 1;
        Statement;
        Increase status (- increment); for count:= for count - 1;
        if last lnc < 0 ∨ lnc ≠ save lnc
        then begin lnc:= save lnc; Line1 end;
        Macro2 (LJU,status); Substitute (future)
end  Forstat;






procedure  Store preparation;
begin   if Subscrvar (controlled variable) then Macro2 (SUBJ, - 12)
        else
        if  Formal (controlled variable)
        then Macro2 (DOS2, controlled variable)
end  Store preparation;


procedure  Store macro;
begin   if  Subscrvar (controlled variable)
        then begin if Formal (controlled variable)  then Macro (STFSU)
                   else
                   if Integer (controlled variable) then Macro (STSI)
                                                    else Macro (STSR);
                   Macro2 (DECB, 2)
             end
        else if Formal (controlled variable)
             then Macro2 (DOS3, controlled variable)
             else if Integer (controlled variable)
                  then Macro2 (STI, controlled variable)
                  else Macro2 (STR, controlled variable)
end  Store macro;


procedure Take macro;
begin   if Subscrvar (controlled variable)
        then Macro2 (SUBJ, - l1)
        else Arithname (controlled variable)
end  Take macro;


procedure For list;
begin if letter last symbol
      then
      begin controlled variable:= Identifier;
            if Nonarithmetic (controlled variable)
            then ERRORMESSAGE (370);
            if Subscrvar (controlled variable)
            then
            begin l3:= 0; Macro2 (JU, l3);
                  l4:= Order counter;
                  Address description (controlled variable);
                  Macro2 (EXITSV, 1 - 2 × dimension);
                  l1:= Order counter;
                  Macro2 (SUBJ, - l4);
                  if Formal (controlled variable)  then Macro (TSCVU)
                  else
                  if Integer (controlled variable) then Macro (TISCV)
                                                   else Macro (TRSCV);
                  l2:= Order counter;
                  Macro2 (SUBJ, - l4); Macro (FADCV);
                  Substitute (l3)
            end
            else if Function (controlled variable)
                 then ERRORMESSAGE (371);
            if last symbol ≠ colonequal then ERRORMESSAGE (372);




      list: l3:= Order counter;
            Macro2 (TSIC, 0); Macro2 (SSTI, status);
            l4:= Order counter;
            Store preparation;
            next symbol; Arithexp;
            if last symbol = comma ∨ last symbol = do
            then begin Store macro; Macro2 (JU, l0);
                       Substitute (l3)
                 end
            else
            if last symbol = while
            then begin Store macro;
                       next symbol; Boolexp;
                       Macro2 (YCOJU, l0); Subst2 (l4, l3)
                 end
            else
            if last symbol = step
            then begin l5:= 0; Macro2 (JU, l5); l4:= Order counter;
                       next symbol; complicated:= false; Arithexp;
                       complex step element:=
                       complicated ∨ Order counter> l4 + 1;
                       if complex step element then  Macro (EXIT);
                       Substitute (l3);
                       Store preparation; Take macro; Macro (STACK);
                       if complex step element then  Macro2 (SUBJ, - l4)
                                               else  Macro2 (DO, l4);
                       Macro (ADD);
                       Substitute (15);
                       Store macro;
                       if Subscrvar (controlled variable) ∨
                          Formal (controlled variable)
                       then Take macro;
                       Macro (STACK);
                       if last symbol = until
                       then begin next symbol; Arithexp end
                       else ERRORMESSAGE (373);
                       Macro (TEST1);
                       if complex step element then Macro2 (SUBJ, - l4)
                                               else Macro2 (DO, l4);
                       Macro (TEST2); Macro2 (YCOJU, l0)
                 end
            else ERRORMESSAGE (374);
            if last symbol = comma then goto list
     end
     else ERRORMESSAGE (375)
end  For list;






procedure  Switch declaration;
begin integer  m;
      next symbol;
      if letter last symbol
      then
      begin switch identifier:= Identifier;
            number of switch elements:= List length (switch identifier);
            if last symbol = colonequal
            then
            begin integer array
                  sword list[1 : number of switch elements];
                  switch list count:= 0; in switch declaration:= true;
            next: switch list count:= switch list count + 1;
                  next symbol;
                  if letter last symbol
                  then
                  begin m:= Identifier;
                        if Nondesignational (m) then ERRORMESSAGE (376);
                        if Subscrvar (m)
                        then
                        begin sword:= -45613055 + Order counter;
                              Subscripted variable (m); Macro (EXIT)
                        end
                        else
                        sword:= (if Formal (m)
                                 then -33685503
                                 else 4718592 + (if Dynamic (m)
                                                 then function digit
                                                 else 0)) +
                                 Address (m)
                  end
                  else
                  if digit last symbol
                  then
                  begin Unsigned number;
                        if  in name list
                        then  sword:= 4718592 +
                                      (if Dynamic (integer label)
                                       then function digit
                                       else 0) +
                                      Address (integer label)
                        else ERRORMESSAGE (377)
                  end
                  else
                  begin sword:= - 45613055 + Order counter;
                        Desigexp; Macro (EXIT)
                  end;




                  if switch list count > number of switch elements
                  then ERRORMESSAGE (378);
                  sword list[switch list count]:= sword;
                  if last symbol= comma then goto next;
                  if switch list count < number of switch elements
                  then ERRORMESSAGE (379);
                  Mark position in name list (switch identifier);
                  in switch declaration:= false;
                  Macro2 (CODE, number of switch elements);
                  m:= 0;
            next sword: if m < switch list count ∧
                           m < number of switch elements
                  then begin m:= m + 1; sword:= sword list[m];
                             Macro2 (CODE, sword); goto next sword
                       end
            end
            else ERRORMESSAGE (380)
      end
      else ERRORMESSAGE (381)
end  Switch declaration;


procedure Array declaration;
begin   integer  n, count;
        next symbol; lnc:= line counter; Line;
        n:= Identifier; dimension:= List length (n); count:= 1;
next:   if last symbol = comma then begin next symbol; Identifier;
                                          count:= count + 1; goto next
                                    end;
        if last symbol = sub   then begin in array declaration:= true;
                                          Bound pair list;
                                          in array declaration:= false
                                    end
                               else ERRORMESSAGE (382);
        Macro2 (TNA, count); Macro2 (TDA, dimension);
        Macro2 (TAA, n); Macro (arr decla macro);
        if last symbol = comma then Array declaration
end  Array declaration;


procedure  Bound pair list;
begin   next symbol; Arithexp; Macro (STACK);
        if last symbol = colon then begin next symbol; Arithexp;
                                          Macro (STACK)
                                    end
                               else ERRORMESSAGE (383);
        if last symbol = comma then Bound pair list
                               else if last symbol = bus
                                    then next symbol
                                    else ERRORMESSAGE (384)
end  Bound pair list;






procedure  Procedure declaration;
begin integer  n, f, count, save lnc;
      next symbol; f:= n:= Identifier;
      Skip parameter list; skip value list; skip specification list;
      if ¬ In library (n) then Mark position in name list (n);
      if in code (n)
      then Translate code
      else begin if Function (n) then Set inside declaration (n, true);
                 entrance block;
                 Macro2 (DPTR, display level);
                 Macro2 (INCRB, top of display);
                 for count:= List length (n) step - 1 until 1 do
                 begin f:= Next formal identifier(f);
                       if In value list (f)
                       then
                       begin if Subscrvar (f)
                             then Macro (CEN)
                             else
                             begin if Arithmetic (f)
                                   then begin if Integer (f)
                                              then Macro (CIV)
                                              else Macro (CRV)
                                        end
                                   else if Boolean (f) then Macro (CBV)
                                   else if String (f)  then Macro (CSTV)
                                                       else Macro (CLV)
                             end
                       end
                       else if Assigned to (f) then Macro (CLPN)
                                               else Macro (CEN)
                 end;
                 Macro2 (TDL, display level);
                 Macro2 (ENTRPB, local space);
                 Label list; f:= n;
                 for  count:= List length (n) step - 1 until 1 do
                 begin f:= Next formal identifier (f);
                       if In value list (f) ∧ Subscrvar (f)
                       then begin Macro2 (TAA, f);
                                  if Integer (f) then Macro (TIAV)
                                                 else Macro (TAV)
                            end
                 end;




                 save lnc:= last lnc; last lnc:= - line counter;
                 Save and restore lnc (SLNC, n);
                 if last symbol = begin
                 then begin next symbol; if declarator last symbol
                                         then Declaration list;
                            Compound tail; next symbol
                      end
                 else Statement;
                 lnc:= last lnc:= save lnc;
                 if Function (n)
                 then begin Set inside declaration (n, false);
                            f:= Local position (n);
                            if Arithmetic (f) then Arithname (f) else
                            if Boolean (f) then Boolname (f)
                            else begin Stringname(f); Macro (LOS) end
                      end;
                 Save and restore lnc (RLNC, n);
                 if use of counter stack then Macro (EXITPC)
                                         else Macro (EXITP);
                 exit block
          end
end  Procedure declaration;


procedure Save and restore lnc (macro, n); integer  macro, n;
begin  if wanted ∧ Function (n) then Macro2 (macro, Local position1 (n))
end  Save and restore lnc;


procedure Block;
begin   entrance block;
        Macro2 (TBL, display level); Macro2 (ENTRB, local space);
        Label list; Declaration list; Compound tail;
        if use of counter stack then Macro2 (EXITC, display level)
                                else Macro2 (EXITB, display level);
        exit block
end  Block;






procedure  Declaration list;
begin   integer future, arr dec;
        future:= arr dec:= 0;
next:   if type declarator last symbol then skip type declaration
        else
        if arr declarator last symbol
        then begin  if future ≠ 0
                    then begin Substitute (future);
                               future:= 0
                         end;
                    arr dec:= 1; Array declaration
             end
        else
        begin if future = 0 then Macro2 (JU, future);
              if last symbol = switch then Switch declaration
                                      else Procedure declaration
        end;
        if last symbol = semicolon then next symbol
                                   else ERRORMESSAGE (385);
        if declarator last symbol  then goto next;
        if future ≠ 0  then Substitute (future);
        if arr dec ≠ 0 then Macro2 (SWP, display level)
end  Declaration list;


procedure Label list;
begin   integer  n, count;
        count:= Number of local labels;
        if count > 0
        then begin Macro2 (DECB, 2 × count);
                   Macro2 (LAD, display level);
                   n:= 0; for count:= count step - 1 until 1 do
                   begin next: n:= Next local label (n);
                               if Super local (n) then goto next;
                               if count = 1 then Macro2 (LAST, n)
                                            else Macro2 (NIL, n)
                   end
             end
end  Label list;






procedure  Program;
begin   integer  n;
        if letter last symbol
        then begin n:= Identifier;
                   if last symbol = colon
                   then Label declaration (n);
                   Program
             end
        else
        if digit last symbol
        then begin Unsigned number;
                   if in name list ∧ last symbol = colon
                   then Label declaration (integer label);
                   Program
             end
        else
        if last symbol = begin
        then begin next symbol;
                   if declarator last symbol then Block
                                             else Compound tail;
                   Macro (END)
             end
        else begin next symbol; Program end
end  Program;


procedure  Label declaration (n); integer  n;
begin   last lnc:= - line counter;
        if Subscrvar (n)       then begin ERRORMESSAGE (388);
                                          Subscripted variable (n)
                                    end
                               else Mark position in name list (n);
        if last symbol = colon then next symbol else ERRORMESSAGE (389)
end  Label declaration;


procedure  Substitute (address); integer  address;
begin   Subst2 (Order counter, address) end  Substitute;


procedure Subst2 (address1, address2);
value  address1, address2; integer  address1, address2;
begin   integer  instruction, instruct part, address part;
        address2:= abs (address2);
        instruction:= space[prog base + address2];
        instruct part:= instruction ÷ d15 × d15 -
                        (if instruction < 0 then 32767 else 0);
        address part:= instruction - instruct part;
        space[prog base + address2]:= instruct part + address1;
        if address part = 0
        then begin if instruct part = end of list
                   then space[prog base + address2]:=
                        - space[prog base + address2]
             end
        else Subst2 (address1, address part)
end  Subst2;






integer procedure  Order counter;
begin   Macro (EMPTY); Order counter:= instruct counter
end  Order counter;


procedure  Macro (macro number); integer  macro number;
begin  Macro2 (macro number, parameter) end  Macro;


procedure  Macro2 (macro number, metaparameter);
integer  macro number, metaparameter;
begin   macro:= if macro number < 512 then macro list[macro number]
                                      else macro number;
        parameter:= metaparameter;
        if state = 0
        then begin if macro = STACK then state:= 1
                   else
                   if Simple arithmetic take macro then Load (3)
                   else
                   Produce (macro, parameter)
             end
        else
        if state = 1
        then begin Load (2);
                   if ¬ Simple arithmetic take macro
                   then begin Produce (STACK, parameter); Unload end
             end
        else
        if state = 2
        then begin if Optimizable operator then Optimize
                   else
                   begin Produce (STACK, parameter); state:= 3;
                         Macro2 (macro, parameter)
                   end
             end
        else
        if state = 3
        then begin if macro = NEG then Optimize
                   else
                   begin Unload; Macro2 (macro, parameter) end
             end;
        if Forward jumping macro ∧ metaparameter ≤ 0
        then Assign (metaparameter)
end  Macro2;






procedure  Load (state i); integer  state i;
begin  stack0:= macro; stack1:= parameter; state:= state i end  Load;


procedure  Unload;
begin   Produce (stack0, stack1); state:= 0 end  Unload;


procedure  Optimize;
begin  stack0:= tabel[5 × Opt number (macro) + Opt number (stack0)];
       Unload
end  Optimize;


procedure  Assign (metaparameter); integer  metaparameter;
begin  metaparameter:= - (instruct counter - 1) end  Assign;


procedure  Produce (macro, parameter); integer  macro, parameter;
begin   integer  number, par number, entry, count;
        if macro = EMPTY then
        else
        if macro = CODE
        then begin space[prog base + instruct counter]:= parameter;
                   instruct counter:= instruct counter + 1;
                   test pointers
             end
        else begin number:= Instruct number (macro);
                   par number:= Par part (macro);
                   entry:= Instruct part (macro) - 1;
                   if par number > 0
                   then Process parameter (macro, parameter);
                   Process stack pointer (macro);
                   for count:= 1 step 1 until number do
                   Produce (CODE, instruct list[entry + count] +
                                  (if count = par number
                                   then parameter else 0))
             end
end  Produce;






procedure  Process stack pointer (macro); integer  macro;
begin   if ¬ in code body
        then
        begin integer  reaction;
              reaction:= B reaction (macro);
              if reaction < 9
              then begin b:= b + reaction - 4;
                         if b > max depth then max depth:= b
                   end
              else
              if reaction = 10 then b:= 0
              else
              if reaction = 11 then b:= b - 2 × (dimension - 1)
              else
              if reaction = 12
              then begin if ecount = 0
                         then
                         begin ret level:= b;
                               ret max depth:= max depth;
                               b:= 0; max depth:= max depth isr
                         end;
                         ecount:= ecount + 1
                   end
              else
              if reaction = 13
              then begin if macro = EXITSV
                         then
                         begin if b > max depth isr
                               then max depth isr:= b;
                               b:= b - 2 × (dimension - 1)
                         end;
                         if ecount = 1
                         then
                         begin if max depth > max depth isr
                               then max depth isr:= max depth;
                               b:= ret level;
                               max depth:= ret max depth
                         end;
                         if ecount > 0 then ecount:= ecount - 1
                   end
              else
              if reaction = 14
              then begin b:= display level + top of display;
                         if b > max display length
                         then max display length:= b;
                         ret max depth:= max depth
                   end
              else
              if reaction = 15
              then begin if b > max proc level
                         then max proc level:= b;
                         b:= 0; max depth:= ret max depth
                   end
        end
end  Process stack pointer;






procedure  Process parameter (macro, parameter);
integer  macro, parameter;
begin    if Value like (macro)
         then
         begin if macro = TBC
               then parameter:= if parameter = true then 0 else 1
               else
               if macro = SWP then parameter:= d9 × parameter
               else
               if macro ≠ EXITSV then parameter:= abs (parameter)
         end
         else
         begin if macro = JU ∨ macro = SUBJ ∨ macro = NIL ∨ macro = LAST
               then begin if parameter ≤ 0
                          then parameter:= - parameter
                          else parameter:= Program address (parameter)
                    end
               else parameter:= Address (parameter) +
                                (if Dynamic (parameter)
                                 then (if macro = TLV ∨ macro = TAA
                                       then function digit
                                       else if macro = STST
                                            then function letter
                                            else c variant)
                                 else 0)
         end
end Process parameter;


Boolean procedure  Simple arithmetic take macro;
begin   Simple arithmetic take macro:= bit string (d1, d0, macro) = 1
end  Simple arithmetic take macro;


Boolean procedure  Optimizable operator;
begin   Optimizable operator:= bit string (d2, d1, macro) = 1
end  Optimizable operator;


Boolean procedure  Forward jumping macro;
begin   Forward jumping macro:= bit string (d3, d2, macro) = 1
end  Forward jumping macro;


Boolean procedure  Value like (macro); integer macro;
begin   Value like:= bit string (d4, d3, macro) = 1 end  Value like;


integer procedure  Opt number (macro); integer macro;
begin   Opt number:= bit string (d8, d4, macro) end  Opt number;


integer procedure  Instruct number (macro); integer macro;
begin   Instruct number:= bit string (d10, d8, macro)
end  Instruct number;






integer procedure  Par part (macro); integer  macro;
begin   Par part:= bit string (d12, d10, macro) end Par part;


integer procedure  Instruct part (macro); integer  macro;
begin   Instruct part:= bit string (d21, d12, macro) end  Instruct part;


integer procedure  B reaction (macro); integer  macro;
begin   B reaction:= macro ÷ d21 end  B reaction;


integer procedure  Code bits (n); integer  n;
begin   Code bits:= space[nl base - n] ÷ d19 end  Code bits;


integer procedure  Character (n); integer  n;
begin   Character:= bit string (d24, d19, space[nl base - n])
end  Character;


Boolean procedure  Arithmetic (n); integer  n;
begin   integer i;
        i:= type bits (n);
        Arithmetic:= Character (n) ≠ 24 ∧ (i < 2 ∨ i = 4)
end  Arithmetic;


Boolean procedure  Real (n); integer  n;
begin   Real:= Character (n) ≠ 24 ∧ type bits (n) = 0 end  Real;


Boolean procedure  Integer (n); integer  n;
begin   Integer:= type bits (n) = 1 end  Integer;


Boolean procedure  Boolean (n); integer  n;
begin   Boolean:= type bits (n) = 2 end  Boolean;


Boolean procedure  String (n); integer  n;
begin   String:= type bits (n) = 3 end  String;


Boolean procedure  Designational (n); integer  n;
begin   Designational:= type bits (n) = 6 end  Designational;


Boolean procedure  Arbost (n); integer  n;
begin   Arbost:= Character (n) ≠ 24 ∧ type bits (n) < 6 end  Arbost;


Boolean procedure  Unknown (n); integer  n;
begin   Unknown:= type bits (n) = 7 end  Unknown;






Boolean procedure  Nonarithmetic (n); integer  n;
begin   integer i;
        i:= type bits (n);
        Nonarithmetic:= Character (n) = 24 ∨ i = 2 ∨ i = 3 ∨ i = 6
end  Nonarithmetic;


Boolean procedure  Nonreal (n); integer  n;
begin   Nonreal:= Nonarithmetic (n) ∨ type bits (n) = 1 end  Nonreal;


Boolean procedure  Noninteger (n); integer  n;
begin   Noninteger:= Nonarithmetic (n) ∨ type bits (n) = 0
end  Noninteger;


Boolean procedure  Nonboolean (n); integer  n;
begin   integer i;
        i:= type bits (n); Nonboolean:= i ≠ 2 ∧ i ≠ 5 ∧ i ≠ 7
end  Nonboolean;


Boolean procedure  Nonstring (n); integer  n;
begin   integer i;
        i:= type bits (n); Nonstring:= i ≠ 3 ∧ i ≠ 5 ∧ i ≠ 7
end  Nonstring;


Boolean procedure  Nondesignational (n); integer  n;
begin   Nondesignational:= type bits (n) < 6 end  Nondesignational;


Boolean procedure  Nontype (n); integer  n;
begin   Nontype:= type bits (n) = 6 ∨ (Proc (n) ∧ Nonfunction (n))
end  Nontype;


Boolean procedure  Simple (n); integer  n;
begin   Simple:= Code bits (n) = 127 ∨ Simple1 (n) end  Simple;


Boolean procedure  Simple1 (n); integer  n;
begin   Simple1 := Character (n) ÷ d3 = 0 end  Simple1;


Boolean procedure  Subscrvar (n); integer  n;
begin   Subscrvar:= Character (n) ÷ d3 = 1 end  Subscrvar;


Boolean procedure  Proc (n); integer  n;
begin   Proc:= Character (n) ÷ d3 > 1 ∧ Code bits (n) ≠ 127 end  Proc;


Boolean procedure  Function (n); integer  n;
begin   Function:= Character (n) ÷ d3 = 2 end  Function;






Boolean procedure  Nonsimple (n); integer  n;
begin   Nonsimple:= ¬ (Simple (n) ∨ (if Proc (n)
                                     then (Formal (n) ∨ Function (n)) ∧
                                           List length (n) < 1
                                     else false ))
end  Nonsirnple;


Boolean procedure  Nonsubscrvar (n); integer  n;
begin   Nonsubscrvar:= Simple1 (n) ∨ Proc (n) end  Nonsubscrvar;


Boolean procedure  Nonproc (n); integer  n;
begin   Nonproc:= ¬ (Character (n) ÷ d3 ≥ 2 ∨
                     (Formal (n) ∧ Simple1 (n) ∧ ¬ Assigned to (n)))
end  Nonproc;


Boolean procedure  Nonfunction (n); integer  n;
begin   Nonfunction:= ¬ (Function (n) ∨ Formal (n)) end  Nonfunction;


Boolean procedure  Formal (n); integer  n;
begin   Formal:= Code bits (n) > 95 end  Formal;


Boolean procedure  In value list (n); integer  n;
begin   In value list:= Code bits (n) > 63 ∧ ¬ Formal (n)
end  In value list;


Boolean procedure  Assigned to (n); integer  n;
begin   Assigned to:= bit string (d19, d18, space[nl base - n]) = 1
end  Assigned to;


Boolean procedure  Dynamic (n); integer  n;
begin   Dynamic:= Code bits (n) > 63 ∨ Assigned to (n) end  Dynamic;


Boolean procedure  In library (n); integer  n;
begin   In library:= space[nl base - n - 1] > d25 end  In library;


Boolean procedure  Id1 (k, n); integer  k, n;
begin   Id1:= bit string (2 × k, k, space[nl base - n - 1]) = 1 end  Id1;


Boolean procedure  Operator like (n); integer  n;
begin   Operator like:= Id1 (d23, n) end  Operator like;


Boolean procedure  Outside declaration (n); integer  n;
begin   Outside declaration:= Id1 (d22, n) end  Outside declaration;






Boolean procedure  Ass to function designator (n); integer  n;
begin   Ass to function designator:= Id1 (d21, n)
end  Ass to function designator;


Boolean procedure  Declared (n); integer  n;
begin   Declared:= Id1 (d19, n) end  Declared;


Boolean procedure  Super local (n); integer  n;
begin   Super local:= Id1 (d18, n) end  Super local;


procedure  Change (k, n); integer  k, n;
begin   integer  i, j;
        i:= space[nl base - n - 1]; j:= i - i ÷ (2 × k) × (2 × k);
        space[nl base - n - 1]:= i + (if j < k then k else -k)
end  Change;


integer procedure  Local position (n); integer  n;
begin   if  ¬ Ass to function designator (n) then  Change (d21, n);
        Local position:= Local position1 (n)
end  Local position;


integer procedure  Local position1 (n); integer  n;
begin   Local position1:= n + 2 end  Local position1;


procedure  Set inside declaration (n, bool); integer  n; Boolean  bool;
begin  Change (d22, n);
       if  ¬ (bool ∨ Ass to function designator (n))
       then  ERRORMESSAGE (390)
end  Set inside declaration;






procedure  Mark position in name list (n); integer n;
begin   integer  address;
        if Declared (n)
        then ERRORMESSAGE (391)
        else begin address:= Program address (n);
                   if address ≠ 0 then Substitute (address);
                   Change (d19, n)
             end
end  Mark position in name list;


integer procedure  Program address (n); integer  n;
begin   integer  word, head, m;
        m:= if Code bits (n) = 6 then n + 1 else n;
        word:= space[nl base - m]; head:= word ÷ d18 × d18;
        if ¬ Declared (n)
        then space[nl base - m]:= head + Order counter;
        Program address:= word - head
end  Program address;

integer procedure  Address (n); integer  n;
begin   integer  word, tail, level;
        word:= Code bits (n);
        if word > 13 ∧ word < 25
        then tail:= Program address (n)
        else begin word:= space[nl base - n];
                   tail:= word - word ÷ d18 × d18;
                   if Dynamic (n)
                   then begin level:= tail ÷ d9;
                              if level = proc level ∧
                                 ¬ in switch declaration
                              then tail:= tail + d9 × (63 - level)
                        end
             end;
        Address:= tail
end  Address;


integer procedure  List length (n); integer  n;
begin   List length:= bit string (d18, d0, space[nl base - n - 1]) - 1
end  List length;


procedure  Test for count (n); integer  n;
begin   if space[nl base - n - 1] ÷ d20 > for count
        then ERRORMESSAGE (392)
end  Test for count;






procedure  Check dimension (n); integer  n;
begin   integer  i;
        i:= if Code bits (n) = 14 then 1 else List length (n);
        if i ≥ 0 ∧ i ≠ dimension then ERRORMESSAGE (393)
end  Check dimension;


procedure  Check list length (f, n); integer  f, n;
begin   integer  i, j;
        i:= List length (f);
        j:= if Code bits (n) = 14 then 1 else List length (n);
        if i ≥ 0 ∧ j ≥ 0 ∧ i ≠ j then ERRORMESSAGE (394)
end Check list length;


procedure  Check type (f, n); integer  f, n;
begin   if (Designational (f) ∧ Nondesignational (n)) ∨
           (Arbost (f)        ∧ Nontype (n))          ∨
           (Arithmetic (f)    ∧ Nonarithmetic (n))    ∨
           (Boolean (f)       ∧ Nonboolean (n))       ∨
           (String (f)        ∧ Nonstring (n))
        then ERRORMESSAGE (395)
end Check type;


integer procedure  Number of local labels;
begin   Number of local labels:=
          bit string (d13, d0, space[nl base - block cell pointer - 3])
end  Number of local labels;


integer procedure  Next local label (n); integer  n;
begin   Next local label:=
          if n = 0 then space[nl base - block cell pointer - 3] ÷ d13
                   else next identifier (n)
end  Next local label;


integer procedure  Next formal identifier (n); integer  n;
begin   Next formal identifier:=
          next identifier (n + (if Formal (n) ∨ In library (n) ∨
                                   In value list (n)
                                then 2
                                else if Function (n) then 9 else 8))
end  Next formal identifier;


procedure  Increase status (increment); integer  increment;
begin   space[nl base - block cell pointer - 2]:=
        space[nl base - block cell pointer - 2] + increment
end  Increase status;


integer procedure  Identifier;
begin   read identifier; Identifier:= look up end  Identifier;






procedure  Skip parameter list;
begin   if last symbol = open
        then begin next symbol; skip type declaration;
                   if last symbol = close then next symbol
             end;
        if lastsymbol = semicolon then next symbol
end  Skip parameter list;


procedure  Translate code;
begin   integer  macro, parameter;
        if last symbol = quote
        then begin in code body:= true;
             next: next symbol;
                   if digit last symbol
                   then
                   begin macro:= unsigned integer (0);
                         if macro < 512 then macro:= macro list[macro];
                         if Par part (macro) > 0
                         then
                         begin if last symbol = comma
                               then next symbol
                               else ERRORMESSAGE (396);
                               if letter last symbol
                               then parameter:= Identifier
                               else
                               if digit last symbol
                               then parameter:= unsigned integer (0)
                               else
                               if last symbol = minus
                               then
                               begin next symbol;
                                     if digit last symbol
                                     then parameter:=
                                          - unsigned integer (0)
                                     else ERRORMESSAGE (397)
                               end
                               else ERRORMESSAGE (398);
                               Macro2 (macro, parameter)
                        end
                        else Macro (macro)
               end
               else ERRORMESSAGE (399);
               if last symbol = comma then goto next;
               if last symbol = unquote then next symbol
                                        else ERRORMESSAGE (400);
               in code body:= false
        end
        else ERRORMESSAGE (401);
        entrance block; exit block
end Translate code;






procedure  Unsigned number;
begin   integer  p;
        unsigned number;
        if ¬ small
        then begin p:= 0;
             next: if p = dp0 then goto found;
                   if space[prog base + p] ≠ value of constant ∨
                      space[prog base + p + 1] ≠ decimal exponent
                   then begin p:= p + 2; goto next end;
             found: address of constant:= p
             end
end  Unsigned number;


procedure  Arithconstant;
begin   if small then Macro2 (TSIC, value of constant)
        else
        if real number then Macro2 (TRC, address of constant)
                       else Macro2 (TIC, address of constant)
end  Arithconstant;


integer procedure  Operator macro (n); integer  n;
begin   Operator macro:= space[nl base - n - 2] end  Operator macro;


procedure  Constant string;
begin   integer word, count;
        quote counter:= 1;
next0:  word:= count:= 0;
next1:  next symbol;
        if last symbol ≠ unquote
        then begin word:= d8 × word + last symbol;
                   count:= count + 1;
                   if count = 3
                   then begin Macro2(CODE, word); goto next0 end;
                   goto next1
             end;
next2:  word:= d8 × word + 255; count:= count + 1;
        if count < 3 then goto next2;
        Macro2 (CODE, word); quote counter:= 0; next symbol
end  Constant string;


integer procedure  Relatmacro;
begin   Relatmacro:=  if last symbol = les then LES else
                      if last symbol = mst then MST else
                      if last symbol = mor then MOR else
                      if last symbol = lst then LST else
                      if last symbol = equ then EQU else UQU
end  Relatmacro;






main program of translate scan:
        if ¬ text in memory
        then begin NEWPAGE;
                   PRINTTEXT («input tape for translate scan»)
             end;
        start:= instruct counter; last nlp:= nlp;
        runnumber:= 300; init; increment:= d13;
        state:= b:= max depth:= max depth isr:=
        max display length:= max proc level:= ecount:= 0;
        in switch declaration:= in code body:= false;
        next block cell pointer:= 0;
        entrance block; next symbol;
        Program;
        sum of maxima:= max depth + max depth isr +
                        max display length + max proc level;
        Macro2 (CODE, sum of maxima);
        output
end translate;






procedure  output;
begin   integer  i, k, apostrophe, instruct number, par, address;

        procedure  pucar (n); integer  n;
        begin  integer i;
               for i:= 1 step 1 until n do PUNLCR
        end  pucar;
      
        procedure  tabspace (n); integer  n;
        begin  integer i, k;
               k:= n ÷ 8;
               for i:= 1 step 1 until k do PUSYM (118);
               PUSPACE (n - k × 8)
        end  tabspace;

        procedure  absfixp (k); integer  k;
        begin  ABSFIXP (4, 0, k); pucar (2) end  absfixp;

        procedure  punch (bool); Boolean  bool;
        begin  if bool then PUTEXT (« true»)
                       else PUTEXT («false»);
               pucar (2)
        end  punch;
      
        procedure  punch octal (n);  value n;  integer  n;
        begin  integer  i, k;
               Boolean  minussign;
               minussign:= n < 0; n:= abs (n);
               PUSYM (if minussign then minus else plus);
               PUSYM (apostrophe);
               for i:= d24, d21, d18, d15, d12, d9, d6, d3, d0 do
               begin k:= n ÷ i; n:= n - k × i; PUSYM (k) end;
               PUSYM (apostrophe)
        end  punch octal;
      
        apostrophe:= 120;
        PUNLCR;
        if runnumber = 100
        then
        begin tabspace (22); PUTEXT («prescan0»); pucar (2);
              PUTEXT («erroneous»); PUSPACE (14);
              punch (erroneous); PUTEXT («text length»);
              PUSPACE (12);
              absfixp (if text in memory then text pointer + 1 else 0);
              PUTEXT («namelist»); pucar(2);
              for i:= 0 step 1 until nlp - 1 do
              begin tabspace (7); ABSFIXP (4, 0, i); PUSPACE(5);
                    punch octal (space[nl base - i]); PUNLCR
              end;
              STOPCODE;
              PUNLCR; PUTEXT («dp0»); pucar (2);
              PUTEXT («start»); pucar (2);
              PUTEXT («program»); pucar (2);




              for i:= prog base step 1 until instruct counter - 1 do
              begin tabspace (7); ABSFIXP (4, 0, i);
                    FIXP (16, 0, space[i]); PUNLCR
              end;
              RUNOUT; STOPCODE
        end
        else if runnumber = 200
        then
        begin tabspace (38); PUTEXT («prescan1»); pucar (2);
              tabspace (39); punch (erroneous); tabspace (39);
              absfixp (if text in memory then text pointer + 1 else 0);
              pucar (2);
              for i:= 0 step 1 until nlp - 1 do
              begin tabspace (34); punch octal (space[nl base - i]);
                    PUNLCR
              end;
              STOPCODE; pucar (7);
              for i:= prog base step 1 until instruct counter - 1 do
              begin tabspace (32); FIXP (13, 0, space[i]); PUNLCR end;
              RUNOUT; STOPCODE
        end
        else
        begin tabspace (54); PUTEXT («translate»); pucar (2);
              tabspace (55); punch (erroneous); tabspace (55);
              absfixp (if text in memory then text pointer + 1 else 0);
              pucar (2);
              for i:= 0 step 1 until nlp - 1 do
              begin tabspace (50); punch octal (space[nl base - i]);
                    PUSPACE (2); ABSFIXP (4, 0, i); PUNLCR
              end;
              STOPCODE; PUNLCR;
              tabspace (55); absfixp (dp0);
              tabspace (55); absfixp (start); pucar (2);
              for i:= prog base step 1 until start - 1 do
              begin tabspace (48); FIXP(13, 0, space[i]);
                    PUSPACE (2); ABSFIXP (4, 0, i); PUNLCR
              end;
              PUNLCR;
              for i:= start step 1 until instruct counter - 1 do
              begin k:= space[i]; par:= k ÷ 32768;
                    address:= k - par × 32768;
                    instruct number:= par ÷ 10;
                    par:= par - instruct number × 10;
                    tabspace (48); ABSFIXP (3, 0, instruct number);
                    ABSFIXP (1, 0, par); ABSFIXP (5, 0, address);
                    PUSPACE (2); ABSFIXP (4, 0, i) ; PUNLCR
              end
       end
end  output;






main program:
        for n:= 0 step 1 until end of memory do space[n]:= 0;
        instruct counter:= prog base:= nlp:= 0;
        text base:= end of memory ÷ 3;
        nl base:= end of memory;


        prescan0;
        if ¬ derroneous
        then begin  prescan1;
                    translate
             end;
             
endrun:
end
end