%BEGIN %EXTERNAL %ROUTINE %SPEC ISOCARD(%BYTE %INTEGER %ARRAY %NAME A) %EXTERNAL %ROUTINE %SPEC CLOSESTREAM(%INTEGER CH) %INTEGER BF,BR,BI,E,S,K,ELSE,P,L,SWCT,NP,CH %STRING (70) BL %STRING (255) R,OUT,FR,TL,EX1,EX2,EX3,EX4,EX5,EX6 %INTEGER %ARRAY EC(1:50),SWSCOPE(1:2,1:20) %BYTE %INTEGER %ARRAY IN(0:255) %STRING (20) %ARRAY PARM(1:20,1:3),LIST(1:20),SW(0:30,1:20) %OWN %STRING (10) %ARRAY OLD(1:16) = '[',']','''POWER''','''/''', 'LN(','ENTIER(','''NE''','''LE''','''GE''',':=','=', '''LT''','''GT''','''GOTO''','''(''',''')''' %OWN %STRING (10) %ARRAY NEW(1:16) = '(',')','**','//','LOG(', 'INTPT(',' ~= ',' <= ',' >= ',' = ',' = ', ' < ',' > ','-> ',' '' ',' '' ' %OWN %STRING (10) %ARRAY END(1:3) = '%REPEAT','%FINISH','%END' %STRING %FN %SPEC ALIGN(%INTEGER LEV) %STRING %FN %SPEC TIDY(%STRING %NAME R, %INTEGER SP) %STRING %FN %SPEC PROCEDURE(%STRING %NAME F) %STRING %FN %SPEC ARRAY(%STRING %NAME F) %STRING %FN %SPEC DIGIT(%INTEGER N) %ROUTINE %SPEC INPUT(%STRING %NAME R) %ROUTINE %SPEC RESYM(%INTEGER %NAME S) %ROUTINE %SPEC OUTSTRING(%STRING %NAME S, %INTEGER CONT) SELECT INPUT(1) SELECT OUTPUT(2) %FAULT 9 -> Z0 SPACES(20) %PRINTTEXT 'ALGOL60 TO IMP(AA) CONVERTER DATED: 09/04/73' NEWLINES(5) BI = ADDR(IN(0)) BF = ADDR(FR) BR = ADDR(TL) BL = ' ' BL = BL.BL %CYCLE K=7,1,16 S = ADDR(NEW(K)) %CYCLE E=1,1,LENGTH(NEW(K)) BYTEINTEGER(S+E) = BYTEINTEGER(S+E)+128 %REPEAT %REPEAT E = 0 SWCT = 0 NP = -1 CH = 25 A1:INPUT(R) A3:OUT = '' A2:%IF R -> FR.(':').TL %AND CHARNO(TL,1) ~= '=' %THEN %START %CYCLE K=1,1,LENGTH(FR) S = CHARNO(FR,K) %IF 'A' <= S <= 'Z' %THEN -> L1 %UNLESS '0' <= S <= '9' %THEN -> L2 L1: %REPEAT %IF SWCT > 0 %THEN %START %CYCLE K=SWCT,-1,1 S = SWSCOPE(2,K) %IF S > 0 %THEN %START %CYCLE L=1,1,S %IF FR = SW(L,K) %THEN %START FR = SW(0,K).'('.DIGIT(L).')' -> L3 %FINISH %REPEAT %FINISH %REPEAT L3: %FINISH OUT = OUT.FR.':' R = TL -> A2 %FINISH L2:S = 3*E-LENGTH(OUT) %IF S > 0 %THEN OUT = OUT.FROMSTRING(BL,1,S) %IF R -> ('''BEGIN''').TL %THEN %START OUT = OUT.'%BEGIN' OUTSTRING(OUT,-1) R = TL E = E+1 EC(E) = 3 -> A3 %FINISH %IF R -> FR.('''ARRAY''').TL %THEN %START OUT = OUT.ARRAY(FR).TIDY(TL,1) OUTSTRING(OUT,-1) -> A1 %FINISH %IF R -> FR.('''PROCEDURE''').TL %THEN %START OUT = OUT.PROCEDURE(FR) %IF TL -> EX1.('(').EX2.(')').EX3 %THEN %START OUT = OUT.EX1.'(' P = 0 A6: P = P+1 PARM(P,3) = '%NAME ' %IF EX2 -> PARM(P,1).(',').EX2 %THEN -> A6 PARM(P,1) = EX2 ELSE = -1 %FINISH %ELSE %START OUT = OUT.TIDY(TL,1) OUTSTRING(OUT,-1) ELSE = 1 %FINISH E = E+1 EC(E) = 3 A7: INPUT(R) %IF R -> ('''BEGIN''').R %THEN -> A8 K = -1 %IF R -> FR.('''ARRAY''').TL %THEN EX3 = ARRAY(FR) %IF R -> FR.('''PROCEDURE''').TL %THEN EX3 = PROCEDURE(FR) %IF R -> FR.('''VALUE''').TL %THEN %START EX3 = '' K = 1 %FINISH %IF K < 0 %THEN %START R -> ('''').FR.('''').TL EX3 = '%'.FR.' ' %FINISH BYTEINTEGER(BR+LENGTH(TL)) = ',' L = 0 P1: L = L+1 %IF TL -> LIST(L).(',').TL %THEN -> P1 %CYCLE K=1,1,L-1 EX1 = LIST(K) %CYCLE S=1,1,P %IF EX1 = PARM(S,1) %THEN %START %IF EX3 = '' %THEN PARM(S,3) = '' %C %ELSE PARM(S,2) = EX3 %IF EX3 -> FR.('%ROUTINE').TL %OR EX3 -> FR.('%FN').TL%C %THEN PARM(S,3) = '' %FINISH %REPEAT %REPEAT -> A7 A8: %IF ELSE > 0 %THEN -> A3 EX3 = '' %CYCLE S=1,1,P EX1 = PARM(S,2).PARM(S,3) %IF EX1 = EX3 %THEN EX2 = ',' %C %ELSE %START %IF EX3 = '' %THEN EX2 = '' %C %ELSE EX2 = ', ' EX3 = EX1 EX2 = EX2.EX1 %FINISH %IF EX2->EX4.('%ARRAY').EX5 %THEN %START %UNLESS EX5->EX4.('%NAME').EX6 %THEN %C EX2=EX4.'%ARRAYNAME'.EX5 %FINISH OUT = OUT.EX2.PARM(S,1) %REPEAT OUT = OUT.')' OUTSTRING(OUT,-1) -> A3 %FINISH %IF R -> ('''SWITCH''').R %THEN %START R -> FR.(':=').TL OUT = OUT.'%SWITCH '.FR.'(1:' SWCT = SWCT+1 SWSCOPE(1,SWCT) = E SW(0,SWCT) = FR BYTEINTEGER(BR+LENGTH(TL)) = ',' K = 0 S1: K = K+1 %IF TL -> SW(K,SWCT).(',').TL %THEN -> S1 SWSCOPE(2,SWCT) = K-1 OUT = OUT.DIGIT(K-1).')' OUTSTRING(OUT,-1) -> A1 %FINISH %IF R -> ('''FOR''').FR.(':=').TL %THEN %START OUT = OUT.'%CYCLE '.FR.'=' TL -> EX3.('''DO''').R %UNLESS EX3 -> EX1.('''STEP''').EX2.('''UNTIL''').EX3 %THEN %START %IF EX3->EX1.('''WHILE''').EX2 %OR %C EX3->EX1.(',').EX2.(',').EX4 %THEN %START SELECTOUTPUT(99) FR = ' UNKNOWN,UNKNOWN,UNKNOWN;!'.EX3 NEWLINE %PRINTTEXT 'UNTRANSLATABLE ''FOR''' SELECTOUTPUT(CH) %FINISH %ELSE %START %IF EX3->EX1.(',').EX2 %THEN %START FR=TIDY(EX1,1).','.TIDY(EX2,1).'-'.TIDY(EX1,1) %C .','.TIDY(EX2,1) %FINISH %ELSE %START FR=TIDY(EX3,1).',1,'.TIDY(EX3,1) %FINISH %FINISH %FINISH %ELSE FR = TIDY(EX1,1).','.TIDY(EX2,1).','.TIDY(EX3,1) OUT = OUT.FR OUTSTRING(OUT,-1) E = E+1 %IF R -> ('''BEGIN''').R %THEN EC(E) = 1 %C %ELSE EC(E) = -1 -> A3 %FINISH %IF R -> ('''IF''').FR.('''THEN''').R %THEN %START %IF FR->EX4.('''IF''').EX5 %AND R->EX6.('''THEN''').R %C %THEN %START OUT=OUT.'%IF '.TIDY(EX4,-1).'%IF '.TIDY(EX5,-1).'%THEN ' %C .TIDY(EX6,-1).'%THEN ' %FINISH %ELSE %C OUT = OUT.'%IF '.TIDY(FR,-1).' %THEN ' I2: %IF R -> ('''FOR''').TL %THEN K = -2 %C %ELSE K = 2 I1: %IF K < 0 %OR R -> ('''BEGIN''').R %THEN %START OUT = OUT.'%START' OUTSTRING(OUT,-1) E = E+1 EC(E) = K -> A3 %FINISH %FINISH I3:%IF R -> FR.('''END''').TL %THEN %START EX3 = '''END'''.TL R = FR %FINISH %ELSE EX3 = '' %IF R -> FR.('''ELSE''').TL %THEN %START EX3 = '''ELSE'''.TL.EX3 R = FR ELSE = 1 %FINISH %ELSE ELSE = -1 %IF R ~= '' %THEN %START OUT = OUT.TIDY(R,1) OUTSTRING(OUT,ELSE) OUT = ALIGN(E) %FINISH %IF EX3 = '' %OR EX3 -> ('''END''').TL %THEN %START A4: %IF E <= 0 %OR EC(E) > 0 %THEN %START %IF EX3 = '' %THEN -> A1 -> A5 %FINISH FR = END(!EC(E)!) E = E-1 OUT = ALIGN(E).FR OUTSTRING(OUT,-1) OUT = ALIGN(E) -> A4 %FINISH A5:%IF EX3 -> ('''ELSE''').R %THEN %START OUT = ALIGN(E).'%ELSE ' %IF R -> ('''IF''').FR %THEN %START %IF FR->EX5.('''BEGIN''').EX6 %THEN %START K = -2 -> I1 %FINISH %FINISH ->I2 %FINISH %ELSE %START EX3 -> ('''END''').TL FR = END(EC(E)) %IF EC(E) = 3 %AND SWCT > 0 %THEN %START %CYCLE K=1,1,SWCT %IF SWSCOPE(1,K) = E %THEN SWSCOPE(2,K) = 0 %REPEAT %FINISH E = E-1 %CYCLE K=1,1,LENGTH(TL) S = BYTEINTEGER(BR+K) %IF S = '''' %OR S = ';' %THEN -> A9 %REPEAT A9: R = FR.FROMSTRING(TL,K,LENGTH(TL)) %CYCLE K=1,1,3 %IF OUT -> FR.(' ').TL %THEN OUT = FR.TL %REPEAT -> I3 %FINISH Z0:SELECTOUTPUT(2) NEWLINES(2) %PRINTTEXT 'STREAM' WRITE(CH,2) %PRINTTEXT' : FILE COMPLETE' NEWLINES(5) %PRINTTEXT ' === END OF DATA ===' %STRING %FN ALIGN(%INTEGER LEV) %IF LEV = 0 %THEN %RESULT = '' %RESULT = FROMSTRING(BL,1,3*LEV) %END %STRING %FN TIDY(%STRING %NAME R, %INTEGER SP) %INTEGER K,BC,SY %STRING (2) SEP %STRING (240) S,F,T,M S = R %IF SP < 0 %THEN SEP = ' %' %C %ELSE SEP = '%' %CYCLE K=1,1,16 T1: %IF S -> F.(OLD(K)).T %THEN %START S = F.NEW(K).T -> T1 %FINISH %REPEAT T2: %IF S -> F.('''').M.('''').T %THEN %START %IF 'A' <= CHARNO(M,1) <= 'Z' %THEN S = F.SEP.M.' '.T %C %ELSE S = F.'@'.M.''''.T -> T2 %FINISH %IF S -> F.('''').T %THEN S = F.'@'.T %IF S -> F.(';').T %THEN S = F.T T3: %IF S -> F.('ABS(').T %THEN %START BC = 1 %CYCLE K=1,1,LENGTH(T) SY = CHARNO(T,K) %IF SY = '(' %THEN BC = BC+1 %IF SY = ')' %THEN BC = BC-1 %IF BC = 0 %THEN -> T4 %REPEAT T4: M = FROMSTRING(T,1,K-1) T -> (M.')').T S = F.'!'.M.'!'.T -> T3 %FINISH %RESULT = S %END %STRING %FN PROCEDURE(%STRING %NAME F) %STRING (10) M K = 1 %IF F = '' %THEN M = '%ROUTINE' %C %ELSE %START BYTEINTEGER(BF+1) = '%' BYTEINTEGER(BF+LENGTH(F)) = ' ' M = '%FN' %FINISH %RESULT = F.M.' ' %END %STRING %FN ARRAY(%STRING %NAME F) K = 1 %IF F = '' %THEN F = '''REAL''' BYTEINTEGER(BF+1) = '%' BYTEINTEGER(BF+LENGTH(F)) = ' ' %RESULT = F.'%ARRAY ' %END %STRING %FN DIGIT(%INTEGER N) %INTEGER T,U %STRING (1) D T = N//10 U = N-10*T %IF T = 0 %THEN D = '' %C %ELSE D = TOSTRING(T+'0') %RESULT = D.TOSTRING(U+'0') %END %ROUTINE INPUT(%STRING %NAME R) %INTEGER K,S I2: K = 0 I1: RESYM(S) %IF S = ' ' %OR S = NL %THEN -> I1 K = K+1 IN(K) = S %IF S ~= ';' %THEN -> I1 IN(0) = K R = STRING(BI) %IF R -> FR.('''COMMENT''').TL %THEN %START R = FR %IF BL -> (R).TL %THEN -> I2 %FINISH K = 0 %IF R -> ('%LISTON').TL %THEN K = -1 %IF R -> ('%LISTOFF').TL %THEN K = 1 %IF K ~= 0 %THEN %START NP = K -> I2 %FINISH %IF R -> ('%STOP').TL %THEN %START SELECTOUTPUT(2) NEWLINES(2) %PRINTTEXT 'STREAM' WRITE(CH,2) %PRINTTEXT ' : FILE COMPLETE' NEWLINES(2) CLOSESTREAM(CH) E = 0 SWCT = 0 CH = CH+1 SELECTOUTPUT(CH) -> I2 %FINISH %END %ROUTINE RESYM(%INTEGER %NAME S) %OWN %INTEGER COUNT %OWN %INTEGER COL %OWN %INTEGER END %OWN %BYTE %INTEGER %ARRAY CARD(1:80) %IF COL = END %THEN %START ISOCARD(CARD) COUNT = COUNT+1 %IF NP > 0 %THEN -> R1 SELECTOUTPUT(2) WRITE(COUNT,4) SPACES(5) %CYCLE COL=1,1,80 PRINTSYMBOL(CARD(COL)) %REPEAT NEWLINE SELECTOUTPUT(CH) R1: COL = 0 END = 72 %FINISH COL = COL+1 S = CARD(COL) %END %ROUTINE OUTSTRING(%STRING %NAME S, %INTEGER CONT) %INTEGER K,SY %STRING (68) C %IF CONT > 0 %THEN CONT = 68 %C %ELSE CONT = 72 S2: %IF LENGTH(S) > CONT %THEN %START C = FROMSTRING(S,1,68) S -> (C).S %IF 'A' <= CHARNO(S,1) <= 'Z' %THEN %START %CYCLE K=68,-1,1 SY = CHARNO(C,K) %UNLESS 'A' <= SY <= 'Z' %THEN -> S1 %REPEAT S1: %IF SY = '%' %THEN S = '%'.S %IF K = 68 %AND SY='%' %THEN BYTEINTEGER(ADDR(C)+68) = ' ' %FINISH PRINTSTRING(C.' %C') NEWLINE S = ALIGN(E+1).S -> S2 %FINISH %IF CONT = 68 %THEN S = S.' %C' PRINTSTRING(S) NEWLINE %END %END %OF %PROGRAM