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) impl 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