10
{ NO66("SAVE statement");
13
{ NO66("SAVE statement"); }
15
{ fmtstmt(thislabel); setfmt(thislabel); }
16
| SPARAM in_dcl SLPAR paramlist SRPAR
17
{ NO66("PARAMETER statement"); }
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);
24
| dcl SCOMMA name dims lengspec
25
{ settype($3, $1, $5);
26
if(ndim>0) setbound($3,ndim,dims);
28
| dcl SSLASHD datainit vallist SSLASHD
30
err("attempt to give DATA in type-declaration");
36
new_dcl: { new_dcl = 2; } ;
38
type: typespec lengspec
43
{ varleng = ($1<0 || ONEOF($1,M(TYLOGICAL)|M(TYLONG))
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
| SBYTE { $$ = TYINT1; }
64
| SSTAR intonlyon expr intonlyoff
68
NO66("length specification *n");
69
if( ! ISICON(p) || p->constblock.Const.ci <= 0 )
72
dclerr("length must be a positive integer constant",
76
if (vartype == TYCHAR)
77
$$ = p->constblock.Const.ci;
78
else switch((int)p->constblock.Const.ci) {
79
case 1: $$ = 1; break;
80
case 2: $$ = typesize[TYSHORT]; break;
81
case 4: $$ = typesize[TYLONG]; break;
82
case 8: $$ = typesize[TYDREAL]; break;
83
case 16: $$ = typesize[TYDCOMPLEX]; break;
85
dclerr("invalid length",NPNULL);
90
| SSTAR intonlyon SLPAR SSTAR SRPAR intonlyoff
91
{ NO66("length specification *(*)"); $$ = -1; }
94
common: SCOMMON in_dcl var
95
{ incomm( $$ = comblock("") , $3 ); }
96
| SCOMMON in_dcl comblock var
97
{ $$ = $3; incomm($3, $4); }
98
| common opt_comma comblock opt_comma var
99
{ $$ = $3; incomm($3, $5); }
105
{ $$ = comblock(""); }
106
| SSLASH SNAME SSLASH
107
{ $$ = comblock(token); }
110
external: SEXTERNAL in_dcl name
112
| external SCOMMA name
116
intrinsic: SINTRINSIC in_dcl name
117
{ NO66("INTRINSIC statement"); setintr($3); }
118
| intrinsic SCOMMA name
122
equivalence: SEQUIV in_dcl equivset
123
| equivalence SCOMMA equivset
126
equivset: SLPAR equivlist SRPAR
128
struct Equivblock *p;
129
if(nequiv >= maxequiv)
130
many("equivalences", 'q', maxequiv);
131
p = & eqvclass[nequiv++];
140
{ $$=ALLOC(Eqvchain);
141
$$->eqvitem.eqvlhs = primchk($1);
143
| equivlist SCOMMA lhs
144
{ $$=ALLOC(Eqvchain);
145
$$->eqvitem.eqvlhs = primchk($3);
150
data: SDATA in_data datalist
151
| data opt_comma datalist
155
{ if(parstate == OUTSIDE)
158
startproc(ESNULL, CLMAIN);
160
if(parstate < INDATA)
169
datalist: datainit datavarlist SSLASH datapop vallist SSLASH
171
if(nextdata(&junk) != NULL)
172
err("too few initializers");
178
datainit: /* nothing */ { frchain(&datastack); curdtp = 0; } ;
180
datapop: /* nothing */ { pop_datastack(); } ;
182
vallist: { toomanyinit = NO; } val
187
{ dataval(ENULL, $1); }
194
{ if( $1==OPMINUS && ISCONST($2) )
195
consnegop((Constp)$2);
202
| savelist SCOMMA saveitem
209
if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) )
210
dclerr("can only save static variables", $1);
216
| paramlist SCOMMA paramitem
219
paramitem: name SEQUALS expr
220
{ if($1->vclass == CLUNKNOWN)
221
make_param((struct Paramblock *)$1, $3);
222
else dclerr("cannot make into parameter", $1);
227
{ if(ndim>0) setbound($1, ndim, dims); }
232
struct Primblock *pp = (struct Primblock *)$1;
236
err("parameter in data statement");
238
erri("tag %d in data statement",tt);
245
if ((pp->fcharp || pp->lcharp)
246
&& (np->vtype != TYCHAR || np->vdim))
248
if(np->vstg == STGCOMMON)
249
extsymtab[np->vardesc.varno].extinit = YES;
250
else if(np->vstg==STGEQUIV)
251
eqvclass[np->vardesc.varno].eqvinit = YES;
252
else if(np->vstg!=STGINIT && np->vstg!=STGBSS) {
253
errstr(np->vstg == STGARG
254
? "Dummy argument \"%.60s\" in data statement."
255
: "Cannot give data to \"%.75s\"",
261
$$ = mkchain((char *)$1, CHNULL);
263
| SLPAR datavarlist SCOMMA dospec SRPAR
264
{ chainp p; struct Impldoblock *q;
266
q = ALLOC(Impldoblock);
268
(q->varnp = (Namep) ($4->datap))->vimpldovar = 1;
270
if(p) { q->implb = (expptr)(p->datap); p = p->nextp; }
271
if(p) { q->impub = (expptr)(p->datap); p = p->nextp; }
272
if(p) { q->impstep = (expptr)(p->datap); }
274
$$ = mkchain((char *)q, CHNULL);
275
q->datalist = hookup($2, $$);
282
datastack = mkchain((char *)curdtp, datastack);
283
curdtp = $1; curdtelt = 0;
285
| datavarlist SCOMMA datavar
286
{ $$ = hookup($1, $3); }
291
| SLPAR dimlist SRPAR
294
dimlist: { ndim = 0; } dim
301
err("too many dimensions");
302
else if(ndim < maxdim)
311
err("too many dimensions");
312
else if(ndim < maxdim)
313
{ dims[ndim].lb = $1;
326
{ nstars = 1; labarray[0] = $1; }
327
| labellist SCOMMA label
328
{ if(nstars < maxlablist) labarray[nstars++] = $3; }
332
{ $$ = execlab( convci(toklen, token) ); }
335
implicit: SIMPLICIT in_dcl implist
336
{ NO66("IMPLICIT statement"); }
337
| implicit SCOMMA implist
340
implist: imptype SLPAR letgroups SRPAR
342
{ if (vartype != TYUNKNOWN)
343
dclerr("-- expected letter range",NPNULL);
344
setimpl(vartype, varleng, 'a', 'z'); }
347
imptype: { needkwd = 1; } type
348
/* { vartype = $2; } */
352
| letgroups SCOMMA letgroup
356
{ setimpl(vartype, varleng, $1, $1); }
357
| letter SMINUS letter
358
{ setimpl(vartype, varleng, $1, $3); }
362
{ if(toklen!=1 || token[0]<'a' || token[0]>'z')
364
dclerr("implicit item must be single letter", NPNULL);
372
| namelist namelistentry
375
namelistentry: SSLASH name SSLASH namelistlist
377
if($2->vclass == CLUNKNOWN)
379
$2->vclass = CLNAMELIST;
382
$2->varxptr.namelist = $4;
383
$2->vardesc.varno = ++lastvarno;
385
else dclerr("cannot be a namelist name", $2);
390
{ $$ = mkchain((char *)$1, CHNULL); }
391
| namelistlist SCOMMA name
392
{ $$ = hookup($1, mkchain((char *)$3, CHNULL)); }
398
case OUTSIDE: newproc();
399
startproc(ESNULL, CLMAIN);
400
case INSIDE: parstate = INDCL;
406
"Statement order error: declaration after DATA",
413
dclerr("declaration among executables", NPNULL);