{ NO66("SAVE statement");
{ NO66("SAVE statement"); }
{ fmtstmt(thislabel); setfmt(thislabel); }
| SPARAM in_dcl SLPAR paramlist SRPAR
{ NO66("PARAMETER statement"); }
dcl: type opt_comma name in_dcl new_dcl dims lengspec
if(ndim>0) setbound($3,ndim,dims);
| dcl SCOMMA name dims lengspec
if(ndim>0) setbound($3,ndim,dims);
| dcl SSLASHD datainit vallist SSLASHD
err("attempt to give DATA in type-declaration");
new_dcl: { new_dcl = 2; } ;
{ varleng = ($1<0 || ONEOF($1,M(TYLOGICAL)|M(TYLONG))
typename: SINTEGER { $$ = TYLONG; }
| SCOMPLEX { ++complex_seen; $$ = tycomplex; }
| SDOUBLE { $$ = TYDREAL; }
| SDCOMPLEX { ++dcomplex_seen; NOEXT("DOUBLE COMPLEX statement"); $$ = TYDCOMPLEX; }
| SLOGICAL { $$ = TYLOGICAL; }
| SCHARACTER { NO66("CHARACTER statement"); $$ = TYCHAR; }
| SUNDEFINED { $$ = TYUNKNOWN; }
| SDIMENSION { $$ = TYUNKNOWN; }
| SAUTOMATIC { NOEXT("AUTOMATIC statement"); $$ = - STGAUTO; }
| SSTATIC { NOEXT("STATIC statement"); $$ = - STGBSS; }
| SSTAR intonlyon expr intonlyoff
NO66("length specification *n");
if( ! ISICON(p) || p->constblock.Const.ci <= 0 )
dclerr("length must be a positive integer constant",
$$ = p->constblock.Const.ci;
else switch((int)p->constblock.Const.ci) {
case 2: $$ = typesize[TYSHORT]; break;
case 4: $$ = typesize[TYLONG]; break;
case 8: $$ = typesize[TYDREAL]; break;
case 16: $$ = typesize[TYDCOMPLEX]; break;
dclerr("invalid length",NPNULL);
| SSTAR intonlyon SLPAR SSTAR SRPAR intonlyoff
{ NO66("length specification *(*)"); $$ = -1; }
common: SCOMMON in_dcl var
{ incomm( $$ = comblock("") , $3 ); }
| SCOMMON in_dcl comblock var
{ $$ = $3; incomm($3, $4); }
| common opt_comma comblock opt_comma var
{ $$ = $3; incomm($3, $5); }
{ $$ = comblock(token); }
external: SEXTERNAL in_dcl name
intrinsic: SINTRINSIC in_dcl name
{ NO66("INTRINSIC statement"); setintr($3); }
equivalence: SEQUIV in_dcl equivset
| equivalence SCOMMA equivset
equivset: SLPAR equivlist SRPAR
many("equivalences", 'q', maxequiv);
p = & eqvclass[nequiv++];
$$->eqvitem.eqvlhs = (struct Primblock *)$1;
$$->eqvitem.eqvlhs = (struct Primblock *) $3;
data: SDATA in_data datalist
| data opt_comma datalist
{ if(parstate == OUTSIDE)
startproc(ESNULL, CLMAIN);
datalist: datainit datavarlist SSLASH datapop vallist SSLASH
if(nextdata(&junk) != NULL)
err("too few initializers");
datainit: /* nothing */ { frchain(&datastack); curdtp = 0; } ;
datapop: /* nothing */ { pop_datastack(); } ;
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)
make_param((struct Paramblock *)$1, $3);
else dclerr("cannot make into parameter", $1);
{ if(ndim>0) setbound($1, ndim, dims); }
np = ( (struct Primblock *) $1) -> namep;
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 && np->vstg!=STGBSS)
dclerr("inconsistent storage classes", np);
$$ = mkchain((char *)$1, CHNULL);
| SLPAR datavarlist SCOMMA dospec SRPAR
{ chainp p; struct Impldoblock *q;
(q->varnp = (Namep) ($4->datap))->vimpldovar = 1;
if(p) { q->implb = (expptr)(p->datap); p = p->nextp; }
if(p) { q->impub = (expptr)(p->datap); p = p->nextp; }
if(p) { q->impstep = (expptr)(p->datap); }
$$ = mkchain((char *)q, CHNULL);
q->datalist = hookup($2, $$);
datastack = mkchain((char *)curdtp, datastack);
curdtp = $1; curdtelt = 0;
| datavarlist SCOMMA datavar
dimlist: { ndim = 0; } dim
err("too many dimensions");
err("too many dimensions");
{ nstars = 1; labarray[0] = $1; }
{ if(nstars < maxlablist) labarray[nstars++] = $3; }
{ $$ = execlab( convci(toklen, token) ); }
implicit: SIMPLICIT in_dcl implist
{ NO66("IMPLICIT statement"); }
| implicit SCOMMA implist
implist: imptype SLPAR letgroups SRPAR
{ if (vartype != TYUNKNOWN)
dclerr("-- expected letter range",NPNULL);
setimpl(vartype, varleng, 'a', 'z'); }
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", NPNULL);
namelistentry: SSLASH name SSLASH namelistlist
if($2->vclass == CLUNKNOWN)
$2->varxptr.namelist = $4;
$2->vardesc.varno = ++lastvarno;
else dclerr("cannot be a namelist name", $2);
{ $$ = mkchain((char *)$1, CHNULL); }
| namelistlist SCOMMA name
{ $$ = hookup($1, mkchain((char *)$3, CHNULL)); }
startproc(ESNULL, CLMAIN);
case INSIDE: parstate = INDCL;
"Statement order error: declaration after DATA",
dclerr("declaration among executables", NPNULL);