|
|
1.1 ! root 1: INTEGER FUNCTION EXPR(LOGEX) ! 2: C ! 3: C LOGEX IS A DUMMY ARG , NEVER USED ! 4: C FALSE IF AN ARITHMETIC EXPRESSION WAS FOUND ! 5: C PRE IS PRECEDENCE TABLE, PRE(I,J) GIVES ACTION TAKEN WHEN OP I ! 6: C IS ON THE STACK, OP J IN THE INPUT ! 7: C CUROP IS CURRENT TOKEN TYPE ! 8: C PREVOP IS PREVIOUS TOKEN TYPE (LAST ONE PROCESSED BEFORE CUROP) ! 9: C STACK IS OPERAND STACK GROWING FROM TOP (1,2 ETC) ! 10: C OPERATER STACK GROWING FROM BOTTOM UP(100,99 ETC) ! 11: C PARENS COUNTS NESTING LEVEL OF PARENTHESES AND FUNCTION CALLS ! 12: C ! 13: C*****EXPRS ! 14: C PT (INT) POINTER TO NEXT FREE WORD ON OPERAND STACK (GROWS ! 15: C FROM STACK(1)) ! 16: C PB (INT) POINTER TO NEXT FREE WORD ON OPERATOR STACK (GROWS ! 17: C FROM STACK(LSTACK)) ! 18: C AO(*,*) (INT) ARRAY GIVES TYPES OF ARITH OPERATIONS ! 19: C AO(I,J) = TYPE OF (TYPE I <ARITH-OP> TYPE J) ! 20: C RO(*,*) (INT) ARRAY TELLS LEGALITY OF RELATIONAL OPERATIONS ! 21: C RO(I,J) = 1 IF TYPE I <RELOP> TYPEJ IS LEGAL; ELSE IS 0 ! 22: C EX(*,*) (INT) ARRAY GIVES TYPES OF ** OPERATION ! 23: C EX(I,J) = TYPE OF (TYPE I <**> TYPE J) ! 24: C ! 25: INTEGER PRE(12,12), EX(4,4), AO(4,4), CUROP, PREVOP, RO(3,3), ! 26: * STACK, PARENS, STMT, PSTMT, PT, PB, SYMLEN, PDSA, OUTUT, ! 27: * GETTOK, IBR(14), JBR(13), ADJ(5,4), OUTUT2, DSA, OUTUT3, ! 28: * OUTUT4, PREF, REF ! 29: LOGICAL FLUSH, ERR, SYSERR, CALLST, DOVAR, OPT, ABORT, P1ERR ! 30: LOGICAL INTEXT ! 31: COMMON /DETECT/ ERR, SYSERR, ABORT ! 32: COMMON /CTABL/ LDSA, PDSA, DSA(5000) ! 33: COMMON /EXPRS/ PT, PB, AO, RO, EX ! 34: COMMON /CEXPRS/ LSTACK, STACK(620) ! 35: COMMON /CREF/ LREF, PREF, REF(100) ! 36: COMMON /PARAMS/ INUT, OUTUT, NOCHAR, SYMLEN, OUTUT2, OUTUT3, ! 37: * OUTUT4 ! 38: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327) ! 39: COMMON /OPTNS/ OPT(5), P1ERR ! 40: COMMON /FACTS/ NAME, NOST, ITYP, IASF ! 41: DATA K /0/ ! 42: DATA PRE(1,1) /6/, PRE(1,2) /6/, PRE(1,3) /4/, PRE(1,5) /4/, ! 43: * PRE(1,6) /2/, PRE(1,7) /4/, PRE(1,8) /6/, PRE(1,9) /6/, ! 44: * PRE(1,10) /6/, PRE(1,4) /-1/, PRE(1,11) /6/, PRE(2,1) /-1/, ! 45: * PRE(2,2) /-1/, PRE(2,3) /-1/, PRE(2,5) /-1/, PRE(2,6) /-1/, ! 46: * PRE(2,7) /-1/, PRE(2,8) /-1/, PRE(2,9) /-1/, PRE(2,10) /-1/, ! 47: * PRE(2,4) /-1/, PRE(2,11) /-1/, PRE(3,1) /6/, PRE(3,2) /6/, ! 48: * PRE(3,3) /-1/, PRE(3,5) /4/, PRE(3,6) /2/, PRE(3,7) /6/, ! 49: * PRE(3,8) /6/, PRE(3,9) /6/, PRE(3,10) /6/, PRE(3,4) /-1/, ! 50: * PRE(3,11) /6/, PRE(5,1) /5/, PRE(5,2) /7/, PRE(5,3) /4/, ! 51: * PRE(5,5) /4/, PRE(5,6) /2/, PRE(5,7) /4/, PRE(5,8) /-1/, ! 52: * PRE(5,9) /4/, PRE(5,10) /4/, PRE(5,4) /4/, PRE(5,11) /4/, ! 53: * PRE(6,1) /5/, PRE(6,2) /1/, PRE(6,3) /4/, PRE(6,5) /4/, ! 54: * PRE(6,6) /2/, PRE(6,7) /4/, PRE(6,8) /3/, PRE(6,9) /4/, ! 55: * PRE(6,10) /4/, PRE(6,4) /4/, PRE(6,11) /4/ ! 56: DATA PRE(7,1) /6/, PRE(7,2) /6/, PRE(7,3) /4/, PRE(7,5) /4/, ! 57: * PRE(7,6) /2/, PRE(7,7) /6/, PRE(7,8) /6/, PRE(7,9) /6/, ! 58: * PRE(7,10) /6/, PRE(7,4) /-1/, PRE(7,11) /6/, PRE(8,1) /-1/, ! 59: * PRE(8,2) /-1/, PRE(8,3) /-1/, PRE(8,5) /-1/, PRE(8,6) /-1/, ! 60: * PRE(8,7) /-1/, PRE(8,8) /-1/, PRE(8,9) /-1/, PRE(8,10) /-1/, ! 61: * PRE(8,4) /-1/, PRE(8,11) /-1/, PRE(9,1) /5/, PRE(9,2) /6/, ! 62: * PRE(9,3) /4/, PRE(9,5) /4/, PRE(9,6) /2/, PRE(9,7) /4/, ! 63: * PRE(9,8) /6/, PRE(9,9) /6/, PRE(9,10) /6/, PRE(9,4) /4/, ! 64: * PRE(9,11) /4/, PRE(10,1) /5/, PRE(10,2) /6/, PRE(10,3) /4/, ! 65: * PRE(10,5) /4/, PRE(10,6) /2/, PRE(10,7) /4/, PRE(10,8) /6/, ! 66: * PRE(10,9) /4/, PRE(10,10) /6/, PRE(10,4) /4/, PRE(10,11) /4/, ! 67: * PRE(4,1) /5/, PRE(4,2) /6/, PRE(4,3) /4/, PRE(4,5) /4/, ! 68: * PRE(4,6) /2/, PRE(4,7) /4/, PRE(4,8) /6/, PRE(4,9) /6/, ! 69: * PRE(4,10) /6/, PRE(4,4) /-1/, PRE(4,11) /4/, PRE(11,1) /5/, ! 70: * PRE(11,2) /6/, PRE(11,3) /4/, PRE(11,5) /4/, PRE(11,6) /2/, ! 71: * PRE(11,7) /4/, PRE(11,8) /6/, PRE(11,9) /6/, PRE(11,10) /6/, ! 72: * PRE(11,4) /-1/, PRE(11,11) /6/ ! 73: DATA PRE(12,1), PRE(12,3), PRE(12,7), PRE(12,11) /4*6/, PRE(12,2) ! 74: * /6/, PRE(12,5) /4/, PRE(12,6) /2/, PRE(12,8) /6/, PRE(12,4), ! 75: * PRE(12,9), PRE(12,10) /3*6/, PRE(1,12), PRE(2,12), PRE(3,12), ! 76: * PRE(7,12), PRE(12,12) /5*-1/, PRE(5,12), PRE(6,12), ! 77: * PRE(8,12), PRE(9,12), PRE(10,12), PRE(4,12), PRE(11,12) /7*4/ ! 78: DATA IBR(1), IBR(3), IBR(7), IBR(12) /4*1/, IBR(2) /2/, IBR(4), ! 79: * IBR(11) /2*3/, IBR(9), IBR(10) /2*5/, IBR(8), IBR(5), IBR(6) ! 80: * /3*4/, IBR(13) /2/, IBR(14) /4/, JBR(1), JBR(12) /2*1/, ! 81: * JBR(2), JBR(3), JBR(7), JBR(9), JBR(10), JBR(11), JBR(8) ! 82: * /7*2/, JBR(4) /3/, JBR(5), JBR(6) /2*4/, JBR(13) /4/ ! 83: DATA ADJ(1,1), ADJ(1,2), ADJ(1,3) /3*-1/, ADJ(1,4) /0/, ADJ(2,1), ! 84: * ADJ(2,2) /2*0/, ADJ(2,3), ADJ(2,4) /2*-1/, ADJ(3,1) /1/, ! 85: * ADJ(3,4) /0/, ADJ(3,2), ADJ(3,3) /2*-1/, ADJ(5,1) /1/, ! 86: * ADJ(5,3), ADJ(5,4) /2*0/, ADJ(5,2) /-1/, ADJ(4,1), ADJ(4,3), ! 87: * ADJ(4,4) /3*0/, ADJ(4,2) /-1/ ! 88: C ! 89: C CODES IN OPERAND STACK ! 90: C 0....DOUBLE PRECISION 1....REAL 2....INTEGER ! 91: C 3....COMPLEX 4....LOGICAL 5....HOLLERITH ! 92: C 6....PROCEDURE NAME ! 93: C CODES FOR OPERATORS ! 94: C 11 +,- 12 ) 13 ** 14 .NOT. 15 ( 16 FCN( ! 95: C 17 /,* 18 , 19 .AND. 20 .OR. 21 .EQ. 22 UNARY -,+ ! 96: C ! 97: PB = LSTACK ! 98: PT = 1 ! 99: CALLST = .FALSE. ! 100: PREVOP = -1 ! 101: CUROP = 0 ! 102: PARENS = 0 ! 103: FLUSH = .FALSE. ! 104: EXPR = -1 ! 105: 10 IF (PSTMT.LT.NSTMT .AND. .NOT.CALLST) GO TO 110 ! 106: C ! 107: C FINISH RECOGNITION OF EXPRESSION; POP OPERAND STACK AND RETURN ! 108: C TYPE OF EXPRESSION ! 109: C ! 110: 20 IF (PARENS.EQ.0) GO TO 40 ! 111: 30 CALL ERROR1(37H UNBALANCED PARENTHESES IN EXPRESSION, 37) ! 112: IF (FLUSH) GO TO 530 ! 113: GO TO 80 ! 114: 40 IF (PB.EQ.LSTACK .OR. CALLST) GO TO 60 ! 115: 50 CALL POP ! 116: IF (ERR) GO TO 530 ! 117: IF (PB.LT.LSTACK) GO TO 50 ! 118: 60 IF (PT.NE.3) GO TO 90 ! 119: IF (STACK(1).EQ.0) GO TO 70 ! 120: I = IGATT1(STACK(1),8) ! 121: IF (I.EQ.0) CALL SATT1(STACK(1), 8, 10) ! 122: 70 EXPR = STACK(2) ! 123: 80 PSTMT = K2 ! 124: ERR = .FALSE. ! 125: RETURN ! 126: 90 CALL ERROR1(29H INVALID SYNTAX IN EXPRESSION, 29) ! 127: IF (FLUSH) GO TO 530 ! 128: GO TO 80 ! 129: 100 CALL ERROR1(31H EXPRESSION TOO LONG TO PROCESS, 31) ! 130: GO TO 530 ! 131: C ! 132: C CONTINUING PROCESSING THE EXPRESSION, IDENTIFY NEXT TOKEN, ! 133: C ! 134: 110 CUROP = GETTOK(PSTMT,K2) ! 135: IF (ERR) GO TO 80 ! 136: C ! 137: C SEE END OF EXPRESSION: ")" <ID> OR <LABEL>; GETTOK RETURNS ! 138: C SAME CODES AS THOSE ABOVE EXCEPT 6 IS ID, 16 IS FCN( OR ARRAY ELE ! 139: C ! 140: IF (CUROP.NE.6 .AND. CUROP.NE.2 .AND. CUROP.NE.16 .OR. ! 141: * PREVOP.NE.12) GO TO 120 ! 142: K2 = PSTMT ! 143: GO TO 20 ! 144: C ! 145: C CHECK FOR ADJACENT OPERATORS OR OPERANDS. ! 146: C ! 147: 120 IF (PREVOP.LE.6) GO TO 130 ! 148: I = IBR(PREVOP-10) ! 149: GO TO 140 ! 150: 130 I = IBR(13) ! 151: IF(PREVOP.EQ.(-1)) I = IBR(14) ! 152: 140 IF (CUROP.LE.6) GO TO 150 ! 153: I2 = JBR(CUROP-10) ! 154: GO TO 160 ! 155: 150 I2 = JBR(13) ! 156: 160 IF (I.GE.3 .AND. I2.EQ.1) CUROP = 22 ! 157: IF (ADJ(I,I2)) 170, 190, 180 ! 158: 170 CALL ERROR1(44H ADJACENT PLACEMENT OF OPERATORS OR OPERANDS, 44) ! 159: GO TO 530 ! 160: 180 CALL ERROR1( ! 161: * 54H WARNING - ADJACENT PLACEMENT OF OPERATOR AND UNARY -+, 54) ! 162: 190 IF (CUROP.GT.6 .AND. CUROP.NE.16) GO TO 290 ! 163: IF (CUROP.LT.6) GO TO 280 ! 164: C ! 165: C PROCESS ID OR FCN( OR ARRAY ELEMENT OR ARRAY ! 166: C LOOKUP SYMBOL TABLE ENTRY TO IDENTIFY ARRAYS AND TO IMPLICITLY ! 167: C TYPE IDENTIFIERS IF NECESSARY. ! 168: C ! 169: IF (CUROP.EQ.6) GO TO 200 ! 170: K = LOOKUP(K2-1,.FALSE.) ! 171: GO TO 210 ! 172: 200 K = LOOKUP(K2,.FALSE.) ! 173: 210 IF (SYSERR) GO TO 530 ! 174: I1 = IGATT1(K,1) ! 175: I2 = IGATT1(K,7) ! 176: I3 = IGATT1(K,8) ! 177: C ! 178: C IMPLICITLY TYPE IDENTIFIERS AND FCNS ! 179: C ! 180: IF (I1.GT.0) GO TO 220 ! 181: I1 = 1 ! 182: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2 ! 183: CALL SATT1(K, 1, I1) ! 184: C ! 185: C SEPARATE ARRAY ELEMENT, FCN REFERENCE,ASF REF. ! 186: C ! 187: 220 I1 = MOD(I1,8) ! 188: IF (CUROP.NE.16) GO TO 250 ! 189: IF (I2.EQ.0) GO TO 240 ! 190: C ! 191: C ARRAY ELEMENT--CHECK FOR BEING IN ASF DEF AND PEEL OFF ! 192: C SUBSCRIPTS, CHECKING THEIR NUMBER ! 193: C ! 194: IF (ITYP.NE.31) GO TO 230 ! 195: CALL ERROR1(39H ILLEGAL USE OF ARRAY IN ASF DEFINITION, 39) ! 196: 230 CUROP = I1 ! 197: I1 = CUROP + 16 ! 198: PSTMT = K2 ! 199: CALL SUBS(K2, I2) ! 200: IF (ERR .OR. SYSERR) GO TO 80 ! 201: GO TO 270 ! 202: C ! 203: C PROCESS FCN( OR ASF( REFERENCE; CHECK USAGE TO SEE ! 204: C IF IS A LEGAL FCN OR ASF NAME I.E. IF WAS USED ! 205: C AS A FCN, SUBR, ASF, OR WAS IN AN EXTERNAL STMT. ! 206: C ! 207: 240 IF (I3.EQ.0 .OR. I3.EQ.2 .OR. I3.EQ.5 .OR. I3.EQ.6 .OR. I3.EQ.13 ! 208: * .OR. I3.EQ.14) GO TO 290 ! 209: C ! 210: C ACTUAL USAGE WILL BE DETERMINED BY CODE WHICH ! 211: C STORES CALL TEMPLATE ! 212: C ! 213: CALL ERROR1(18H ILLEGAL USE OF ID, 18) ! 214: GO TO 530 ! 215: C ! 216: C VARIABLE, ARRAY, PROCEDURE NAME ! 217: C ! 218: 250 IF (I2.EQ.0) GO TO 260 ! 219: C ! 220: C ARRAY ! 221: C ! 222: CUROP = I1 ! 223: I1 = CUROP + 8 ! 224: IF (I3.EQ.0) CALL SATT1(K, 8, 10) ! 225: GO TO 270 ! 226: C ! 227: C VARIABLE OR PROCEDURE ! 228: C LEAVE IDS USAGE UNSET ! 229: C THEY WILL BE SET LATER BY APPEARING AS OPERANDS OR BY BEING ! 230: C DEFINED AS FCN OR SUBROUTINE REFS BY FOLLOWING PGMS ! 231: C ! 232: 260 IF (I3.EQ.0) GO TO 270 ! 233: IF (I3.EQ.5 .OR. I3.EQ.6 .OR. I3.EQ.13) I1 = 6 ! 234: IF (I3.EQ.10 .OR. I1.EQ.6) GO TO 270 ! 235: IF (ITYP.EQ.31 .AND. I3.EQ.1 .AND. DSA(K+2).EQ.IASF) GO TO 270 ! 236: CALL ERROR1(36H ILLEGAL VARIABLE USED IN EXPRESSION, 36) ! 237: GO TO 530 ! 238: C ! 239: C ENTER ARRAY,ID, PROCEDURE NAME, ARRAY ELEMENT INTO OPERAND STACK ! 240: C UPDATE PREVOP,PSTMT. ALSO ENTER SYMBOL TABLE INDEX FOR THESE ! 241: C PREVOP = 0,1,...6 FOR OPERANDS ! 242: C 11,12,...22 FOR OPERATORS ! 243: C ! 244: 270 IF (PT+2.GE.PB) GO TO 100 ! 245: STACK(PT) = K ! 246: STACK(PT+1) = I1 ! 247: PT = PT + 2 ! 248: PREVOP = CUROP ! 249: PSTMT = K2 ! 250: GO TO 10 ! 251: C ! 252: C ARE PROCESSING A CONSTANT ! 253: C ! 254: 280 I1 = CUROP ! 255: K = 0 ! 256: GO TO 270 ! 257: C ! 258: C ARE PROCESSING AN OPERATER ! 259: C PRE(I,J) CONTAINS ACTION TAKEN GIVEN OPERATOR I ON STACK ! 260: C AND OPERATOR J IN INPUT ! 261: C ! 262: 290 KNAME = K ! 263: IF (CUROP.EQ.15 .OR. CUROP.EQ.16) PARENS = PARENS + 1 ! 264: IF (CUROP.EQ.12) PARENS = PARENS - 1 ! 265: IF (PARENS.GE.0) GO TO 300 ! 266: FLUSH = .TRUE. ! 267: GO TO 30 ! 268: C ! 269: C CHECKS FOR LEADING UNARY +,- IN EXPRESSIONS ! 270: C ! 271: 300 IF (PB.EQ.LSTACK) GO TO 460 ! 272: I = STACK(PB+1) - 10 ! 273: I2 = CUROP - 10 ! 274: K = PRE(I,I2) ! 275: 310 IF (-1.NE.K) GO TO 320 ! 276: FLUSH = .TRUE. ! 277: GO TO 90 ! 278: 320 GO TO (330, 470, 520, 480, 480, 490, 510), K ! 279: C ! 280: C CREATE TEMPLATE FROM FCN CALL ! 281: C ! 282: 330 IF (ITYP.EQ.18 .AND. PARENS.EQ.0) CALLST = .TRUE. ! 283: L1 = STACK(PB+2) ! 284: L2 = PT - 1 ! 285: C ! 286: C CHECK FOR NO ARGS ! 287: C ! 288: IF (L2.GT.L1) GO TO 340 ! 289: CALL ERROR1(18H MISSING ARGUMENTS, 18) ! 290: GO TO 450 ! 291: C ! 292: C CHECK FOR NOT CHANGING THROUGH SUBROUTINE CALL THE DO CONTROL ! 293: C VARIABLE OF A CURRENT LOOP OR ANY ADJUSTIBLE DIMENSION DUMMY ARG ! 294: C ! 295: 340 DO 380 I=L1,L2,2 ! 296: IF (STACK(I)) 350, 380, 350 ! 297: 350 IF (DOVAR(STACK(I))) STACK(I+1) = STACK(I+1) + 32 ! 298: I1 = IGATT1(STACK(I),4) ! 299: IF (I1) 380, 380, 360 ! 300: 360 I1 = IGATT1(STACK(I),6) ! 301: IF (I1) 380, 380, 370 ! 302: 370 STACK(I+1) = STACK(I+1) + 64 ! 303: 380 CONTINUE ! 304: C ! 305: C CHECK FOR USE OF ID AS FCN ONCE AND AS SUBROUTINE LATER ! 306: C OR VICE VERSA ! 307: C ! 308: I = STACK(PB+3) ! 309: L = IGATT1(I,8) ! 310: IF (L.EQ.2 .OR. L.EQ.5 .OR. L.EQ.6) GO TO 410 ! 311: IF (.NOT.INTEXT(I,L1,L2,.TRUE.)) GO TO 390 ! 312: C ! 313: C FOUND AN INTRINSIC FCN ! 314: C CHECK NOT IN A CALL STMT USED AS A SUBROUTINE ! 315: C ! 316: IF (CALLST) GO TO 420 ! 317: GO TO 450 ! 318: C ! 319: C DEFINE FCN( USAGE IF UNSET ! 320: C SET USAGE OF ID USED AS A PROC ! 321: C ! 322: 390 IF (CALLST) GO TO 400 ! 323: CALL SATT1(I, 8, 5) ! 324: GO TO 430 ! 325: 400 CALL SATT1(I, 8, 6) ! 326: GO TO 430 ! 327: C ! 328: C CHECK USAGE OF PROC ALREADY USED IN PROGRAM UNIT ! 329: C ! 330: 410 IF (CALLST .AND. L.EQ.6 .OR. .NOT.CALLST .AND. (L.EQ.5 .OR. ! 331: * L.EQ.2)) GO TO 430 ! 332: 420 CALL ERROR1(18H ILLEGAL REFERENCE, 18) ! 333: GO TO 450 ! 334: 430 IF (.NOT.OPT(3) .OR. P1ERR) GO TO 450 ! 335: C ! 336: C LOAD INTO STACK COUNT OF WORDS IN DESCRIPTOR, INDEX OF FCN ! 337: C IN SYMBOL TABLE, STMT NO OF REFERENCE ! 338: C ! 339: IF (PT+3.GE.PB) GO TO 100 ! 340: STACK(PT) = PT - STACK(PB+2) ! 341: STACK(PT+1) = STACK(PB+3) ! 342: STACK(PT+2) = NOST ! 343: STACK(PT+3) = 6 - IGATT1(STACK(PB+3),8) ! 344: L3 = PT + 3 ! 345: ICOD = 2 ! 346: L = L2 - L1 + 5 ! 347: IF (L.LE.LREF) GO TO 440 ! 348: CALL ERROR1(44H IN EXPR, TABLE OVERFLOW OF REF, REF IGNORED, 44) ! 349: GO TO 450 ! 350: 440 WRITE (OUTUT3) L, ICOD, (STACK(I),I=PT,L3), (STACK(I),I=L1,L2) ! 351: C ! 352: C FCN REF POPPED AND PROPER TYPE PUT ON OPERAND STACK ! 353: C ! 354: 450 PT = STACK(PB+2) ! 355: I1 = IGATT1(STACK(PB+3),1) ! 356: STACK(PT) = 0 ! 357: STACK(PT+1) = MOD(I1,8) ! 358: PT = PT + 2 ! 359: PB = PB + 3 ! 360: GO TO 520 ! 361: C ! 362: C HANDLES FIRST OPERATOR IN EXPRESSION--WILL ALWAYS BE PUSHED ONTO ! 363: C OPERATOR STACK. FCN( HAS SPECIAL PUSH. ! 364: C ! 365: 460 IF (CUROP.NE.16) GO TO 480 ! 366: C ! 367: C FOUND "FCN(" CONSTRUCT ; STORE 3 THINGS IN STACK ! 368: C PTR TO FCN NAME IN SYMBOL TABLE; PTR TO 1ST ARGE IN STACK ; ! 369: C OPERAND CODE FOR FCN( ! 370: C ! 371: 470 IF (PB-3.LE.PT) GO TO 100 ! 372: STACK(PB) = KNAME ! 373: STACK(PB-1) = PT ! 374: STACK(PB-2) = CUROP ! 375: PB = PB - 3 ! 376: GO TO 520 ! 377: C ! 378: C SIMPLE PUSH ONTO OPERATOR STACK ! 379: C ! 380: 480 IF (PB-1.EQ.PT) GO TO 100 ! 381: STACK(PB) = CUROP ! 382: PB = PB - 1 ! 383: GO TO 520 ! 384: C ! 385: C POP OPERATOR FROM STACK. IF STACK EMPTY, PUSH CUROP ONTO ! 386: C STACK. ELSE TAKE ACTION SPECIFIED BY PRE(TOP OPERATOR,CUROP). ! 387: C ! 388: 490 CALL POP ! 389: IF (ERR) GO TO 530 ! 390: IF (PB.LT.LSTACK) GO TO 500 ! 391: GO TO 480 ! 392: 500 I = STACK(PB+1) - 10 ! 393: K = PRE(I,CUROP-10) ! 394: GO TO 310 ! 395: C ! 396: C POP "(" WHEN HAVE FINISHED A PARENTHESIZED EXPRESSION ! 397: C ! 398: 510 CALL POP ! 399: IF (ERR) GO TO 530 ! 400: C ! 401: C UPDATE PREVOP,PSTMT AFTER FINISHING PROCESSING AN OPERATOR ! 402: C ! 403: 520 PREVOP = CUROP ! 404: PSTMT = K2 ! 405: GO TO 10 ! 406: C ! 407: C JOB OF THIS CODE IS TO FLISH TO END OF UNRECOGNIZABLE ! 408: C EXPRESSION ! 409: C ! 410: 530 K2 = PSTMT ! 411: ERR = .FALSE. ! 412: 540 IF (K2.GE.NSTMT) GO TO 80 ! 413: IF (STMT(K2).EQ.65) PARENS = PARENS + 1 ! 414: IF (STMT(K2).NE.62) GO TO 550 ! 415: PARENS = PARENS - 1 ! 416: IF (PARENS.EQ.0) GO TO 560 ! 417: 550 K2 = K2 + 1 ! 418: GO TO 540 ! 419: 560 I = GETTOK(K2,I2) ! 420: K2 = I2 ! 421: IF ((I.EQ.1 .OR. I.EQ.6) .OR. ERR) GO TO 80 ! 422: GO TO 540 ! 423: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.