12 { fmtstmt(thislabel); setfmt(thislabel); }
13 | SPARAM in_dcl SLPAR paramlist SRPAR
16 dcl: type name in_dcl dims lengspec
17 { settype($2, $1, $5);
18 if(ndim>0) setbound($2,ndim,dims);
20 | dcl SCOMMA name dims lengspec
21 { settype($3, $1, $5);
22 if(ndim>0) setbound($3,ndim,dims);
26 type: typespec lengspec
31 { varleng = ($1<0 || $1==TYLONG ? 0 : typesize[$1]); }
34 typename: SINTEGER { $$ = TYLONG; }
35 | SREAL { $$ = TYREAL; }
36 | SCOMPLEX { $$ = TYCOMPLEX; }
37 | SDOUBLE { $$ = TYDREAL; }
38 | SDCOMPLEX { $$ = TYDCOMPLEX; }
39 | SLOGICAL { $$ = TYLOGICAL; }
40 | SCHARACTER { $$ = TYCHAR; }
41 | SUNDEFINED { $$ = TYUNKNOWN; }
42 | SDIMENSION { $$ = TYUNKNOWN; }
43 | SAUTOMATIC { $$ = - STGAUTO; }
44 | SSTATIC { $$ = - STGBSS; }
54 dclerr("length must be an integer constant", 0);
56 else $$ = $2->b_const.fconst.ci;
58 | SSTAR SLPAR SSTAR SRPAR
62 common: SCOMMON in_dcl var
63 { incomm( $$ = comblock(0, 0) , $3 ); }
64 | SCOMMON in_dcl comblock var
65 { $$ = $3; incomm($3, $4); }
66 | common opt_comma comblock opt_comma var
67 { $$ = $3; incomm($3, $5); }
73 { $$ = comblock(0, 0); }
74 | SSLASH SFNAME SSLASH
75 { $$ = comblock(toklen, token); }
78 external: SEXTERNAL in_dcl name
80 | external SCOMMA name
84 intrinsic: SINTRINSIC in_dcl name
86 | intrinsic SCOMMA name
90 equivalence: SEQUIV in_dcl equivset
91 | equivalence SCOMMA equivset
94 equivset: SLPAR equivlist SRPAR
97 if(nequiv >= MAXEQUIV)
98 fatal("too many equivalences");
99 p = & eqvclass[nequiv++];
108 { $$ = ALLOC(eqvchain); $$->eqvchain.eqvitem = $1; }
109 | equivlist SCOMMA lhs
110 { $$ = ALLOC(eqvchain); $$->eqvchain.eqvitem = $3; $$->eqvchain.nextp = $1; }
113 data: SDATA in_data datalist
114 | data opt_comma datalist
118 { if(parstate == OUTSIDE)
121 startproc(0, CLMAIN);
123 if(parstate < INDATA)
131 datalist: datavarlist SSLASH vallist SSLASH
133 if(nextdata(&junk,&junk) != NULL)
135 err("too few initializers");
143 vallist: { toomanyinit = NO; } val
148 { dataval(NULL, $1); }
155 { if( $1==OPMINUS && ISCONST($2) )
164 | savelist SCOMMA saveitem
169 $1->b_name.vsave = 1;
171 if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) )
172 dclerr("can only save static variables", $1);
179 | paramlist SCOMMA paramitem
182 paramitem: name SEQUALS expr
183 { if($1->vclass == CLUNKNOWN)
184 { $1->vclass = CLPARAM;
185 $1->b_param.paramval = $3;
187 else dclerr("cannot make %s parameter", $1);
192 { if(ndim>0) setbound($1, ndim, dims); }
196 { struct bigblock *np;
197 vardcl(np = $1->b_prim.namep);
198 if(np->vstg == STGBSS)
200 else if(np->vstg == STGCOMMON)
201 extsymtab[np->b_name.vardesc.varno].extinit = YES;
202 else if(np->vstg==STGEQUIV)
203 eqvclass[np->b_name.vardesc.varno].eqvinit = YES;
204 else if(np->vstg != STGINIT)
205 dclerr("inconsistent storage classes", np);
208 | SLPAR datavarlist SCOMMA dospec SRPAR
209 { chainp p; struct bigblock *q;
212 q->b_impldo.varnp = $4->chain.datap;
214 if(p) { q->b_impldo.implb = p->chain.datap; p = p->chain.nextp; }
215 if(p) { q->b_impldo.impub = p->chain.datap; p = p->chain.nextp; }
216 if(p) { q->b_impldo.impstep = p->chain.datap; p = p->chain.nextp; }
219 q->b_impldo.datalist = hookup($2, $$);
224 { curdtp = $1; curdtelt = 0; }
225 | datavarlist SCOMMA datavar
226 { $$ = hookup($1, $3); }
231 | SLPAR dimlist SRPAR
234 dimlist: { ndim = 0; } dim
244 { dims[ndim].lb = $1;
256 { nstars = 1; labarray[0] = $1; }
257 | labellist SCOMMA label
258 { labarray[nstars++] = $3; }
263 warn1("illegal branch to inner block, statement %s",
264 convic( (ftnint) ($1->stateno) ));
265 else if($1->labdefined == NO)
266 $1->blklevel = blklevel;
272 { $$ = mklabel( convci(toklen, token) ); }
275 implicit: SIMPLICIT in_dcl implist
276 | implicit SCOMMA implist
279 implist: imptype SLPAR letgroups SRPAR
282 imptype: { needkwd = 1; } type
287 | letgroups SCOMMA letgroup
291 { setimpl(vartype, varleng, $1, $1); }
292 | letter SMINUS letter
293 { setimpl(vartype, varleng, $1, $3); }
297 { if(toklen!=1 || token[0]<'a' || token[0]>'z')
299 dclerr("implicit item must be single letter", 0);
309 case OUTSIDE: newproc();
310 startproc(0, CLMAIN);
311 case INSIDE: parstate = INDCL;
315 dclerr("declaration among executables", 0);