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