{ fmtstmt(thislabel); setfmt(thislabel); }
| SPARAM in_dcl SLPAR paramlist SRPAR
dcl: type name in_dcl lengspec dims
if(ndim>0) setbound($2,ndim,dims);
| dcl SCOMMA name lengspec dims
if(ndim>0) setbound($3,ndim,dims);
{ varleng = ($1<0 || $1==TYLONG ? 0 : typesize[$1]); }
typename: SINTEGER { $$ = TYLONG; }
| SCOMPLEX { $$ = TYCOMPLEX; }
| SDOUBLE { $$ = TYDREAL; }
| SDCOMPLEX { $$ = TYDCOMPLEX; }
| SLOGICAL { $$ = TYLOGICAL; }
| SCHARACTER { $$ = TYCHAR; }
| SUNDEFINED { $$ = TYUNKNOWN; }
| SDIMENSION { $$ = TYUNKNOWN; }
| SAUTOMATIC { $$ = - STGAUTO; }
| SSTATIC { $$ = - STGBSS; }
dclerr("length must be an integer constant", 0);
| SSTAR SLPAR SSTAR SRPAR
common: SCOMMON in_dcl var
{ incomm( $$ = comblock(0, 0) , $3 ); }
| SCOMMON in_dcl comblock var
{ $$ = $3; incomm($3, $4); }
| common opt_comma comblock opt_comma var
{ $$ = $3; incomm($3, $5); }
{ $$ = comblock(toklen, token); }
external: SEXTERNAL in_dcl name
intrinsic: SINTRINSIC in_dcl name
equivalence: SEQUIV in_dcl equivset
| equivalence SCOMMA equivset
equivset: SLPAR equivlist SRPAR
fatal("too many equivalences");
p = & eqvclass[nequiv++];
{ $$ = ALLOC(eqvchain); $$->eqvitem = $1; }
{ $$ = ALLOC(eqvchain); $$->eqvitem = $3; $$->nextp = $1; }
data: SDATA in_data datalist
| data opt_comma datalist
{ if(parstate == OUTSIDE)
datalist: datavarlist SSLASH vallist SSLASH
if(nextdata(&junk,&junk) != NULL)
err("too few initializers");
vallist: { toomanyinit = NO; } val
{ if( $1==OPMINUS && ISCONST($2) )
| savelist SCOMMA saveitem
if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) )
dclerr("can only save static variables", $1);
| paramlist SCOMMA paramitem
paramitem: name SEQUALS expr
{ if($1->vclass == CLUNKNOWN)
else dclerr("cannot make %s parameter", $1);
{ if(ndim>0) setbounds($1, ndim, dims); }
else if(np->vstg == STGCOMMON)
extsymtab[np->vardesc.varno].extinit = YES;
else if(np->vstg==STGEQUIV)
eqvclass[np->vardesc.varno].eqvinit = YES;
else if(np->vstg != STGINIT)
dclerr("inconsistent storage classes", np);
| SLPAR datavarlist SCOMMA dospec SRPAR
{ chainp p; struct impldoblock *q;
if(p) { q->implb = p->datap; p = p->nextp; }
if(p) { q->impub = p->datap; p = p->nextp; }
if(p) { q->impstep = p->datap; p = p->nextp; }
q->datalist = hookup($2, $$);
{ curdtp = $1; curdtelt = 0; }
| datavarlist SCOMMA datavar
dimlist: { ndim = 0; } dim
{ nstars = 1; labarray[0] = $1; }
{ labarray[nstars++] = $3; }
warn1("illegal branch to inner block, statement %s",
convic( (ftnint) ($1->stateno) ));
else if($1->labdefined == NO)
{ $$ = mklabel( convci(toklen, token) ); }
implicit: SIMPLICIT in_dcl implist
| implicit SCOMMA implist
implist: imptype SLPAR letgroups SRPAR
imptype: { needkwd = 1; } type
| letgroups SCOMMA letgroup
{ setimpl(vartype, varleng, $1, $1); }
{ setimpl(vartype, varleng, $1, $3); }
{ if(toklen!=1 || token[0]<'a' || token[0]>'z')
dclerr("implicit item must be single letter", 0);
case INSIDE: parstate = INDCL;
dclerr("declaration among executables", 0);