|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)gram.dcl 5.4 (Berkeley) 1/30/86
7: */
8:
9: /*
10: * Grammar for declarations, f77 compiler, 4.2 BSD.
11: *
12: * University of Utah CS Dept modification history:
13: *
14: * $Log: gram.dcl,v $
15: * Revision 5.7 86/01/30 15:20:27 donn
16: * Improve error message reporting.
17: *
18: * Revision 5.6 85/12/18 20:10:26 donn
19: * Enforce more strict ordering of specification statements. per the
20: * standard. Some duplicated code is now concentrated in the nonterminal
21: * 'inside', which is used to indicate the start of a program.
22: *
23: * Revision 5.5 85/11/25 00:23:59 donn
24: * 4.3 beta
25: *
26: * Revision 5.4 85/08/20 23:37:33 donn
27: * Fix from Jerry Berkman to prevent length problems with -r8.
28: *
29: * Revision 5.3 85/08/15 20:16:29 donn
30: * SAVE statements are not executable...
31: *
32: * Revision 5.2 85/08/10 04:24:56 donn
33: * Jerry Berkman's changes to handle the -r8/double precision flag.
34: *
35: * Revision 5.1 85/08/10 03:47:18 donn
36: * 4.3 alpha
37: *
38: * Revision 3.2 84/11/12 18:36:26 donn
39: * A side effect of removing the ability of labels to define the start of
40: * a program is that format statements have to do the job now...
41: *
42: * Revision 3.1 84/10/13 00:26:54 donn
43: * Installed Jerry Berkman's version; added comment header.
44: *
45: */
46:
47: spec: dcl
48: | common
49: | external
50: | intrinsic
51: | equivalence
52: | implicit
53: | data
54: | namelist
55: | SSAVE in_dcl
56: { NO66("SAVE statement");
57: saveall = YES; }
58: | SSAVE in_dcl savelist
59: { NO66("SAVE statement"); }
60: | SFORMAT inside
61: {
62: fmtstmt(thislabel);
63: setfmt(thislabel);
64: }
65: | SPARAM in_param SLPAR paramlist SRPAR
66: { NO66("PARAMETER statement"); }
67: ;
68:
69: dcl: type opt_comma name in_dcl dims lengspec
70: { settype($3, $1, $6);
71: if(ndim>0) setbound($3,ndim,dims);
72: }
73: | dcl SCOMMA name dims lengspec
74: { settype($3, $1, $5);
75: if(ndim>0) setbound($3,ndim,dims);
76: }
77: ;
78:
79: type: typespec lengspec
80: { varleng = $2; }
81: ;
82:
83: typespec: typename
84: { varleng = ($1<0 || $1==TYLONG ? 0 : typesize[$1]);
85: vartype = $1;
86: }
87: ;
88:
89: typename: SINTEGER { $$ = TYLONG; }
90: | SREAL { $$ = dblflag ? TYDREAL : TYREAL; }
91: | SCOMPLEX { $$ = dblflag ? TYDCOMPLEX : TYCOMPLEX; }
92: | SDOUBLE { $$ = TYDREAL; }
93: | SDCOMPLEX { NOEXT("DOUBLE COMPLEX statement"); $$ = TYDCOMPLEX; }
94: | SLOGICAL { $$ = TYLOGICAL; }
95: | SCHARACTER { NO66("CHARACTER statement"); $$ = TYCHAR; }
96: | SUNDEFINED { $$ = TYUNKNOWN; }
97: | SDIMENSION { $$ = TYUNKNOWN; }
98: | SAUTOMATIC { NOEXT("AUTOMATIC statement"); $$ = - STGAUTO; }
99: | SSTATIC { NOEXT("STATIC statement"); $$ = - STGBSS; }
100: ;
101:
102: lengspec:
103: { $$ = varleng; }
104: | SSTAR intonlyon expr intonlyoff
105: {
106: expptr p;
107: int typlen;
108:
109: p = $3;
110: NO66("length specification *n");
111: if( ! ISICON(p) )
112: {
113: $$ = 0;
114: dclerr("length expression is not type integer", PNULL);
115: }
116: else if ( p->constblock.const.ci < 0 )
117: {
118: $$ = 0;
119: dclerr("illegal negative length", PNULL);
120: }
121: else if( dblflag )
122: {
123: typlen = p->constblock.const.ci;
124: if( vartype == TYDREAL && typlen == 4 ) $$ = 8;
125: else if( vartype == TYDCOMPLEX && typlen == 8 ) $$ = 16;
126: else $$ = typlen;
127: }
128: else
129: $$ = p->constblock.const.ci;
130: }
131: | SSTAR intonlyon SLPAR SSTAR SRPAR intonlyoff
132: { NO66("length specification *(*)"); $$ = -1; }
133: ;
134:
135: common: SCOMMON in_dcl var
136: { incomm( $$ = comblock(0, CNULL) , $3 ); }
137: | SCOMMON in_dcl comblock var
138: { $$ = $3; incomm($3, $4); }
139: | common opt_comma comblock opt_comma var
140: { $$ = $3; incomm($3, $5); }
141: | common SCOMMA var
142: { incomm($1, $3); }
143: ;
144:
145: comblock: SCONCAT
146: { $$ = comblock(0, CNULL); }
147: | SSLASH SNAME SSLASH
148: { $$ = comblock(toklen, token); }
149: ;
150:
151: external: SEXTERNAL in_dcl name
152: { setext($3); }
153: | external SCOMMA name
154: { setext($3); }
155: ;
156:
157: intrinsic: SINTRINSIC in_dcl name
158: { NO66("INTRINSIC statement"); setintr($3); }
159: | intrinsic SCOMMA name
160: { setintr($3); }
161: ;
162:
163: equivalence: SEQUIV in_dcl equivset
164: | equivalence SCOMMA equivset
165: ;
166:
167: equivset: SLPAR equivlist SRPAR
168: {
169: struct Equivblock *p;
170: if(nequiv >= maxequiv)
171: many("equivalences", 'q');
172: if( !equivlisterr ) {
173: p = & eqvclass[nequiv++];
174: p->eqvinit = NO;
175: p->eqvbottom = 0;
176: p->eqvtop = 0;
177: p->equivs = $2;
178: p->init = NO;
179: p->initoffset = 0;
180: }
181: }
182: ;
183:
184: equivlist: lhs
185: { $$=ALLOC(Eqvchain);
186: equivlisterr = 0;
187: if( $1->tag == TCONST ) {
188: equivlisterr = 1;
189: dclerr( "- constant in equivalence", NULL );
190: }
191: $$->eqvitem.eqvlhs = (struct Primblock *)$1;
192: }
193: | equivlist SCOMMA lhs
194: { $$=ALLOC(Eqvchain);
195: if( $3->tag == TCONST ) {
196: equivlisterr = 1;
197: dclerr( "constant in equivalence", NULL );
198: }
199: $$->eqvitem.eqvlhs = (struct Primblock *) $3;
200: $$->eqvnextp = $1;
201: }
202: ;
203:
204:
205: savelist: saveitem
206: | savelist SCOMMA saveitem
207: ;
208:
209: saveitem: name
210: { int k;
211: $1->vsave = YES;
212: k = $1->vstg;
213: if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT))
214: || ($1->vclass == CLPARAM) )
215: dclerr("can only save static variables", $1);
216: }
217: | comblock
218: { $1->extsave = 1; }
219: ;
220:
221: paramlist: paramitem
222: | paramlist SCOMMA paramitem
223: ;
224:
225: paramitem: name SEQUALS expr
226: { paramset( $1, $3 ); }
227: ;
228:
229: in_param: inside
230: { if(parstate > INDCL)
231: dclerr("parameter statement out of order", PNULL);
232: }
233: ;
234:
235: var: name dims
236: { if(ndim>0) setbound($1, ndim, dims); }
237: ;
238:
239:
240: dims:
241: { ndim = 0; }
242: | SLPAR dimlist SRPAR
243: ;
244:
245: dimlist: { ndim = 0; } dim
246: | dimlist SCOMMA dim
247: ;
248:
249: dim: ubound
250: { if(ndim == maxdim)
251: err("too many dimensions");
252: else if(ndim < maxdim)
253: { dims[ndim].lb = 0;
254: dims[ndim].ub = $1;
255: }
256: ++ndim;
257: }
258: | expr SCOLON ubound
259: { if(ndim == maxdim)
260: err("too many dimensions");
261: else if(ndim < maxdim)
262: { dims[ndim].lb = $1;
263: dims[ndim].ub = $3;
264: }
265: ++ndim;
266: }
267: ;
268:
269: ubound: SSTAR
270: { $$ = 0; }
271: | expr
272: ;
273:
274: labellist: label
275: { nstars = 1; labarray[0] = $1; }
276: | labellist SCOMMA label
277: { if(nstars < MAXLABLIST) labarray[nstars++] = $3; }
278: ;
279:
280: label: SICON
281: { $$ = execlab( convci(toklen, token) ); }
282: ;
283:
284: implicit: SIMPLICIT in_implicit implist
285: { NO66("IMPLICIT statement"); }
286: | implicit SCOMMA implist
287: ;
288:
289: implist: imptype SLPAR letgroups SRPAR
290: ;
291:
292: imptype: { needkwd = 1; } type
293: { vartype = $2; }
294: ;
295:
296: in_implicit: inside
297: { if(parstate >= INDCL)
298: dclerr("implicit statement out of order", PNULL);
299: }
300: ;
301:
302: letgroups: letgroup
303: | letgroups SCOMMA letgroup
304: ;
305:
306: letgroup: letter
307: { setimpl(vartype, varleng, $1, $1); }
308: | letter SMINUS letter
309: { setimpl(vartype, varleng, $1, $3); }
310: ;
311:
312: letter: SNAME
313: { if(toklen!=1 || token[0]<'a' || token[0]>'z')
314: {
315: dclerr("implicit item must be single letter", PNULL);
316: $$ = 0;
317: }
318: else $$ = token[0];
319: }
320: ;
321:
322: namelist: SNAMELIST
323: | namelist namelistentry
324: ;
325:
326: namelistentry: SSLASH name SSLASH namelistlist
327: {
328: if($2->vclass == CLUNKNOWN)
329: {
330: $2->vclass = CLNAMELIST;
331: $2->vtype = TYINT;
332: $2->vstg = STGINIT;
333: $2->varxptr.namelist = $4;
334: $2->vardesc.varno = ++lastvarno;
335: }
336: else dclerr("cannot be a namelist name", $2);
337: }
338: ;
339:
340: namelistlist: name
341: { $$ = mkchain($1, CHNULL); }
342: | namelistlist SCOMMA name
343: { $$ = hookup($1, mkchain($3, CHNULL)); }
344: ;
345:
346: inside:
347: { if(parstate < INSIDE)
348: {
349: newproc();
350: startproc(PNULL, CLMAIN);
351: parstate = INSIDE;
352: }
353: }
354: ;
355:
356: in_dcl: inside
357: { if(parstate < INDCL)
358: parstate = INDCL;
359: if(parstate > INDCL)
360: dclerr("declaration among executables", PNULL);
361: }
362: ;
363:
364: data: data1
365: {
366: if (overlapflag == YES)
367: warn("overlapping initializations");
368: }
369:
370: data1: SDATA in_data datapair
371: | data1 opt_comma datapair
372: ;
373:
374: in_data: inside
375: { if(parstate < INDATA)
376: {
377: enddcl();
378: parstate = INDATA;
379: }
380: overlapflag = NO;
381: }
382: ;
383:
384: datapair: datalvals SSLASH datarvals SSLASH
385: { savedata($1, $3); }
386: ;
387:
388: datalvals: datalval
389: { $$ = preplval(NULL, $1); }
390: | datalvals SCOMMA datalval
391: { $$ = preplval($1, $3); }
392: ;
393:
394: datarvals: datarval
395: | datarvals SCOMMA datarval
396: {
397: $3->next = $1;
398: $$ = $3;
399: }
400: ;
401:
402: datalval: dataname
403: { $$ = mkdlval($1, NULL, NULL); }
404: | dataname datasubs
405: { $$ = mkdlval($1, $2, NULL); }
406: | dataname datarange
407: { $$ = mkdlval($1, NULL, $2); }
408: | dataname datasubs datarange
409: { $$ = mkdlval($1, $2, $3); }
410: | dataimplieddo
411: ;
412:
413: dataname: SNAME { $$ = mkdname(toklen, token); }
414: ;
415:
416: datasubs: SLPAR iconexprlist SRPAR
417: { $$ = revvlist($2); }
418: ;
419:
420: datarange: SLPAR opticonexpr SCOLON opticonexpr SRPAR
421: { $$ = mkdrange($2, $4); }
422: ;
423:
424: iconexprlist: iconexpr
425: {
426: $$ = prepvexpr(NULL, $1);
427: }
428: | iconexprlist SCOMMA iconexpr
429: {
430: $$ = prepvexpr($1, $3);
431: }
432: ;
433:
434: opticonexpr: { $$ = NULL; }
435: | iconexpr { $$ = $1; }
436: ;
437:
438: dataimplieddo: SLPAR dlist SCOMMA dataname SEQUALS iconexprlist SRPAR
439: { $$ = mkdatado($2, $4, $6); }
440: ;
441:
442: dlist: dataelt
443: { $$ = preplval(NULL, $1); }
444: | dlist SCOMMA dataelt
445: { $$ = preplval($1, $3); }
446: ;
447:
448: dataelt: dataname datasubs
449: { $$ = mkdlval($1, $2, NULL); }
450: | dataname datarange
451: { $$ = mkdlval($1, NULL, $2); }
452: | dataname datasubs datarange
453: { $$ = mkdlval($1, $2, $3); }
454: | dataimplieddo
455: ;
456:
457: datarval: datavalue
458: {
459: static dvalue one = { DVALUE, NORMAL, 1 };
460:
461: $$ = mkdrval(&one, $1);
462: }
463: | dataname SSTAR datavalue
464: {
465: $$ = mkdrval($1, $3);
466: frvexpr($1);
467: }
468: | unsignedint SSTAR datavalue
469: {
470: $$ = mkdrval($1, $3);
471: frvexpr($1);
472: }
473: ;
474:
475: datavalue: dataname
476: {
477: $$ = evparam($1);
478: free((char *) $1);
479: }
480: | int_const
481: {
482: $$ = ivaltoicon($1);
483: frvexpr($1);
484: }
485:
486: | real_const
487: | complex_const
488: | STRUE { $$ = mklogcon(1); }
489: | SFALSE { $$ = mklogcon(0); }
490: | SHOLLERITH { $$ = mkstrcon(toklen, token); }
491: | SSTRING { $$ = mkstrcon(toklen, token); }
492: | bit_const
493: ;
494:
495: int_const: unsignedint
496: | SPLUS unsignedint
497: { $$ = $2; }
498: | SMINUS unsignedint
499: {
500: $$ = negival($2);
501: frvexpr($2);
502: }
503:
504: ;
505:
506: unsignedint: SICON { $$ = evicon(toklen, token); }
507: ;
508:
509: real_const: unsignedreal
510: | SPLUS unsignedreal
511: { $$ = $2; }
512: | SMINUS unsignedreal
513: {
514: consnegop($2);
515: $$ = $2;
516: }
517: ;
518:
519: unsignedreal: SRCON { $$ = mkrealcon(TYREAL, convcd(toklen, token)); }
520: | SDCON { $$ = mkrealcon(TYDREAL, convcd(toklen, token)); }
521: ;
522:
523: bit_const: SHEXCON { $$ = mkbitcon(4, toklen, token); }
524: | SOCTCON { $$ = mkbitcon(3, toklen, token); }
525: | SBITCON { $$ = mkbitcon(1, toklen, token); }
526: ;
527:
528: iconexpr: iconterm
529: | SPLUS iconterm
530: { $$ = $2; }
531: | SMINUS iconterm
532: { $$ = mkdexpr(OPNEG, NULL, $2); }
533: | iconexpr SPLUS iconterm
534: { $$ = mkdexpr(OPPLUS, $1, $3); }
535: | iconexpr SMINUS iconterm
536: { $$ = mkdexpr(OPMINUS, $1, $3); }
537: ;
538:
539: iconterm: iconfactor
540: | iconterm SSTAR iconfactor
541: { $$ = mkdexpr(OPSTAR, $1, $3); }
542: | iconterm SSLASH iconfactor
543: { $$ = mkdexpr(OPSLASH, $1, $3); }
544: ;
545:
546: iconfactor: iconprimary
547: | iconprimary SPOWER iconfactor
548: { $$ = mkdexpr(OPPOWER, $1, $3); }
549: ;
550:
551: iconprimary: SICON
552: { $$ = evicon(toklen, token); }
553: | dataname
554: | SLPAR iconexpr SRPAR
555: { $$ = $2; }
556: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.