begin comment ALGOL editor. The data tape must contain the following control numbers: 1. numofpr: the number of programs to be edited, 2, width: the maximal number of positions on a line, 3. page: the number of lines per type area, 4. rest: the number of blank lines between two pages, 5. n: the upper index of the i̲n̲t̲e̲g̲e̲r̲ a̲r̲r̲a̲y̲ pos (see 6.), 6. pos[1:n]: n numbers which regulate the indentations; integer symbol, i, s, ih, sh, breaki, breaks, tabstop, level, arlevel, stringlevel, line, comm, decl, lab, proc, pointer, a, b, c, h, k, w, zz, nop, numofpr, width, page, rest, n; boolean booll, boolb, boolc; integer array buffer[1:2000], stock[1:40], proclevel[0:10]; numofpr ≔ read; width ≔ read; page ≔ read; rest ≔ read; n ≔ read; begin integer array pos[0:n]; procedure sym(n); value n; integer n; begin PUSYM(n); PRSYM(n) end; procedure space(n); value n; integer n; begin integer i; for i ≔ 1 step 1 until n do sym(93) end; procedure tabspace(n); value n; integer n; begin integer p, q; p ≔ n ÷ 8; q ≔ n - p × 8; for a ≔ 1 step 1 until p do sym(118); space(q) end; procedure punchline(border); value border; integer border; begin tabspace(tabstop - (if boolb ∧ booll then (pos[b] + (if level ⩽ n then pos[b - 1] else pos[n])) else if booll ∨ boolb then pos[b] else 0)); booll ≔ boolb ≔ false; for a ≔ 1 step 1 until border do sym(buffer[a]); newline end; procedure newline; begin sym(119); line ≔ line + 1; if line ⩾ page then begin RUNOUT; for a ≔ 1 step 1 until rest do sym(119); line ≔ 0 end end; procedure punchbuffer; begin punchline(i - 1); i ≔ 1; s ≔ tabstop; breaki ≔ breaks ≔ 0 end; procedure restbuffer(n); value n; integer n; begin i ≔ i - n - 1; for a ≔ 1 step 1 until i do buffer[a] ≔ buffer[n + a]; i ≔ i + 1 end; procedure label; begin if i < pos[b] then begin for a ≔ i step 1 until pos[b] do buffer[a] ≔ 93; i ≔ pos[b] + 1 end else begin buffer[i] ≔ 93; i ≔ i + 1 end; lab ≔ 0 end; procedure breakbuffer; begin integer n; if breaki > 0 ∧ zz = 0 then begin punchline(breaki); restbuffer(breaki); s ≔ s - breaks + tabstop; if lab = 1 then begin label; s ≔ i + tabstop end end else begin for a ≔ i - 2 step - 1 until 1 do if buffer[a] = 93 then begin n ≔ a; goto break1 end; goto break2; break1: punchline(n); restbuffer(n); break2: if lab = 1 then label; s ≔ i + tabstop; if s ⩾ width then emergency end; breaki ≔ breaks ≔ 0 end; procedure stockbuffer(spacesbefore, spacesafter, c); value spacesbefore, spacesafter, c; integer spacesbefore, spacesafter, c; begin for a ≔ 1 step 1 until spacesbefore do buffer[i + a - 1] ≔ 3; i ≔ i + spacesbefore; s ≔ s + spacesbefore; for a ≔ 1 step 1 until c do buffer[i + a - 1] ≔ stock[a]; i ≔ i + c; s ≔ s + c ÷ 2; for a ≔ 1 step 1 until spacesafter do buffer[i + a - 1] ≔ 93; i ≔ i + spacesafter; s ≔ s + spacesafter; if comm = 0 then goto start1 end; procedure semicolon; begin buffer[i] ≔ 91; i ≔ i + 1; zz ≔ 0; punchbuffer; if level = proclevel[pointer] then begin RUNOUT; newline; pointer ≔ pointer - 1; proc ≔ if pointer = 0 then - 1 else 1 end; goto start end; integer procedure undsym; begin undl: symbol ≔ RESYM; if symbol = 126 then goto undl; undsym ≔ symbol end; procedure emergency; begin ih ≔ i; sh ≔ s; for a ≔ ih step - 1 until 1 do begin ih ≔ ih - 1; sh ≔ sh - 1; if buffer[a] = 87 ∧ sh < width then begin punchline(ih + 1); restbuffer(ih + 1); s ≔ i + tabstop; breaki ≔ breaks ≔ 0; goto endem end; k ≔ a end; if k = 1 then begin sym(119); PRINTTEXT(“ the chosen indentations are too large with respect to the maximal number of positions on the line:” ); EXIT end; endem: end; begin of program: for a ≔ 1 step 1 until n do pos[a] ≔ read; nop ≔ 0; repeat: i ≔ s ≔ line ≔ 1; booll ≔ boolb ≔ boolc ≔ false; breaki ≔ breaks ≔ tabstop ≔ level ≔ arlevel ≔ stringlevel ≔ comm ≔ decl ≔ lab ≔ b ≔ pointer ≔ zz ≔ proclevel[0] ≔ pos[0] ≔ 0; proc ≔ - 1; RUNOUT; sym(119); start: symbol ≔ RESYM; if i > 1 ∧ (symbol = 93 ∨ symbol = 119) then begin if buffer[i - 1] > 63 then goto start else begin for symbol ≔ RESYM while symbol = 93 ∨ symbol = 119 do ; if symbol < 63 then begin buffer[i] ≔ 93; buffer[i + 1] ≔ symbol; i ≔ i + 2; s ≔ s + 2; goto start end end end; start1: if symbol = 93 ∨ symbol = 118 ∨ symbol = 119 then goto start; if s ⩾ width then begin breakbuffer; goto start1 end; if symbol < 64 ∨ symbol = 76 ∨ symbol = 88 ∨ symbol = 89 ∨ symbol= 98 ∨ symbol = 99 then begin comment digits, letters, ¬, ., ⏨, (, ); buffer[i] ≔ symbol; i ≔ i + 1; s ≔ s + 1; goto start end else if symbol = 64 ∨ symbol = 65 ∨ symbol = 66 ∨ symbol = 67∨ symbol = 70 ∨ symbol = 72 ∨ symbol = 74 ∨ symbol = 79 ∨ symbol = 80 then begin comment +, -, ×, /, =, <, >, ∧, ∨; if buffer[i - 1] ≠ 93 then begin buffer[i] ≔ 93; i ≔ i + 1; s ≔ s + 1 end; buffer[i] ≔ symbol; buffer[i + 1] ≔ 93; i ≔ i + 2; s ≔ s + 2; goto start end else if symbol = 100 ∨ symbol = 101 then begin comment [, ]; buffer[i] ≔ symbol; i ≔ i + 1; s ≔ s + 1; arlevel ≔ (if symbol = 100 then 1 else - 1) + arlevel; goto start end else if symbol = 87 then begin comment ,; buffer[i] ≔ symbol; if arlevel = 0 then begin buffer[i + 1] ≔ 93; i ≔ i + 2; s ≔ s + 2 end else begin i ≔ i + 1; s ≔ s + 1 end; goto start end else if symbol = 91 then begin comment semicolon; buffer[i] ≔ symbol; buffer[i + 1] ≔ 93; if s < width then begin breaki ≔ i + 1; breaks ≔ s + 1 end; i ≔ i + 2; s ≔ s + 2; if decl = 1 then begin if proc ≠ 0 then punchbuffer; decl ≔ 0; goto start end; if proc = 0 then begin punchbuffer; RUNOUT; newline; proc ≔ if pointer = 0 then - 1 else 1 end; goto start end else if symbol = 90 then begin comment colon; if arlevel ≠ 0 then begin buffer[i] ≔ 90; i ≔ i + 1; s ≔ s + 1; goto start end else begin symbol ≔ RESYM; if symbol = 70 then begin buffer[i] ≔ 90; buffer[i + 1] ≔ 70; buffer[i + 2] ≔ 93; i ≔ i + 3; s ≔ s + 3; goto start end else pardel: if symbol = 93 then begin symbol ≔ RESYM; goto pardel end; if symbol = 98 then begin buffer[i] ≔ 90; buffer[i + 1] ≔ 93; buffer[i + 2] ≔ 98; i ≔ i + 3; s ≔ s + 3; goto start end else begin buffer[i] ≔ 90; i ≔ i + 1; if level = 0 then begin punchbuffer; goto start1 end; lab ≔ 1; for a ≔ i - 2 step - 1 until 1 do if buffer[a] = 126∨ buffer[a] = 91 ∨ buffer[a] = 90 then goto labinst; label; booll ≔ true; goto start1; labinst: if buffer[a] = 126 then breaki ≔ a + 2 else if buffer[a] = 90 then begin if a < pos[b] then breaki ≔ pos[b] else breaki ≔ a + 1 end; breakbuffer; booll ≔ true; goto start1 end end end else if symbol = 127 then begin comment |; bar: symbol ≔ RESYM; if symbol = 127 then goto bar; if symbol = 80 ∨ symbol = 70 then begin comment ⭡ ≠ ; buffer[i] ≔ 93; buffer[i + 1] ≔ 127; buffer[i + 2] ≔ symbol; buffer[i + 3] ≔ 93; i ≔ i + 4; s ≔ s + 3; goto start end else if symbol = 72 then begin comment {; buffer[i] ≔ 127; buffer[i + 1] ≔ 72; breaki ≔ i - 1; breaks ≔ s - 1; i ≔ i + 2; s ≔ s + 1; string: symbol ≔ RESYM; buffer[i] ≔ symbol; if symbol ≠ 127 then begin i ≔ i + 1; if symbol ≠ 126 then begin if symbol = 118 then s ≔ s + 8 else s ≔ s + 1; if symbol = 119 then line ≔ line+ 1 end; if s > width - 4 ∧ breaks > 0 then breakbuffer; goto string end else begin bar1: symbol ≔ RESYM; if symbol = 127 then goto bar1; if symbol = 74 then begin comment }; buffer[i + 1] ≔ symbol; i ≔ i + 2; s ≔ s + 1; if stringlevel ≠ 0 then begin stringlevel ≔ stringlevel - 1; goto string end else if s > width - 3 then begin for a ≔ 1 step 1 until i - 1 do sym(buffer[a]); newline; i ≔ 1; s ≔ tabstop end; goto start end else if symbol = 72 then begin comment nested stringquotes; stringlevel ≔ stringlevel + 1; buffer[i + 1] ≔ symbol; i ≔ i + 2; s ≔ s + 1; goto string end else begin buffer[i + 1] ≔ symbol; i ≔ i + 2; s ≔ s + 1; goto string end end end else begin buffer[i] ≔ 127; i ≔ i + 1; goto start1 end end else if symbol = 126 then begin comment _; symbol ≔ undsym; if symbol = 70 ∨ symbol = 72 ∨ symbol = 74 ∨ symbol= 76 ∨ symbol = 90 then begin comment ≡, ⩽, ⩾, ⊂, ÷ ; buffer[i] ≔ 93; buffer[i + 1] ≔ 126; buffer[i + 2] ≔ symbol; buffer[i + 3] ≔ 93; i ≔ i + 4; s ≔ s + 3; goto start end else begin stock[1] ≔ 126; stock[2] ≔ symbol; stock[3] ≔ RESYM; for a ≔ 4 step 2 until 18 do begin stock[a] ≔ undsym; symbol ≔ stock[a + 1] ≔ RESYM; if symbol ≠ 126 then begin k ≔ a; goto again end end; again: if (stock[2] = 15 ∧ stock[4] = 10) ∨ (stock[2] = 29∧ stock[4] = 27) then begin comment f̲a̲l̲s̲e̲, t̲r̲u̲e̲; stockbuffer(0, 0, k) end else if stock[2] = 11 ∧ stock[4] = 14 then begin comment begin; if i > pos[b] then begin for a ≔ i - 1 step - 1 until i - pos[b] do if buffer[a] ≠ 93 then begin c ≔ a; if buffer[c] = 90 ∧ c < pos[b] then goto labeg else goto pun end end; pun: if i ≠ 1 then punchbuffer; labeg: comm ≔ 1; stockbuffer(0, 1, k); comm ≔ 0; if proc = 0 then begin pointer ≔ pointer + 1; proclevel[pointer] ≔ level; proc ≔ 1 end; level ≔ level + 1; b ≔ if level < n then level else n; boolb ≔ true; tabstop ≔ abstop + pos[b]; w ≔ pos[b] - 6; if w > 0 then begin for a ≔ 0 step 1 until w - 1 do buffer[i + a] ≔ 93; i ≔ i + w; s ≔ s + w end; goto start1 end else if stock[2] = 13 ∨ (stock[2] = 28 ∧ stock[4] = 29 ∧ stock[6] = 14) ∨ stock[2] = 32 ∨ stock[2] = 29 ∨ stock[2] = 30 then begin comment do, step, while, then, until; stockbuffer(1, 1, k) end else e: if stock[2] = 14 ∧ stock[4] = 21 then begin comment else; if zz = 0 then stockbuffer(1, 1, k) else begin zz ≔ 0; stockbuffer(0, 1, k) end end else if stock[2] = 14 then begin comment end; if buffer[1] = 126 ∧ buffer[2] = 11 ∧ buffer[4] = 14∧ s < width - 5 ∧ zz = 0 then zz ≔ 1 else zz ≔ 0; if zz = 1 then begin boolb ≔ false; goto goon end; if i ≠ 1 then punchbuffer; goon: comm ≔ 1; if zz = 0 then stockbuffer(0, 0, k) else stockbuffer(1, 0, k); comm ≔ 0; tabstop ≔ tabstop - pos[b]; level ≔ level - 1; if level = 0 then begin punchbuffer; sym(119); RUNOUT; nop ≔ nop + 1; if nop = numofpr then goto end else begin k ≔ page + rest - 1; for a ≔ line step 1 until k do sym(119); goto repeat end end else b ≔ if level < n then level else n; if symbol = 93 ∨ symbol = 118 ∨ symbol = 119 then begin reject: symbol ≔ RESYM; if symbol = 93 ∨ symbol = 118 ∨ symbol = 119 then goto reject else if symbol = 126 then begin stock[1] ≔ 126; for a ≔ 2 step 2 until 18 do begin stock[a] ≔ undsym; symbol ≔ stock[a + 1] ≔ RESYM; if symbol ≠ 126 then begin k ≔ a; goto nextund end end; nextund: if stock[2] = 14 then begin if i ≠ 1 then punchbuffer; zz ≔ 1; goto e end else begin if zz = 1 then begin breakbuffer; zz ≔ 0 end; buffer[i] ≔ 93; i ≔ i + 1; s ≔ s + 1; boolc ≔ true; goto comm1 end end else if symbol = 91 then semicolon else begin if zz = 1 then begin breakbuffer; zz ≔ 0 end; buffer[i] ≔ 93; buffer[i + 1] ≔ symbol; i ≔ i + 2; s ≔ s + 2; boolc ≔ true; goto comm2 end end else if symbol = 91 then semicolon else begin if zz = 1 then begin breakbuffer; zz ≔ 0 end; buffer[i] ≔ symbol; i ≔ i + 1; s ≔ s + 1; goto comm2 end end else if stock[2] = 12 then begin comment comment; comm1: comm ≔ 1; stockbuffer(0, 1, k); comm ≔ 0; nospace: if symbol = 93 then begin symbol ≔ RESYM; goto nospace end; buffer[i] ≔ symbol; i ≔ i + 1; s ≔ s + 1; comm2: symbol ≔ RESYM; if symbol ≠ 118 ∧ symbol ≠ 119 ∧ symbol ≠ 93 then buffer[i] ≔ symbol else if buffer[i - 1] ≠ 93 then buffer[i] ≔ 93 else goto comm2; if symbol ≠ 91 then begin i ≔ i + 1; if symbol ≠ 126 then s ≔ s + 1 else if boolc then begin buffer[i] ≔ symbol ≔ undsym; i ≔ i + 1; s ≔ s + 1; if symbol ≠ 14 then goto comm2 else begin stock[1] ≔ 126; stock[2] ≔ 14; symbol ≔ stock[3] ≔ RESYM; if symbol = 126 then begin for a ≔ 4 step 2 until 10 do begin stock[a] ≔ undsym; symbol ≔ stock[a + 1] ≔ RESYM; if symbol ≠ 126 then begin k ≔ a; i ≔ i - 3; s ≔ s - 2; if stock[4] = 21 ∨ stock[4] = 23 then begin i ≔ i + 1; punchbuffer; boolc ≔ false; if stock[4] = 21 then zz ≔ 1; goto e end else begin comm ≔ 1; stockbuffer(0, 0, k); comm ≔ 0; goto comm2 end end end end else begin comm ≔ 1; stockbuffer(0, 0,2); comm ≔ 0; buffer[i] ≔ symbol; goto comm2 end end end; if s > width then breakbuffer; goto comm2 end else begin i ≔ i + 1; punchbuffer; if level = proclevel[pointer] then begin RUNOUT; newline; pointer ≔ pointer - 1; proc ≔ if pointer = 0 then - 1 else 1 end; boolc ≔ false; goto start end end else if stock[2] = 27 ∨ (stock[2] = 18 ∧ stock[4] = 23)∨ stock[2] = 11 ∨ stock[2] = 38 then begin comment real, integer, boolean, Boolean; if stock[k +1] = 93 then begin for a ≔ k + 2 step 1 until 100 do begin symbol ≔ RESYM; if symbol ≠ 93 then goto dec end; dec: if symbol = 126 then begin stock[k + 2] ≔ 126; for a ≔ k + 4 step 2 until k + 20 do begin stock[a - 1] ≔ undsym; symbol ≔ stock[a] ≔ RESYM; if symbol ≠ 126 then begin h ≔ a; goto arproc end end; arproc: if stock[k + 3] = 10 then begin comment <type> array; decl ≔ 1; stock[h] ≔ 93; stockbuffer(0, 0, h) end else begin comment <type> procedure; if i ≠ 1 then punchbuffer; if proc ≠ 0 then begin RUNOUT; newline; proc ≔ 0 end; decl ≔ 1; stock[h] ≔ 93; stockbuffer(0, 0, h) end end else begin stock[k + 2] ≔ symbol; symbol ≔ stock[k + 3] ≔ RESYM; decl ≔ 1; stockbuffer(0, 0, k + 2) end end else begin decl ≔ 1; stockbuffer(0, 1, k) end end else if stock[2] = 25 then begin comment procedure; if proc ≠ 0 then begin if i ≠ 1 then punchbuffer; RUNOUT; newline; proc ≔ 0 end; decl ≔ 1; stockbuffer(0, 1, k) end else if stock[2] = 15 then begin comment for; if i > pos[b] then begin for a ≔ i - 1 step - 1 until i - pos[b] do if buffer[a] ≠ 93 then begin c ≔ a; goto non12 end; non12: if c ⩾ 10 then begin if (buffer[c] = 23 ∧ buffer[c - 1] = 126 ∧ buffer[c - 2] = 18) ∨ buffer[c] = 90 then goto lafor end; if buffer[c] = 90 then goto lafor end; if i ≠ 1 then punchbuffer; lafor: stockbuffer(0, 1, k) end else if stock[2] = 24 ∨ (stock[2] = 28 ∧ stock[4] = 29)∨ stock[2] = 10 ∨ stock[2] = 28 ∨ stock[2] = 21 ∨ stock[2] = 31 then begin comment own, string, array, switch, label, value; decl ≔ 1; stockbuffer(0, 1, k) end else stockbuffer(0, 1, k) end end else begin buffer[i] ≔ symbol; i ≔ i + 1; s ≔ s + 1; goto start end; end: STOPCODE end end