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