|
|
1.1 root 1: spec: dcl
2: | common
3: | external
4: | intrinsic
5: | equivalence
6: | data
7: | implicit
8: | namelist
9: | SSAVE
10: { NO66("SAVE statement");
11: saveall = YES; }
12: | SSAVE savelist
13: { NO66("SAVE statement"); }
14: | SFORMAT
15: { fmtstmt(thislabel); setfmt(thislabel); }
16: | SPARAM in_dcl SLPAR paramlist SRPAR
17: { NO66("PARAMETER statement"); }
18: ;
19:
20: dcl: type opt_comma name in_dcl new_dcl dims lengspec
21: { settype($3, $1, $7);
22: if(ndim>0) setbound($3,ndim,dims);
23: }
24: | dcl SCOMMA name dims lengspec
25: { settype($3, $1, $5);
26: if(ndim>0) setbound($3,ndim,dims);
27: }
28: | dcl SSLASHD datainit vallist SSLASHD
29: { if (new_dcl == 2) {
30: err("attempt to give DATA in type-declaration");
31: new_dcl = 1;
32: }
33: }
34: ;
35:
36: new_dcl: { new_dcl = 2; }
37:
38: type: typespec lengspec
39: { varleng = $2; }
40: ;
41:
42: typespec: typename
43: { varleng = ($1<0 || ONEOF($1,M(TYLOGICAL)|M(TYLONG))
44: ? 0 : typesize[$1]);
45: vartype = $1; }
46: ;
47:
48: typename: SINTEGER { $$ = TYLONG; }
49: | SREAL { $$ = tyreal; }
50: | SCOMPLEX { ++complex_seen; $$ = tycomplex; }
51: | SDOUBLE { $$ = TYDREAL; }
52: | SDCOMPLEX { ++dcomplex_seen; NOEXT("DOUBLE COMPLEX statement"); $$ = TYDCOMPLEX; }
53: | SLOGICAL { $$ = TYLOGICAL; }
54: | SCHARACTER { NO66("CHARACTER statement"); $$ = TYCHAR; }
55: | SUNDEFINED { $$ = TYUNKNOWN; }
56: | SDIMENSION { $$ = TYUNKNOWN; }
57: | SAUTOMATIC { NOEXT("AUTOMATIC statement"); $$ = - STGAUTO; }
58: | SSTATIC { NOEXT("STATIC statement"); $$ = - STGBSS; }
59: ;
60:
61: lengspec:
62: { $$ = varleng; }
63: | SSTAR intonlyon expr intonlyoff
64: {
65: expptr p;
66: p = $3;
67: NO66("length specification *n");
68: if( ! ISICON(p) || p->constblock.Const.ci <= 0 )
69: {
70: $$ = 0;
71: dclerr("length must be a positive integer constant",
72: NPNULL);
73: }
74: else {
75: if (vartype == TYCHAR)
76: $$ = p->constblock.Const.ci;
77: else switch((int)p->constblock.Const.ci) {
78: case 1: $$ = 1; break;
79: case 2: $$ = typesize[TYSHORT]; break;
80: case 4: $$ = typesize[TYLONG]; break;
81: case 8: $$ = typesize[TYDREAL]; break;
82: case 16: $$ = typesize[TYDCOMPLEX]; break;
83: default:
84: dclerr("invalid length",NPNULL);
85: $$ = varleng;
86: }
87: }
88: }
89: | SSTAR intonlyon SLPAR SSTAR SRPAR intonlyoff
90: { NO66("length specification *(*)"); $$ = -1; }
91: ;
92:
93: common: SCOMMON in_dcl var
94: { incomm( $$ = comblock("") , $3 ); }
95: | SCOMMON in_dcl comblock var
96: { $$ = $3; incomm($3, $4); }
97: | common opt_comma comblock opt_comma var
98: { $$ = $3; incomm($3, $5); }
99: | common SCOMMA var
100: { incomm($1, $3); }
101: ;
102:
103: comblock: SCONCAT
104: { $$ = comblock(""); }
105: | SSLASH SNAME SSLASH
106: { $$ = comblock(token); }
107: ;
108:
109: external: SEXTERNAL in_dcl name
110: { setext($3); }
111: | external SCOMMA name
112: { setext($3); }
113: ;
114:
115: intrinsic: SINTRINSIC in_dcl name
116: { NO66("INTRINSIC statement"); setintr($3); }
117: | intrinsic SCOMMA name
118: { setintr($3); }
119: ;
120:
121: equivalence: SEQUIV in_dcl equivset
122: | equivalence SCOMMA equivset
123: ;
124:
125: equivset: SLPAR equivlist SRPAR
126: {
127: struct Equivblock *p;
128: if(nequiv >= maxequiv)
129: many("equivalences", 'q', maxequiv);
130: p = & eqvclass[nequiv++];
131: p->eqvinit = NO;
132: p->eqvbottom = 0;
133: p->eqvtop = 0;
134: p->equivs = $2;
135: }
136: ;
137:
138: equivlist: lhs
139: { $$=ALLOC(Eqvchain);
140: $$->eqvitem.eqvlhs = (struct Primblock *)$1;
141: }
142: | equivlist SCOMMA lhs
143: { $$=ALLOC(Eqvchain);
144: $$->eqvitem.eqvlhs = (struct Primblock *) $3;
145: $$->eqvnextp = $1;
146: }
147: ;
148:
149: data: SDATA in_data datalist
150: | data opt_comma datalist
151: ;
152:
153: in_data:
154: { if(parstate == OUTSIDE)
155: {
156: newproc();
157: startproc(ESNULL, CLMAIN);
158: }
159: if(parstate < INDATA)
160: {
161: enddcl();
162: parstate = INDATA;
163: datagripe = 1;
164: }
165: }
166: ;
167:
168: datalist: datainit datavarlist SSLASH datapop vallist SSLASH
169: { ftnint junk;
170: if(nextdata(&junk) != NULL)
171: err("too few initializers");
172: frdata($2);
173: frrpl();
174: }
175: ;
176:
177: datainit: /* nothing */ { frchain(&datastack); curdtp = 0; }
178:
179: datapop: /* nothing */ { pop_datastack(); }
180:
181: vallist: { toomanyinit = NO; } val
182: | vallist SCOMMA val
183: ;
184:
185: val: value
186: { dataval(ENULL, $1); }
187: | simple SSTAR value
188: { dataval($1, $3); }
189: ;
190:
191: value: simple
192: | addop simple
193: { if( $1==OPMINUS && ISCONST($2) )
194: consnegop((Constp)$2);
195: $$ = $2;
196: }
197: | complex_const
198: ;
199:
200: savelist: saveitem
201: | savelist SCOMMA saveitem
202: ;
203:
204: saveitem: name
205: { int k;
206: $1->vsave = YES;
207: k = $1->vstg;
208: if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) )
209: dclerr("can only save static variables", $1);
210: }
211: | comblock
212: ;
213:
214: paramlist: paramitem
215: | paramlist SCOMMA paramitem
216: ;
217:
218: paramitem: name SEQUALS expr
219: { if($1->vclass == CLUNKNOWN)
220: make_param((struct Paramblock *)$1, $3);
221: else dclerr("cannot make into parameter", $1);
222: }
223: ;
224:
225: var: name dims
226: { if(ndim>0) setbound($1, ndim, dims); }
227: ;
228:
229: datavar: lhs
230: { Namep np;
231: np = ( (struct Primblock *) $1) -> namep;
232: vardcl(np);
233: if(np->vstg == STGCOMMON)
234: extsymtab[np->vardesc.varno].extinit = YES;
235: else if(np->vstg==STGEQUIV)
236: eqvclass[np->vardesc.varno].eqvinit = YES;
237: else if(np->vstg!=STGINIT && np->vstg!=STGBSS)
238: dclerr("inconsistent storage classes", np);
239: $$ = mkchain((char *)$1, CHNULL);
240: }
241: | SLPAR datavarlist SCOMMA dospec SRPAR
242: { chainp p; struct Impldoblock *q;
243: pop_datastack();
244: q = ALLOC(Impldoblock);
245: q->tag = TIMPLDO;
246: (q->varnp = (Namep) ($4->datap))->vimpldovar = 1;
247: p = $4->nextp;
248: if(p) { q->implb = (expptr)(p->datap); p = p->nextp; }
249: if(p) { q->impub = (expptr)(p->datap); p = p->nextp; }
250: if(p) { q->impstep = (expptr)(p->datap); }
251: frchain( & ($4) );
252: $$ = mkchain((char *)q, CHNULL);
253: q->datalist = hookup($2, $$);
254: }
255: ;
256:
257: datavarlist: datavar
258: { if (!datastack)
259: curdtp = 0;
260: datastack = mkchain((char *)curdtp, datastack);
261: curdtp = $1; curdtelt = 0;
262: }
263: | datavarlist SCOMMA datavar
264: { $$ = hookup($1, $3); }
265: ;
266:
267: dims:
268: { ndim = 0; }
269: | SLPAR dimlist SRPAR
270: ;
271:
272: dimlist: { ndim = 0; } dim
273: | dimlist SCOMMA dim
274: ;
275:
276: dim: ubound
277: {
278: if(ndim == maxdim)
279: err("too many dimensions");
280: else if(ndim < maxdim)
281: { dims[ndim].lb = 0;
282: dims[ndim].ub = $1;
283: }
284: ++ndim;
285: }
286: | expr SCOLON ubound
287: {
288: if(ndim == maxdim)
289: err("too many dimensions");
290: else if(ndim < maxdim)
291: { dims[ndim].lb = $1;
292: dims[ndim].ub = $3;
293: }
294: ++ndim;
295: }
296: ;
297:
298: ubound: SSTAR
299: { $$ = 0; }
300: | expr
301: ;
302:
303: labellist: label
304: { nstars = 1; labarray[0] = $1; }
305: | labellist SCOMMA label
306: { if(nstars < maxlablist) labarray[nstars++] = $3; }
307: ;
308:
309: label: SICON
310: { $$ = execlab( convci(toklen, token) ); }
311: ;
312:
313: implicit: SIMPLICIT in_dcl implist
314: { NO66("IMPLICIT statement"); }
315: | implicit SCOMMA implist
316: ;
317:
318: implist: imptype SLPAR letgroups SRPAR
319: | imptype
320: { if (vartype != TYUNKNOWN)
321: dclerr("-- expected letter range",NPNULL);
322: setimpl(vartype, varleng, 'a', 'z'); }
323: ;
324:
325: imptype: { needkwd = 1; } type
326: /* { vartype = $2; } */
327: ;
328:
329: letgroups: letgroup
330: | letgroups SCOMMA letgroup
331: ;
332:
333: letgroup: letter
334: { setimpl(vartype, varleng, $1, $1); }
335: | letter SMINUS letter
336: { setimpl(vartype, varleng, $1, $3); }
337: ;
338:
339: letter: SNAME
340: { if(toklen!=1 || token[0]<'a' || token[0]>'z')
341: {
342: dclerr("implicit item must be single letter", NPNULL);
343: $$ = 0;
344: }
345: else $$ = token[0];
346: }
347: ;
348:
349: namelist: SNAMELIST
350: | namelist namelistentry
351: ;
352:
353: namelistentry: SSLASH name SSLASH namelistlist
354: {
355: if($2->vclass == CLUNKNOWN)
356: {
357: $2->vclass = CLNAMELIST;
358: $2->vtype = TYINT;
359: $2->vstg = STGBSS;
360: $2->varxptr.namelist = $4;
361: $2->vardesc.varno = ++lastvarno;
362: }
363: else dclerr("cannot be a namelist name", $2);
364: }
365: ;
366:
367: namelistlist: name
368: { $$ = mkchain((char *)$1, CHNULL); }
369: | namelistlist SCOMMA name
370: { $$ = hookup($1, mkchain((char *)$3, CHNULL)); }
371: ;
372:
373: in_dcl:
374: { switch(parstate)
375: {
376: case OUTSIDE: newproc();
377: startproc(ESNULL, CLMAIN);
378: case INSIDE: parstate = INDCL;
379: case INDCL: break;
380:
381: case INDATA:
382: if (datagripe) {
383: errstr(
384: "Statement order error: declaration after DATA",
385: CNULL);
386: datagripe = 0;
387: }
388: break;
389:
390: default:
391: dclerr("declaration among executables", NPNULL);
392: }
393: }
394: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.