|
|
1.1 root 1: SUBROUTINE ASSASF(IGP)
2: INTEGER STMT, PSTMT, PDSA, EXPR, DSA, BNEXT, SYMHD
3: LOGICAL ERR, SYSERR, ABORT, ASF, DOVAR
4: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327)
5: COMMON /DETECT/ ERR, SYSERR, ABORT
6: COMMON /FACTS/ NAME, NOST, ITYP, IASF
7: COMMON /CTABL/ LDSA, PDSA, DSA(5000)
8: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT
9: C
10: C PROCESSES ARITHMETIC STMT FCNS AND ASSIGNMENT STMTS
11: C FIRST LOOKS FOR ELEMENT ON RHS. AND TYPES IT
12: C
13: CALL NEXTOK(PSTMT, K2, K)
14: ASF = .FALSE.
15: IF (K.NE.0) GO TO 180
16: K = LOOKUP(K2,.FALSE.)
17: IF (SYSERR) GO TO 190
18: I1 = IGATT1(K,1)
19: IF (I1.NE.0) GO TO 10
20: I1 = 1
21: IF (STMT(PSTMT).LE.43 .AND. STMT(PSTMT).GE.38) I1 = 2
22: CALL SATT1(K, 1, I1)
23: C
24: C LOOK FOR A "(" ; FIND ARRAY = CASE AND SEND IT TO ERROR
25: C FIND ARRAY ELEMENT = , ID = CASES AND SEND THEM TO
26: C ASSIGNMENT CODE
27: C
28: 10 I2 = IGATT1(K,7)
29: I1 = MOD(I1,8)
30: IF (STMT(K2).NE.65 .AND. I2.NE.0) GO TO 180
31: IF (STMT(K2).NE.65 .OR. I2.NE.0) GO TO 240
32: C
33: C ASF DEFN
34: C
35: ITYP = 31
36: ASF = .TRUE.
37: IGP = 4
38: NUM = 0
39: IASF = K
40: 20 PSTMT = K2 + 1
41: IF (PSTMT.GE.NSTMT) GO TO 180
42: C
43: C ASF HAS LIST OF SCALAR VARIABLES; THEY ARE TYPED AND USAGE SET
44: C
45: CALL NEXTOK(PSTMT, K2, I)
46: IF (I.EQ.0) GO TO 30
47: CALL ERROR1(17H ILLEGAL ASF DEFN, 17)
48: GO TO 190
49: 30 I = LOOKUP(K2,.FALSE.)
50: IF (SYSERR) GO TO 190
51: NUM = NUM + 1
52: I2 = IGATT1(I,1)
53: IF (I2.GT.0) GO TO 40
54: I2 = 1
55: IF (STMT(PSTMT).LE.43 .AND. STMT(PSTMT).GE.38) I2 = 2
56: CALL SATT1(I, 1, I2)
57: 40 I2 = IGATT1(I,8)
58: IF (I2.EQ.0) GO TO 50
59: IF (I2.EQ.1) GO TO 60
60: CALL ERROR1(29H ILLEGAL VARIABLE IN ASF DEFN, 29)
61: GO TO 210
62: 50 CALL SATT1(I, 8, 1)
63: C STORE PTR TO CURRENT ASF-FCN ENTRY IN SYMBOL
64: C TABLE IN 3D WORD OF ASF-DUMMY ENTRY IN SYM TABLE
65: 60 DSA(I+2) = K
66: C
67: C LIST OF INDICES OF ASF ARGS IS HUNG OFF OF ASF DEF IN DSA
68: C
69: IF (DSA(K+2).EQ.0) GO TO 120
70: L = DSA(K+2)
71: 70 IF (DSA(L+1).EQ.0) GO TO 80
72: L = DSA(L+1)
73: GO TO 70
74: 80 IF (NEXT+2.LT.BNEXT) GO TO 100
75: 90 CALL ERROR1(33H IN ASSASF, TABLE OVERFLOW OF DSA, 33)
76: SYSERR = .TRUE.
77: GO TO 190
78: 100 DSA(L+1) = NEXT
79: 110 DSA(NEXT) = I
80: DSA(NEXT+1) = 0
81: NEXT = NEXT + 2
82: GO TO 130
83: 120 IF (NEXT+2.GE.BNEXT) GO TO 90
84: DSA(K+2) = NEXT
85: GO TO 110
86: 130 IF (STMT(K2).NE.62) GO TO 170
87: C
88: C CHECK FOR TWO ELEMENTS ONLIST BEING THE SAME ID
89: C
90: I2 = DSA(K+2)
91: DO 160 I=1,NUM
92: L = DSA(K+2)
93: DO 150 J=1,NUM
94: IF (I.EQ.J) GO TO 140
95: IF (DSA(L).NE.DSA(I2)) GO TO 140
96: CALL ERROR1(18H ILLEGAL ASF-DUMMY, 18)
97: CALL SATT1(K, 8, 0)
98: GO TO 190
99: 140 L = DSA(L+1)
100: 150 CONTINUE
101: I2 = DSA(I2+1)
102: 160 CONTINUE
103: GO TO 200
104: 170 IF (STMT(K2).EQ.68) GO TO 20
105: 180 CALL ERROR1(15H ILLEGAL SYNTAX, 15)
106: 190 RETURN
107: C
108: C = AND EXPR CHECK
109: C
110: 200 PSTMT = K2 + 1
111: 210 IF (PSTMT.GE.NSTMT) GO TO 180
112: IF (STMT(PSTMT).NE.63) GO TO 180
113: PSTMT = PSTMT + 1
114: IF (PSTMT.GE.NSTMT) GO TO 180
115: L = EXPR(I)
116: IF (SYSERR) GO TO 190
117: C
118: C CHECK THAT ASF WAS NOT DEFINED RECURSIVELY, SET USAGE
119: C
120: IF (.NOT.ASF) GO TO 230
121: I2 = IGATT1(K,8)
122: IF (I2.EQ.0) GO TO 220
123: CALL ERROR1(17H ILLEGAL ASF NAME, 17)
124: GO TO 190
125: 220 CALL SATT1(K, 8, 2)
126: 230 IF (L/8.EQ.1) GO TO 280
127: L = MOD(L,8)
128: C
129: C COMPARE TYPES OF RHS AND LHS
130: C
131: IF ((L.EQ.3 .AND. I1.EQ.3) .OR. (L.EQ.4 .AND. I1.EQ.4) .OR.
132: * (L.LE.2 .AND. I1.LE.2) .OR. (L.EQ.5 .AND. I1.EQ.5)) GO TO 190
133: IF (.NOT.(L.EQ.2 .AND. I1.EQ.5 .OR. L.EQ.5 .AND. I1.EQ.2)) CALL
134: * ERROR1(38H INCOMPATIBLE DATA TYPES IN ASSIGNMENT, 38)
135: GO TO 190
136: C
137: C PROCESSING FOR ASSIGNMENT STMT
138: C
139: 240 I = IGATT1(K,8)
140: IF (I.NE.0) GO TO 250
141: I = 10
142: CALL SATT1(K, 8, 10)
143: 250 IF (I.EQ.10 .OR. (I.EQ.4 .AND. K.EQ.NAME)) GO TO 260
144: CALL ERROR1(31H CANNOT ASSIGN VALUE TO THIS ID, 31)
145: GO TO 190
146: 260 CALL SATT1(K, 5, 1)
147: IF (STMT(K2).EQ.65) GO TO 270
148: IF (DOVAR(K)) CALL ERROR1(
149: * 57H ILLEGAL TO CHANGE VALUE OF CONTROL VARIABLE OR DO LIMITS,
150: * 57)
151: PSTMT = K2
152: GO TO 210
153: 270 PSTMT = K2 + 1
154: IF (PSTMT.GE.NSTMT) GO TO 180
155: CALL SUBS(I, I2)
156: C
157: C PEEL SUBSCRIPTS OFF
158: C
159: IF (SYSERR .OR. ERR) GO TO 190
160: PSTMT = I
161: GO TO 210
162: 280 CALL ERROR1(30H ILLEGAL USE OF ARRAY VARIABLE, 30)
163: GO TO 190
164: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.