EXTERNALROUTINE PSPROG2(STRING (63) S)
EXTERNALSTRINGFNSPEC DATE
INTEGER I, J, K, SS, NBIP
STRING (15) ST49,ST50,ST51
EXTERNALROUTINESPEC DEFINE(STRING (63)S)
INTEGERARRAY SYMBOL(1300:3000), CC(0:300)
INTEGER CNEXT, DNEXT, CNUM, DNUM, ALT, DEF, ASL, NIDFLAG
INTEGERARRAY KK, DWORD(1001:1200), DLETT(0:1000)
ROUTINESPEC READ STRING(INTEGER TERMINATOR)
ROUTINESPEC RECORD(INTEGERARRAYNAME WORD, LETT, C
INTEGERNAME NUM, NEXT)
ROUTINESPEC LOOK UP(INTEGERARRAYNAME WORD, LETT, C
INTEGER FIRST, LAST, INSERT)
ROUTINESPEC PDDICT
ROUTINESPEC PRINT STR(INTEGERARRAYNAME CC, INTEGER PTR)
UNLESS S->ST49.(",").ST50.(",").ST51 THEN C
PRINTSTRING("PARAMS?????") AND NEWLINE AND RETURN
DEFINE('ST49,'.ST49)
DEFINE('ST50,'.ST50)
DEFINE('ST51,'.ST51)
SELECT INPUT(49)
SELECT OUTPUT(51)
ASL=1300
CNEXT=0
DNEXT=0
CNUM=0
NIDFLAG=0
DNUM=1000
READ(NBIP)
L1: READ SYMBOL(I)
IF I=68 THEN ->L3; !'D'
IF I=80 THEN ->L4; !'P'
IF I=69 THEN ->L5; !'E'
->L1
L3: READ SYMBOL(I)
READSTRING(')')
RECORD(DWORD, DLETT, DNUM, DNEXT)
->L1
L4: NEWLINES(2)
PRINTSYMBOL(I)
READSYMBOL(I)
PRINTSYMBOL(I)
READ STRING(')')
PRINT STR(CC, 0)
PRINTSYMBOL(')')
LOOK UP(DWORD, DLETT, 1001+NBIP, DNUM, 0)
KK(I)=ASL
DEF=ASL
ALT=ASL+1
ASL=ASL+2
L6: READ SYMBOL(I)
PRINTSYMBOL(I)
IF I='(' THEN ->L7; !
IF I=M'''' THEN ->LLIT; !'''OR EQUIVALENT
!
IF I=44 THEN ->L9; !','
!
IF I=59 THEN ->L10; !
IF I=48 THEN ->L11; !'0'
!
IF I='*' THEN I=999 AND ->L12
->L6
L7: READ STRING(')')
PRINT STR(CC, 0)
PRINTSYMBOL(')')
LOOK UP(DWORD, DLETT, 1001, DNUM, 0)
L12: SYMBOL(ASL)=I
ASL=ASL+1
->L6
LLIT: READ STRING(M'''')
PRINT STR(CC, 0)
PRINTSYMBOL(M'''')
CYCLE I=1,1,CC(0)
SYMBOL(ASL)=CC(I)
ASL=ASL+1
REPEAT
->L6
L9: SYMBOL(ALT)=ASL
ALT=ASL
ASL=ASL+1
->L6
L10: SYMBOL(ALT)=ASL
SYMBOL(DEF)=ASL
->L1
L11: I=1000
->L12
L5:
PDDICT
CYCLE I=1300, 1, ASL-1
IF 1001+NBIP<=SYMBOL(I)<=DNUM C
THEN SYMBOL(I)=KK(SYMBOL(I))
REPEAT
SS=KK(DNUM)
NEWLINE
CYCLE K=1, 1, 2
SELECT OUTPUT(50) IF K=2
PRINTSTRING('! PRODUCED FROM '.ST49.' BY PSPROG2S ON '.DATE)
PRINTSTRING("
%CONSTINTEGERARRAY SYMBOL(1300:")
WRITE(ASL-1, 1); PRINTSTRING(")=")
CYCLE I=1300, 1, ASL-1
WRITE(SYMBOL(I), 5)
J=','
J=';' IF I=ASL-1
PRINTSYMBOL(J)
NEWLINE IF (I-1299)-((I-1299)//10)*10=1
REPEAT
NEWLINE
PRINTSTRING("%CONSTINTEGER SS=")
WRITE(SS, 1)
NEWLINE
RETURN UNLESS NIDFLAG=0
REPEAT
SELECT OUTPUT(99)
PRINTSTRING("NO ERRORS
")
RETURN
ROUTINE READ STRING(INTEGER TERMINATOR)
INTEGER UNDER; UNDER=0
J=0
L1: READ SYMBOL(I)
IF I='%' THEN UNDER=128 AND ->L1
IF 'A'<=I<='Z' THEN I=I+UNDER ELSE UNDER=0
IF I=32 THEN ->L1; !'_'
!
IF I=TERMINATOR THEN CC(0)=J AND RETURN
J=J+1
CC(J)=I
->L1
END
ROUTINE RECORD(INTEGER ARRAY NAME WORD,LETT, C
INTEGER NAME NUM,NEXT)
NUM=NUM+1
WORD(NUM)=NEXT
CYCLE I=0, 1, CC(0)
LETT(NEXT+I)=CC(I)
REPEAT
NEXT=NEXT+CC(0)+1
END
ROUTINE LOOK UP(INTEGERARRAYNAME WORD, LETT, C
INTEGER FIRST, LAST, INSERT)
I=FIRST
WHILE I<=LAST CYCLE
J=WORD(I)
CYCLE K=0, 1, LETT(J)
IF LETT(J+K)#CC(K) THEN ->LNXT
REPEAT
RETURN
LNXT: I=I+1
REPEAT
IF INSERT=0 THEN START
PRINTSTRING("
****************PHRASE NOT IN DICTIONARY*********** ")
PRINT STR(CC, 0)
NIDFLAG=NIDFLAG+1
RETURN
FINISH
RECORD(WORD, LETT, CNUM, CNEXT)
! INSERT INTO C DICTIONARY
I=CNUM
END
ROUTINE PRINT STR(INTEGERARRAYNAME CC, INTEGER PTR)
INTEGER I, J, K
SS=CC(PTR); K=SS
IF CC(PTR+1)>128 THEN SS=SS+1 AND PRINT SYMBOL('%')
CYCLE I=1, 1, K
PRINT SYMBOL(CC(PTR+I))
REPEAT
END
ROUTINE PDDICT
INTEGER J
NEWLINES(4)
PRINTSTRING(" KEY TO MAIN TABLE (SYMBOL)
")
CYCLE J=1001, 1, DNUM
IF J<=1000+NBIP THEN WRITE(J, 4) ELSE WRITE(KK(J), 4)
SPACES(2)
PRINT STR(DLETT, DWORD(J))
SPACES(17-SS)
NEWLINE IF (J-1000)&3=0
REPEAT
END
END
ENDOFFILE