|
|
1.1 ! root 1: LOGICAL FUNCTION ARDECL(K2, KK) ! 2: C ! 3: C K2 IS INDEX OF END OF ARRAY DECLARATOR IN STMT ! 4: C KK IS SYMBOL TABLE INDEX FOR THIS ARRAY ! 5: C PROCESSES ARRAY DECLARATOR AND DECLARATOR CONSTRUCTS. ! 6: C CAN EXPECT ARRAY DECLARATOR, ARRAY ELEMENT; ARRAY, VARIABLE. ! 7: C ENTERS INTO SYMBOL TABLE AND TYPES ID; SETS USAGE ON ARRAY ! 8: C DECLARATOR ! 9: C CHECKS SYNTAX OF BOUNDS; IF VARIABLY DIMENSIONED, BOUNDS ! 10: C VARIABLE AND ARRAY ITSELF MUST BE DUMMY ARGUMENTS. ! 11: C ACCUMULATES TOTAL LENGTH OF ARRAY WITH CONSTANT BOUNDS AND STORES ! 12: C IT OFF ARRAY SYMBOL TABLE ENTRY. -1 LENGTH INDICATES VARIABLE ! 13: C DIMENSION ! 14: C CALLED BY DIMENSION, TYPE, COMMON, EQUIVALENCE, DATA STMT. ! 15: C ! 16: C ARRY IS TRUE FOR ARRAY ELEMENTS/ARRAY DECLARATORS ! 17: C FALSE FOR ARRAYS AND VARIABLES ! 18: C CORNER IS TRUE FOR ARRAY ELEMENTS WITH (1,1,1)--NEEDED IN EQUIV. ! 19: C STMT ; IF SUCH AN ELEMENT IS RECOGNIZED KK IS SENT AS ITS ! 20: C NEGATIVE. ! 21: C ! 22: LOGICAL ERR, SYSERR, ABORT, TOKPNO, VAR, CORNER, ARRY, FLUSH ! 23: INTEGER STMT, PSTMT, PDSA, BNEXT, SYMHD, DSA ! 24: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327) ! 25: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT ! 26: COMMON /CTABL/ LDSA, PDSA, DSA(5000) ! 27: COMMON /FACTS/ NAME, NOST, ITYP, IASF ! 28: COMMON /DETECT/ ERR, SYSERR, ABORT ! 29: ERR = .FALSE. ! 30: FLUSH = .FALSE. ! 31: ARRY = .FALSE. ! 32: CORNER = .TRUE. ! 33: ARDECL = .FALSE. ! 34: C ! 35: C CHECK NAME; CAN'T HAVE BEEN USED PREVIOUSLY AS A NONVAR; ! 36: C CHECK TO SEE IF HAVE ARRAY ELEMENT/ARRAY DECLARATOR. IF SO ! 37: C ARRY=.TRUE. ! 38: C ! 39: ICNT = 0 ! 40: CALL NEXTOK(PSTMT, K2, I1) ! 41: IF (I1.EQ.0) GO TO 10 ! 42: CALL ERROR1(20H ILLEGAL PUNCTUATION, 20) ! 43: ERR = .TRUE. ! 44: GO TO 280 ! 45: 10 IF (STMT(K2).EQ.65) ARRY = .TRUE. ! 46: KK = LOOKUP(K2,.FALSE.) ! 47: IF (SYSERR) GO TO 70 ! 48: ARDECL = .TRUE. ! 49: L = IGATT1(KK,8) ! 50: IF (L.EQ.0 .OR. L.EQ.10) GO TO 30 ! 51: IF (ITYP.LT.6 .AND. L.EQ.13) GO TO 30 ! 52: 20 CALL ERROR1(45H ILLEGAL USE OF PREVIOUSLY DEFINED IDENTIFIER, 45) ! 53: ERR = .TRUE. ! 54: GO TO 280 ! 55: C ! 56: C SET TYPE (EXPLICITLY FOR TYPE STMTS) ! 57: C ! 58: 30 I1 = IGATT1(KK,1) ! 59: IF (ITYP.GE.6) GO TO 50 ! 60: C ! 61: C TYPE EXPLICITLY ! 62: C ! 63: IF (I1.GE.8) GO TO 40 ! 64: CALL SATT1(KK, 1, ITYP+7) ! 65: GO TO 60 ! 66: 40 CALL ERROR1(34H IDENTIFIER TYPED EXPLICITLY TWICE, 34) ! 67: GO TO 60 ! 68: C ! 69: C TYPE IMPLICITLY ! 70: C ! 71: 50 IF (I1.GT.0) GO TO 60 ! 72: I1 = 1 ! 73: IF (STMT(PSTMT).GE.38 .AND. STMT(PSTMT).LE.43) I1 = 2 ! 74: CALL SATT1(KK, 1, I1) ! 75: C ! 76: C IF NOT ARRAY ELEMENT/ARAY DECLARATOR--RECOGNITION COMPLETE ! 77: C ! 78: C CHECK NOT A DUMMY ARG IN COMMON, DATA, EQUIV STMT ! 79: C ! 80: 60 IF (ARRY) GO TO 80 ! 81: IF (IGATT1(KK,7).EQ.0) GO TO 65 ! 82: IF (ITYP.EQ.12) ! 83: 1 CALL ERROR1(46H WARNING - ILLEGAL USE OF ARRAY IN EQUIVALENCE ! 84: 2 , 46) ! 85: IF (ITYP.EQ.13) ! 86: 1 CALL ERROR1(39H WARNING - ILLEGAL USE OF ARRAY IN DATA, 39) ! 87: 65 CONTINUE ! 88: I1 = IGATT1(KK,4) ! 89: IF (.NOT.(I1.EQ.1 .AND. (ITYP.EQ.8 .OR. ITYP.EQ.12 .OR. ! 90: * ITYP.EQ.13))) GO TO 70 ! 91: ERR = .TRUE. ! 92: CALL ERROR1(32H ILLEGAL USAGE OF DUMMY ARGUMENT, 32) ! 93: 70 RETURN ! 94: 80 ISIZ = 1 ! 95: VAR = .FALSE. ! 96: IF (L.EQ.0) CALL SATT1(KK, 8, 10) ! 97: C ! 98: C LOOP TO FIND BOUNDS; CHECK THAT VARIABLE BOUNDS ARE DUMMY ARGS ! 99: C SET ADJUSTIBLE DIMENSION VARIABLE BIT; SET TYPE IMPLICITLY IF NOT ! 100: C ALREADY SET ! 101: C ACCUMULATE LENGTH IF IN DIMENSION, COMMON, OR TYPE STMT. ! 102: C CHECK FOR REPEAT DIMENSIONING IN THOSE STMTS ! 103: C ! 104: L = IGATT1(KK,7) ! 105: IF (ITYP.EQ.13 .OR. ITYP.EQ.12) GO TO 90 ! 106: IF (L.EQ.0) GO TO 100 ! 107: CALL ERROR1(44H ILLEGAL USE OF PREVIOUSLY DIMENSIONED ARRAY, 44) ! 108: ERR = .TRUE. ! 109: GO TO 270 ! 110: 90 IF (L.EQ.0) CALL ERROR1( ! 111: * 44H ILLEGAL USE OF ARRAY NOT PREVIOUSLY DEFINED, 44) ! 112: 100 IF (K2+1.LT.NSTMT) GO TO 120 ! 113: 110 CALL ERROR1(28H ILLEGAL ARRAY BOUNDS SYNTAX, 28) ! 114: GO TO 270 ! 115: C ! 116: C CHECK FOR POSITIVE INTEGER BOUND ! 117: C ! 118: 120 PSTMT = K2 + 1 ! 119: IF (.NOT.TOKPNO(PSTMT,I1,LL)) GO TO 130 ! 120: IF (ITYP.EQ.7 .OR. ITYP.EQ.8 .OR. ITYP.LT.6) ISIZ = ISIZ*LL ! 121: IF (ITYP.NE.12) GO TO 170 ! 122: IF (I1-K2.NE.2 .OR. STMT(PSTMT).NE.1) CORNER = .FALSE. ! 123: GO TO 170 ! 124: C ! 125: C SEEK A VARIABLE BOUND ! 126: C ! 127: 130 CALL NEXTOK(PSTMT, I1, L) ! 128: IF (L.NE.0) GO TO 110 ! 129: IF (ITYP.LT.6 .OR. ITYP.EQ.7) GO TO 140 ! 130: CALL ERROR1(32H VARIABLE DIMENSION ILLEGAL HERE, 32) ! 131: ERR = .TRUE. ! 132: GO TO 270 ! 133: 140 VAR = .TRUE. ! 134: L = LOOKUP(I1,.FALSE.) ! 135: IF (SYSERR) GO TO 70 ! 136: N = IGATT1(L,8) ! 137: IF (N.NE.0 .AND. N.NE.10) GO TO 20 ! 138: I2 = IGATT1(L,4) ! 139: IF (I2.EQ.1) GO TO 150 ! 140: CALL ERROR1(42H ILLEGAL USAGE OF VARIABLE IN ARRAY BOUNDS, 42) ! 141: ERR = .TRUE. ! 142: GO TO 270 ! 143: 150 I2 = IGATT1(KK,4) ! 144: IF (I2.EQ.1) GO TO 160 ! 145: CALL ERROR1(50H VARIABLY DIMENSIONED ARRAY MUST BE DUMMY ARGUMENT, ! 146: * 50) ! 147: ERR = .TRUE. ! 148: GO TO 270 ! 149: 160 CALL SATT1(L, 6, 1) ! 150: CALL SATT1(L, 8, 10) ! 151: N = IGATT1(L,1) ! 152: IF (N.GT.0) GO TO 170 ! 153: N = 1 ! 154: IF (STMT(K2+1).GE.38 .AND. STMT(K2+1).LE.43) N = 2 ! 155: CALL SATT1(L, 1, N) ! 156: GO TO 170 ! 157: C ! 158: C FIND "," AND ACCUMULATE LENGTH ! 159: C ! 160: 170 ICNT = ICNT + 1 ! 161: IF (ICNT.LE.3) GO TO 180 ! 162: ISIZ = ISIZ/LL ! 163: CALL ERROR1(30H WARNING - TOO MANY SUBSCRIPTS, 30) ! 164: ICNT = 3 ! 165: FLUSH = .TRUE. ! 166: GO TO 190 ! 167: 180 K2 = I1 ! 168: IF (STMT(K2).EQ.68) GO TO 100 ! 169: C ! 170: C FIND ")" STORE LENGTH OR -1 INTO ARRAY SYMBOL TABLE ELEMENT ! 171: C ! 172: IF (STMT(K2).NE.62) GO TO 110 ! 173: 190 IF (ITYP.EQ.13 .OR. ITYP.EQ.12) GO TO 260 ! 174: CALL SATT1(KK, 7, ICNT) ! 175: C ! 176: C STORE LENGTH OF ARRAY ! 177: C ! 178: IF (VAR) GO TO 240 ! 179: IF (DSA(KK+2).EQ.0) GO TO 200 ! 180: N = DSA(KK+2) ! 181: DSA(N) = ISIZ ! 182: GO TO 220 ! 183: 200 IF (NEXT+2.GE.BNEXT) GO TO 210 ! 184: DSA(KK+2) = NEXT ! 185: DSA(NEXT) = ISIZ ! 186: DSA(NEXT+1) = 0 ! 187: NEXT = NEXT + 2 ! 188: GO TO 220 ! 189: 210 SYSERR = .TRUE. ! 190: CALL ERROR1(33H IN ARDECL, TABLE OVERFLOW OF DSA,33) ! 191: 220 IF (FLUSH) GO TO 270 ! 192: 230 K2 = K2 + 1 ! 193: GO TO 70 ! 194: C ! 195: C FIXUP FOR VARIABLY DIMENSIONED ARRAYS ! 196: C ! 197: 240 IF (DSA(KK+2).EQ.0) GO TO 250 ! 198: N = DSA(KK+2) ! 199: DSA(N) = -1 ! 200: GO TO 220 ! 201: 250 IF (NEXT+2.GE.BNEXT) GO TO 210 ! 202: DSA(KK+2) = NEXT ! 203: DSA(NEXT) = -1 ! 204: DSA(NEXT+1) = 0 ! 205: NEXT = NEXT + 2 ! 206: GO TO 220 ! 207: C ! 208: C CHECK FORCORNER ELEMENT IN EQUIVALENCE STMT ! 209: C ! 210: 260 IF (ITYP.NE.12) GO TO 220 ! 211: IF (CORNER) KK = -KK ! 212: GO TO 220 ! 213: C ! 214: C CODE TO FLUSH CONSTRUCT--TO NEXT ")" ! 215: C ! 216: 270 IF (K2.EQ.NSTMT) GO TO 70 ! 217: IF (STMT(K2).EQ.62) GO TO 230 ! 218: K2 = K2 + 1 ! 219: GO TO 270 ! 220: C ! 221: C CODE TO FLUSH TO NEXT CONSTRUCT ")",",", "/" ! 222: C ! 223: 280 K = 90 ! 224: IF (ITYP.EQ.8 .OR. ITYP.EQ.13) K = 67 ! 225: 290 IF (K2.EQ.NSTMT) GO TO 70 ! 226: L = STMT(K2) ! 227: IF (L.EQ.65) GO TO 270 ! 228: IF (L.EQ.68 .OR. L.EQ.K) GO TO 70 ! 229: K2 = K2 + 1 ! 230: GO TO 290 ! 231: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.