|
|
1.1 ! root 1: spec: dcl ! 2: | common ! 3: | external ! 4: | intrinsic ! 5: | equivalence ! 6: | data ! 7: | implicit ! 8: | SSAVE ! 9: { NO66("SAVE statement"); ! 10: saveall = YES; } ! 11: | SSAVE savelist ! 12: { NO66("SAVE statement"); } ! 13: | SFORMAT ! 14: { fmtstmt(thislabel); setfmt(thislabel); } ! 15: | SPARAM in_dcl SLPAR paramlist SRPAR ! 16: { NO66("PARAMETER statement"); } ! 17: ; ! 18: ! 19: dcl: type opt_comma name in_dcl dims lengspec ! 20: { settype($3, $1, $6); ! 21: if(ndim>0) setbound($3,ndim,dims); ! 22: } ! 23: | dcl SCOMMA name dims lengspec ! 24: { settype($3, $1, $5); ! 25: if(ndim>0) setbound($3,ndim,dims); ! 26: } ! 27: ; ! 28: ! 29: type: typespec lengspec ! 30: { varleng = $2; } ! 31: ; ! 32: ! 33: typespec: typename ! 34: { varleng = ($1<0 || $1==TYLONG ? 0 : typesize[$1]); } ! 35: ; ! 36: ! 37: typename: SINTEGER { $$ = TYLONG; } ! 38: | SREAL { $$ = TYREAL; } ! 39: | SCOMPLEX { $$ = TYCOMPLEX; } ! 40: | SDOUBLE { $$ = TYDREAL; } ! 41: | SDCOMPLEX { NOEXT("DOUBLE COMPLEX statement"); $$ = TYDCOMPLEX; } ! 42: | SLOGICAL { $$ = TYLOGICAL; } ! 43: | SCHARACTER { NO66("CHARACTER statement"); $$ = TYCHAR; } ! 44: | SUNDEFINED { $$ = TYUNKNOWN; } ! 45: | SDIMENSION { $$ = TYUNKNOWN; } ! 46: | SAUTOMATIC { NOEXT("AUTOMATIC statement"); $$ = - STGAUTO; } ! 47: | SSTATIC { NOEXT("STATIC statement"); $$ = - STGBSS; } ! 48: ; ! 49: ! 50: lengspec: ! 51: { $$ = varleng; } ! 52: | SSTAR expr ! 53: { ! 54: NO66("length specification *n"); ! 55: if( ! ISICON($2) ) ! 56: { ! 57: $$ = 0; ! 58: dclerr("length must be an integer constant", 0); ! 59: } ! 60: else $$ = $2->const.ci; ! 61: } ! 62: | SSTAR SLPAR SSTAR SRPAR ! 63: { NO66("length specification *(*)"); $$ = 0; } ! 64: ; ! 65: ! 66: common: SCOMMON in_dcl var ! 67: { incomm( $$ = comblock(0, 0) , $3 ); } ! 68: | SCOMMON in_dcl comblock var ! 69: { $$ = $3; incomm($3, $4); } ! 70: | common opt_comma comblock opt_comma var ! 71: { $$ = $3; incomm($3, $5); } ! 72: | common SCOMMA var ! 73: { incomm($1, $3); } ! 74: ; ! 75: ! 76: comblock: SCONCAT ! 77: { $$ = comblock(0, 0); } ! 78: | SSLASH SNAME SSLASH ! 79: { $$ = comblock(toklen, token); } ! 80: ; ! 81: ! 82: external: SEXTERNAL in_dcl name ! 83: { setext($3); } ! 84: | external SCOMMA name ! 85: { setext($3); } ! 86: ; ! 87: ! 88: intrinsic: SINTRINSIC in_dcl name ! 89: { NO66("INTRINSIC statement"); setintr($3); } ! 90: | intrinsic SCOMMA name ! 91: { setintr($3); } ! 92: ; ! 93: ! 94: equivalence: SEQUIV in_dcl equivset ! 95: | equivalence SCOMMA equivset ! 96: ; ! 97: ! 98: equivset: SLPAR equivlist SRPAR ! 99: { ! 100: struct Equivblock *p; ! 101: if(nequiv >= MAXEQUIV) ! 102: many("equivalences", 'q'); ! 103: p = & eqvclass[nequiv++]; ! 104: p->eqvinit = 0; ! 105: p->eqvbottom = 0; ! 106: p->eqvtop = 0; ! 107: p->equivs = $2; ! 108: } ! 109: ; ! 110: ! 111: equivlist: lhs ! 112: { $$ = ALLOC(Eqvchain); $$->eqvitem = $1; } ! 113: | equivlist SCOMMA lhs ! 114: { $$ = ALLOC(Eqvchain); $$->eqvitem = $3; $$->nextp = $1; } ! 115: ; ! 116: ! 117: data: SDATA in_data datalist ! 118: | data opt_comma datalist ! 119: ; ! 120: ! 121: in_data: ! 122: { if(parstate == OUTSIDE) ! 123: { ! 124: newproc(); ! 125: startproc(0, CLMAIN); ! 126: } ! 127: if(parstate < INDATA) ! 128: { ! 129: enddcl(); ! 130: parstate = INDATA; ! 131: } ! 132: } ! 133: ; ! 134: ! 135: datalist: datavarlist SSLASH vallist SSLASH ! 136: { ftnint junk; ! 137: if(nextdata(&junk,&junk) != NULL) ! 138: { ! 139: err("too few initializers"); ! 140: curdtp = NULL; ! 141: } ! 142: frdata($1); ! 143: frrpl(); ! 144: } ! 145: ; ! 146: ! 147: vallist: { toomanyinit = NO; } val ! 148: | vallist SCOMMA val ! 149: ; ! 150: ! 151: val: value ! 152: { dataval(NULL, $1); } ! 153: | simple SSTAR value ! 154: { dataval($1, $3); } ! 155: ; ! 156: ! 157: value: simple ! 158: | addop simple ! 159: { if( $1==OPMINUS && ISCONST($2) ) ! 160: consnegop($2); ! 161: $$ = $2; ! 162: } ! 163: | complex_const ! 164: | bit_const ! 165: ; ! 166: ! 167: savelist: saveitem ! 168: | savelist SCOMMA saveitem ! 169: ; ! 170: ! 171: saveitem: name ! 172: { int k; ! 173: $1->vsave = 1; ! 174: k = $1->vstg; ! 175: if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) ) ! 176: dclerr("can only save static variables", $1); ! 177: } ! 178: | comblock ! 179: { $1->extsave = 1; } ! 180: ; ! 181: ! 182: paramlist: paramitem ! 183: | paramlist SCOMMA paramitem ! 184: ; ! 185: ! 186: paramitem: name SEQUALS expr ! 187: { if($1->vclass == CLUNKNOWN) ! 188: { $1->vclass = CLPARAM; ! 189: $1->paramval = $3; ! 190: } ! 191: else dclerr("cannot make %s parameter", $1); ! 192: } ! 193: ; ! 194: ! 195: var: name dims ! 196: { if(ndim>0) setbounds($1, ndim, dims); } ! 197: ; ! 198: ! 199: datavar: lhs ! 200: { ptr np; ! 201: vardcl(np = $1->namep); ! 202: if(np->vstg == STGBSS) ! 203: np->vstg = STGINIT; ! 204: else if(np->vstg == STGCOMMON) ! 205: extsymtab[np->vardesc.varno].extinit = YES; ! 206: else if(np->vstg==STGEQUIV) ! 207: eqvclass[np->vardesc.varno].eqvinit = YES; ! 208: else if(np->vstg != STGINIT) ! 209: dclerr("inconsistent storage classes", np); ! 210: $$ = mkchain($1, 0); ! 211: } ! 212: | SLPAR datavarlist SCOMMA dospec SRPAR ! 213: { chainp p; struct Impldoblock *q; ! 214: q = ALLOC(Impldoblock); ! 215: q->tag = TIMPLDO; ! 216: q->varnp = $4->datap; ! 217: p = $4->nextp; ! 218: if(p) { q->implb = p->datap; p = p->nextp; } ! 219: if(p) { q->impub = p->datap; p = p->nextp; } ! 220: if(p) { q->impstep = p->datap; p = p->nextp; } ! 221: frchain( & ($4) ); ! 222: $$ = mkchain(q, 0); ! 223: q->datalist = hookup($2, $$); ! 224: } ! 225: ; ! 226: ! 227: datavarlist: datavar ! 228: { curdtp = $1; curdtelt = 0; } ! 229: | datavarlist SCOMMA datavar ! 230: { $$ = hookup($1, $3); } ! 231: ; ! 232: ! 233: dims: ! 234: { ndim = 0; } ! 235: | SLPAR dimlist SRPAR ! 236: ; ! 237: ! 238: dimlist: { ndim = 0; } dim ! 239: | dimlist SCOMMA dim ! 240: ; ! 241: ! 242: dim: ubound ! 243: { if(ndim == maxdim) ! 244: err("too many dimensions"); ! 245: else if(ndim < maxdim) ! 246: { dims[ndim].lb = 0; ! 247: dims[ndim].ub = $1; ! 248: } ! 249: ++ndim; ! 250: } ! 251: | expr SCOLON ubound ! 252: { if(ndim == maxdim) ! 253: err("too many dimensions"); ! 254: else if(ndim < maxdim) ! 255: { dims[ndim].lb = $1; ! 256: dims[ndim].ub = $3; ! 257: } ! 258: ++ndim; ! 259: } ! 260: ; ! 261: ! 262: ubound: SSTAR ! 263: { $$ = 0; } ! 264: | expr ! 265: ; ! 266: ! 267: labellist: label ! 268: { nstars = 1; labarray[0] = $1; } ! 269: | labellist SCOMMA label ! 270: { if(nstars < MAXLABLIST) labarray[nstars++] = $3; } ! 271: ; ! 272: ! 273: label: labelval ! 274: { ! 275: if($1 == 0) ! 276: execerr("illegal label", 0); ! 277: else { ! 278: if($1->labinacc) ! 279: warn1("illegal branch to inner block, statement %s", ! 280: convic( (ftnint) ($1->stateno) )); ! 281: else if($1->labdefined == NO) ! 282: $1->blklevel = blklevel; ! 283: $1->labused = YES; ! 284: if($1->labtype == LABFORMAT) ! 285: err("may not branch to a format"); ! 286: else ! 287: $1->labtype = LABEXEC; ! 288: } ! 289: } ! 290: ; ! 291: ! 292: labelval: SICON ! 293: { $$ = mklabel( convci(toklen, token) ); } ! 294: ; ! 295: ! 296: implicit: SIMPLICIT in_dcl implist ! 297: { NO66("IMPLICIT statement"); } ! 298: | implicit SCOMMA implist ! 299: ; ! 300: ! 301: implist: imptype SLPAR letgroups SRPAR ! 302: ; ! 303: ! 304: imptype: { needkwd = 1; } type ! 305: { vartype = $2; } ! 306: ; ! 307: ! 308: letgroups: letgroup ! 309: | letgroups SCOMMA letgroup ! 310: ; ! 311: ! 312: letgroup: letter ! 313: { setimpl(vartype, varleng, $1, $1); } ! 314: | letter SMINUS letter ! 315: { setimpl(vartype, varleng, $1, $3); } ! 316: ; ! 317: ! 318: letter: SNAME ! 319: { if(toklen!=1 || token[0]<'a' || token[0]>'z') ! 320: { ! 321: dclerr("implicit item must be single letter", 0); ! 322: $$ = 0; ! 323: } ! 324: else $$ = token[0]; ! 325: } ! 326: ; ! 327: ! 328: in_dcl: ! 329: { switch(parstate) ! 330: { ! 331: case OUTSIDE: newproc(); ! 332: startproc(0, CLMAIN); ! 333: case INSIDE: parstate = INDCL; ! 334: case INDCL: break; ! 335: ! 336: default: ! 337: dclerr("declaration among executables", 0); ! 338: } ! 339: } ! 340: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.