CLA STA T NO. OF WORDS ON STACK 1 STA ACC ACC =0 STA TACC TACC =0 STA EQFLG EQFEG =0 (NO'='OP. ALLOWED) CCA STA PRIOR INITIALIZE PRIORITY TO -1. STA OPCOD INITIALIZE OPCOD TO -1. STA LASTC SET PREVIOUS TC TO -1 AS A FLAG. * * INITIALIZE TEMP CELL BASE NAMES * LDA KM7 STA MCNT MOVE 7 WORDS LDA PPNK4 FROM LOC. ELA,CLE,ERA LDA A,I LDB EEK1 TO LOC. ELB,CLE,ERB LDB B,I JSB MOVE MOVE .INT. TO T.INT , ETC. * * * ENTRY SECTION * * LDB TYPEX (B) = TYPE OF INPUT EXPRESSION. CCA CPB KM2 IF INPUT EXPRESSION IS DO INITIAL STA EQFLG SET EQFLG = -1. CPB KM6 IF INPUT EXPRESSION IS ASSIGN ST. STA EQFLG SET EQFLG = -1. LDA IM SAVE IM OF POSSIBLE STATEMENT STA T1EE FUNCTION NAME IN T1EE. LDA SRPL SAVE RPL AT BEGINNING OF POSSIBLE STA T2EE STATEMENT FUNCTION CODE LDA INT CPB KM5 IF INPUT EXPRESSION IS GO TO IND RSS CPB KM4 IF INPUT EXPRESSION IS DO PARAM, JSB ATC00 ALLOCATE INTEGER TEMP FOR STB T3EE POSSIBLE USE AND SAVE A.T.PTR. LDB TYPEX CPB KM7 IF INPUT EXPRESSION IS AN IF, JMP EE11 GO STACK '(' AND CONTINUE PROC. CPB KM6 IF INPUT EXP. IS ASSIGNMENT STATE, JMP EE035 PROCESS ITEMS ALREADY SCANNED CPB KM2 SAME AS ABOVE FOR DO INIT. PARAM. JMP EE035 CPB KM3 SAME AS ABOVE FOR ARRAY ELEMENT JMP EE035 IN I/O LIST. CPB KM1 IF A SUBROUTINE CALL RSS JMP EE030 LDA TC CPA B50 IS TC A LEFT PARENTHESIS? JMP EE035 YES - PROCESS WITH ARG LIST. LDA JSB OUTPUT JSB INSTRUCTION JSB OA00 CLA CLB,INB OUTPUT DEF *+1 JSB OZ00 LDA RETPT CMA MAKE POSITIVE NOW JMP A,I * PPNK4 DEF .INT. EEK1 DEF T.INT KM1 OCT -1 KM2 OCT -2 KM3 OCT -3 KM4 OCT -4 KM6 OCT -6 KM7 OCT -7 B50 OCT 50 * * ************** * * INPUT ITEM * * ************** * II00 NOP JSB IDN00 INPUT DNA SZA IM=0,POSSIBLE ERROR JSB AI00 ASSIGN ITEM JMP II00,I * * * EEEX LDB TYPEX (B) = TYPE OF INPUT EXPRESSION CPB KM6 IF ASSIGNMENT STATEMENT, JMP RETPT,I FINISHED CPB KM2 IF DO INITIAL PARAMETER, JMP RETPT,I FINISHED CPB KM1 IF CALL STATEMENT, JMP EE61 CPB KM3 ARRAY ELEMENT IN I/O LIST RSS JMP SEG.F FINISH UP IN SEGMENT F EE61 JSB II00 INPUT TERMINATING CHARACTER. SZA IF IM = 0, JMP EE10 NO, MISSING DELIMITER LDA STK1T,I (A)=PTR TO TEMP CELL WITH ADDR. JMP RETPT,I EXIT FROM EXP EVALUATOR * EE10 LDA K53 ILLEGAL DELIMITER OR JSB ER00 MISSING OPERAND K53 DEC 53 * * * **************** * * PUSH STACK 1 * * **************** * * * STACK 1 IS THE OPERAND STACK. IT IS IN HIGH CORE, JUST * BELOW THE DO TABLE, AND GROWS TOWARD LOW CORE. THIS * ROUTINE IS ENTERED WITH (A) = WORD TO BE STACKED. * (A) = .A GENERALLY EXCEPT THAT * (A) = .A,I FOR SUB OR ARRAY WITH (LIST) * (A) = 0 IF OPERAND IS IN REGISTER(S). * * IF (A) = 0, THEN TTYPE = IM OF REGISTERS * * (A) AND (B) ARE NOT DESTROYED BY THIS SUBROUTINE * PU100 NOP PUSH STACK 1 TO STACK OPERANDS. STB T0PU1 SAVE B REGISTER. CCB ADB T STB T T=T-1 ADB STK1B STB STK1T NEW PTR TO TOP OPERAND ON STK1. CPB STK2T IF 2 TOP POINTERS THE SAME, JMP DPOVF DATA POOL OVERFLOW SZA,RSS IF (A)=0, OPERAND IS IN REGISTERS, STB ACC SO SET ACC TO POINT TO STACK ENTRY. INB STB STK1N NEW PTR TO NEXT-TO-TOP OPERAND. STA STK1T,I STORE OPERAND ON STACK. LDB TTYPE SZA,RSS IF (A)=0, OPERAND IS IN REGISTERS, STB TACC SO SET TACC = TYPE OF REG. CONTENT LDB ACC CMB,INB ADB STK1N (B)= STK1N-ACC. SSB IF (B) < 0, REG. CONTENTS BELOW JSB GST00 STK1N, SO GENERATE STORE IN TEMP LDB T0PU1 RESTORE B REGISTER. JMP PU100,I RETURN * DPOVF LDA K3 JSB ER00 * T0PU1 NOP * * *************** * * POP STACK 1 * * *************** * PO100 NOP TO UNSTACK AND DISCARD OPERANDS. LDB T ADB PNUM ADD NO. OF ENTRIES TO BE POPPED STB T FROM STACK TO T. ADB STK1B STB STK1T NEW PTR TO TOP OPERAND ON STK1. INB STB STK1N NEW PTR TO NEXT-TO-TOP OPERAND. CLB IN CASE REGISTER OPERAND WAS STB ACC POPPED FROM STACK, SET ACC AND STB TACC TACC TO 0. JMP PO100,I RETURN. * * *************** * * POP STACK 2 * * *************** * PO200 NOP TO UNSTACK AND DISACARD OPERATORS CCB ADB L STB L L=L-1 ADB STK2B STB STK2T NEW PTR TO TOP OPERATOR CCB STB PRIOR REINITIALIZE OPCODE AND PRIOR TO 0. STB OPCOD LDB L CPB SAVEL IS OPERATOR STACK EMPTY? RSS YES,EXIT JSB SCP00 NO, UPDATE OPCOD, PRIOR OF TOP OP. JMP PO200,I RETURN. * * OPERATOR TABLE - 3 WORD ENTRIES * * WORD 1: THE OPERATOR * WORD 2: ITS PRIORITY * WORD 3: ADDRESS OF ROUTINE TO GENERATE ITS CODE * OPTBL DEF * * OCT 75 =, OCT 0 PRIORITY=0, CODE=1 DEF AO00 * OCT 53 +, OCT 7 PRIORITY=7, CODE=2 DEF ADD00 * OCT 55 -, OCT 7 PRIORITY=7, CODE=3 DEF SUB00 * OCT 40 UNARY - (BLANK) K8 OCT 10 PRIORITY=8, CODE=4 DEF NEG00 * OCT 52 *, OCT 11 PRIORITY=9, CODE=5 DEF MPY00 * OCT 57 /, OCT 11 PRIORITY=9, CODE=6 DEF DIV00 * ASC 1,** **, OCT 12 PRIORITY=10, CODE=7 DEF EXP00 * ASC 1,OR LOGICAL OR, K3 OCT 3 PRIORITY=3, CODE=8 DEF L.OR * ASC 1,AN LOGICAL AND OCT 4 PRIORITY=4, CODE=9 DEF L.AND * ASC 1,NO LOGICAL NOT, OCT 5 PRIORITY=5, CODE=10 DEF L.NOT * ASC 1,LT RELATIONAL LESS THAN, OCT 6 PRIORITY=6, CODE=11 DEF R.LT * ASC 1,LE RELATIONAL LESS OR EQUAL TO, OCT 6 PRIORITY=6, CODE=12 DEF R.LE * ASC 1,EQ RELATIONAL EQUAL, OCT 6 PRIORITY=6, CODE=13 DEF R.EQ * ASC 1,NE RELATIONAL NOT EQUAL, OCT 6 PRIORITY=6, CODE=14 DEF R.NE * ASC 1,GE RELATIONAL GREATER OR EQUAL TO, OCT 6 PRIORITY=6, CODE=15 DEF R.GE * ASC 1,GT RELATIONAL GREATER THAN, OCT 6 PRIORITY=6, CODE=16 DEF R.GT * END FTN42 24170-80010 C