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