* add p cc
[mascara-docs.git] / compilers / pcc / pcc-1.0.0 / f77 / fcom / gram.dcl
blob493f7a968f103a2d7044cfb8400b4576395dad6a
1 spec:     dcl
2         | common
3         | external
4         | intrinsic
5         | equivalence
6         | data
7         | implicit
8         | SSAVE
9                 { saveall = YES; }
10         | SSAVE savelist
11         | SFORMAT
12                 { fmtstmt(thislabel); setfmt(thislabel); }
13         | SPARAM in_dcl SLPAR paramlist SRPAR
14         ;
16 dcl:      type name in_dcl dims lengspec
17                 { settype($2, $1, $5);
18                   if(ndim>0) setbound($2,ndim,dims);
19                 }
20         | dcl SCOMMA name dims lengspec
21                 { settype($3, $1, $5);
22                   if(ndim>0) setbound($3,ndim,dims);
23                 }
24         ;
26 type:     typespec lengspec
27                 { varleng = $2; }
28         ;
30 typespec:  typename
31                 { varleng = ($1<0 || $1==TYLONG ? 0 : typesize[$1]); }
32         ;
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; }
45         ;
47 lengspec:
48                 { $$ = varleng; }
49         | SSTAR expr
50                 {
51                   if( ! ISICON($2) )
52                         {
53                         $$ = 0;
54                         dclerr("length must be an integer constant", 0);
55                         }
56                   else $$ = $2->b_const.fconst.ci;
57                 }
58         | SSTAR SLPAR SSTAR SRPAR
59                 { $$ = 0; }
60         ;
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); }
68         | common SCOMMA var
69                 { incomm($1, $3); }
70         ;
72 comblock:  SCONCAT
73                 { $$ = comblock(0, 0); }
74         | SSLASH SFNAME SSLASH
75                 { $$ = comblock(toklen, token); }
76         ;
78 external: SEXTERNAL in_dcl name
79                 { setext($3); }
80         | external SCOMMA name
81                 { setext($3); }
82         ;
84 intrinsic:  SINTRINSIC in_dcl name
85                 { setintr($3); }
86         | intrinsic SCOMMA name
87                 { setintr($3); }
88         ;
90 equivalence:  SEQUIV in_dcl equivset
91         | equivalence SCOMMA equivset
92         ;
94 equivset:  SLPAR equivlist SRPAR
95                 {
96                 struct equivblock *p;
97                 if(nequiv >= MAXEQUIV)
98                         fatal("too many equivalences");
99                 p  =  & eqvclass[nequiv++];
100                 p->eqvinit = 0;
101                 p->eqvbottom = 0;
102                 p->eqvtop = 0;
103                 p->equivs = $2;
104                 }
105         ;
107 equivlist:  lhs
108                 { $$ = ALLOC(eqvchain); $$->eqvchain.eqvitem = $1; }
109         | equivlist SCOMMA lhs
110                 { $$ = ALLOC(eqvchain); $$->eqvchain.eqvitem = $3; $$->eqvchain.nextp = $1; }
111         ;
113 data:     SDATA in_data datalist
114         | data opt_comma datalist
115         ;
117 in_data:
118                 { if(parstate == OUTSIDE)
119                         {
120                         newproc();
121                         startproc(0, CLMAIN);
122                         }
123                   if(parstate < INDATA)
124                         {
125                         enddcl();
126                         parstate = INDATA;
127                         }
128                 }
129         ;
131 datalist:  datavarlist SSLASH vallist SSLASH
132                 { ftnint junk;
133                   if(nextdata(&junk,&junk) != NULL)
134                         {
135                         err("too few initializers");
136                         curdtp = NULL;
137                         }
138                   frdata($1);
139                   frrpl();
140                 }
141         ;
143 vallist:  { toomanyinit = NO; }  val
144         | vallist SCOMMA val
145         ;
147 val:      value
148                 { dataval(NULL, $1); }
149         | simple SSTAR value
150                 { dataval($1, $3); }
151         ;
153 value:    simple
154         | addop simple
155                 { if( $1==OPMINUS && ISCONST($2) )
156                         consnegop($2);
157                   $$ = $2;
158                 }
159         | complex_const
160         | bit_const
161         ;
163 savelist: saveitem
164         | savelist SCOMMA saveitem
165         ;
167 saveitem: name
168                 { int k;
169                   $1->b_name.vsave = 1;
170                   k = $1->vstg;
171                 if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) )
172                         dclerr("can only save static variables", $1);
173                 }
174         | comblock
175                 { $1->extsave = 1; }
176         ;
178 paramlist:  paramitem
179         | paramlist SCOMMA paramitem
180         ;
182 paramitem:  name SEQUALS expr
183                 { if($1->vclass == CLUNKNOWN)
184                         { $1->vclass = CLPARAM;
185                           $1->b_param.paramval = $3;
186                         }
187                   else dclerr("cannot make %s parameter", $1);
188                 }
189         ;
191 var:      name dims
192                 { if(ndim>0) setbound($1, ndim, dims); }
193         ;
195 datavar:          lhs
196                 { struct bigblock *np;
197                   vardcl(np = $1->b_prim.namep);
198                   if(np->vstg == STGBSS)
199                         np->vstg = STGINIT;
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);
206                   $$ = mkchain($1, 0);
207                 }
208         | SLPAR datavarlist SCOMMA dospec SRPAR
209                 { chainp p; struct bigblock *q;
210                 q = BALLO();
211                 q->tag = TIMPLDO;
212                 q->b_impldo.varnp = $4->chain.datap;
213                 p = $4->chain.nextp;
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; }
217                 frchain( & ($4) );
218                 $$ = mkchain(q, 0);
219                 q->b_impldo.datalist = hookup($2, $$);
220                 }
221         ;
223 datavarlist: datavar
224                 { curdtp = $1; curdtelt = 0; }
225         | datavarlist SCOMMA datavar
226                 { $$ = hookup($1, $3); }
227         ;
229 dims:
230                 { ndim = 0; }
231         | SLPAR dimlist SRPAR
232         ;
234 dimlist:   { ndim = 0; }   dim
235         | dimlist SCOMMA dim
236         ;
238 dim:      ubound
239                 { dims[ndim].lb = 0;
240                   dims[ndim].ub = $1;
241                   ++ndim;
242                 }
243         | expr SCOLON ubound
244                 { dims[ndim].lb = $1;
245                   dims[ndim].ub = $3;
246                   ++ndim;
247                 }
248         ;
250 ubound:   SSTAR
251                 { $$ = 0; }
252         | expr
253         ;
255 labellist: label
256                 { nstars = 1; labarray[0] = $1; }
257         | labellist SCOMMA label
258                 { labarray[nstars++] = $3; }
259         ;
261 label:    labelval
262                 { if($1->labinacc)
263                         warn1("illegal branch to inner block, statement %s",
264                                 convic( (ftnint) ($1->stateno) ));
265                   else if($1->labdefined == NO)
266                         $1->blklevel = blklevel;
267                   $1->labused = YES;
268                 }
269         ;
271 labelval:   SICON
272                 { $$ = mklabel( convci(toklen, token) ); }
273         ;
275 implicit:  SIMPLICIT in_dcl implist
276         | implicit SCOMMA implist
277         ;
279 implist:  imptype SLPAR letgroups SRPAR
280         ;
282 imptype:   { needkwd = 1; } type
283                 { vartype = $2; }
284         ;
286 letgroups: letgroup
287         | letgroups SCOMMA letgroup
288         ;
290 letgroup:  letter
291                 { setimpl(vartype, varleng, $1, $1); }
292         | letter SMINUS letter
293                 { setimpl(vartype, varleng, $1, $3); }
294         ;
296 letter:  SFNAME
297                 { if(toklen!=1 || token[0]<'a' || token[0]>'z')
298                         {
299                         dclerr("implicit item must be single letter", 0);
300                         $$ = 0;
301                         }
302                   else $$ = token[0];
303                 }
304         ;
306 in_dcl:
307                 { switch(parstate)      
308                         {
309                         case OUTSIDE:   newproc();
310                                         startproc(0, CLMAIN);
311                         case INSIDE:    parstate = INDCL;
312                         case INDCL:     break;
314                         default:
315                                 dclerr("declaration among executables", 0);
316                         }
317                 }
318         ;