|
|
1.1 ! root 1: /**************************************************************** ! 2: Copyright 1990, 1993 by AT&T Bell Laboratories, Bellcore. ! 3: ! 4: Permission to use, copy, modify, and distribute this software ! 5: and its documentation for any purpose and without fee is hereby ! 6: granted, provided that the above copyright notice appear in all ! 7: copies and that both that the copyright notice and this ! 8: permission notice and warranty disclaimer appear in supporting ! 9: documentation, and that the names of AT&T Bell Laboratories or ! 10: Bellcore or any of their entities not be used in advertising or ! 11: publicity pertaining to distribution of the software without ! 12: specific, written prior permission. ! 13: ! 14: AT&T and Bellcore disclaim all warranties with regard to this ! 15: software, including all implied warranties of merchantability ! 16: and fitness. In no event shall AT&T or Bellcore be liable for ! 17: any special, indirect or consequential damages or any damages ! 18: whatsoever resulting from loss of use, data or profits, whether ! 19: in an action of contract, negligence or other tortious action, ! 20: arising out of or in connection with the use or performance of ! 21: this software. ! 22: ****************************************************************/ ! 23: ! 24: %{ ! 25: #include "defs.h" ! 26: #include "p1defs.h" ! 27: ! 28: static int nstars; /* Number of labels in an ! 29: alternate return CALL */ ! 30: static int datagripe; ! 31: static int ndim; ! 32: static int vartype; ! 33: int new_dcl; ! 34: static ftnint varleng; ! 35: static struct Dims dims[MAXDIM+1]; ! 36: extern struct Labelblock **labarray; /* Labels in an alternate ! 37: return CALL */ ! 38: extern int maxlablist; ! 39: ! 40: /* The next two variables are used to verify that each statement might be reached ! 41: during runtime. lastwasbranch is tested only in the defintion of the ! 42: stat: nonterminal. */ ! 43: ! 44: int lastwasbranch = NO; ! 45: static int thiswasbranch = NO; ! 46: extern ftnint yystno; ! 47: extern flag intonly; ! 48: static chainp datastack; ! 49: extern long laststfcn, thisstno; ! 50: extern int can_include; /* for netlib */ ! 51: ! 52: ftnint convci(); ! 53: Addrp nextdata(); ! 54: expptr mklogcon(), mkaddcon(), mkrealcon(), mkstrcon(), mkbitcon(); ! 55: expptr mkcxcon(); ! 56: struct Listblock *mklist(); ! 57: struct Listblock *mklist(); ! 58: struct Impldoblock *mkiodo(); ! 59: Extsym *comblock(); ! 60: #define ESNULL (Extsym *)0 ! 61: #define NPNULL (Namep)0 ! 62: #define LBNULL (struct Listblock *)0 ! 63: extern void freetemps(), make_param(); ! 64: ! 65: static void ! 66: pop_datastack() { ! 67: chainp d0 = datastack; ! 68: if (d0->datap) ! 69: curdtp = (chainp)d0->datap; ! 70: datastack = d0->nextp; ! 71: d0->nextp = 0; ! 72: frchain(&d0); ! 73: } ! 74: ! 75: %} ! 76: ! 77: /* Specify precedences and associativities. */ ! 78: ! 79: %union { ! 80: int ival; ! 81: ftnint lval; ! 82: char *charpval; ! 83: chainp chval; ! 84: tagptr tagval; ! 85: expptr expval; ! 86: struct Labelblock *labval; ! 87: struct Nameblock *namval; ! 88: struct Eqvchain *eqvval; ! 89: Extsym *extval; ! 90: } ! 91: ! 92: %left SCOMMA ! 93: %nonassoc SCOLON ! 94: %right SEQUALS ! 95: %left SEQV SNEQV ! 96: %left SOR ! 97: %left SAND ! 98: %left SNOT ! 99: %nonassoc SLT SGT SLE SGE SEQ SNE ! 100: %left SCONCAT ! 101: %left SPLUS SMINUS ! 102: %left SSTAR SSLASH ! 103: %right SPOWER ! 104: ! 105: %start program ! 106: %type <labval> thislabel label assignlabel ! 107: %type <tagval> other inelt ! 108: %type <ival> type typespec typename dcl letter addop relop stop nameeq ! 109: %type <lval> lengspec ! 110: %type <charpval> filename ! 111: %type <chval> datavar datavarlist namelistlist funarglist funargs ! 112: %type <chval> dospec dospecw ! 113: %type <chval> callarglist arglist args exprlist inlist outlist out2 substring ! 114: %type <namval> name arg call var ! 115: %type <expval> lhs expr uexpr opt_expr fexpr unpar_fexpr ! 116: %type <expval> ubound simple value callarg complex_const simple_const bit_const ! 117: %type <extval> common comblock entryname progname ! 118: %type <eqvval> equivlist ! 119: ! 120: %% ! 121: ! 122: program: ! 123: | program stat SEOS ! 124: ; ! 125: ! 126: stat: thislabel entry ! 127: { ! 128: /* stat: is the nonterminal for Fortran statements */ ! 129: ! 130: lastwasbranch = NO; } ! 131: | thislabel spec ! 132: | thislabel exec ! 133: { /* forbid further statement function definitions... */ ! 134: if (parstate == INDATA && laststfcn != thisstno) ! 135: parstate = INEXEC; ! 136: thisstno++; ! 137: if($1 && ($1->labelno==dorange)) ! 138: enddo($1->labelno); ! 139: if(lastwasbranch && thislabel==NULL) ! 140: warn("statement cannot be reached"); ! 141: lastwasbranch = thiswasbranch; ! 142: thiswasbranch = NO; ! 143: if($1) ! 144: { ! 145: if($1->labtype == LABFORMAT) ! 146: err("label already that of a format"); ! 147: else ! 148: $1->labtype = LABEXEC; ! 149: } ! 150: freetemps(); ! 151: } ! 152: | thislabel SINCLUDE filename ! 153: { if (can_include) ! 154: doinclude( $3 ); ! 155: else { ! 156: fprintf(diagfile, "Cannot open file %s\n", $3); ! 157: done(1); ! 158: } ! 159: } ! 160: | thislabel SEND end_spec ! 161: { if ($1) ! 162: lastwasbranch = NO; ! 163: endproc(); /* lastwasbranch = NO; -- set in endproc() */ ! 164: } ! 165: | thislabel SUNKNOWN ! 166: { extern void unclassifiable(); ! 167: unclassifiable(); ! 168: ! 169: /* flline flushes the current line, ignoring the rest of the text there */ ! 170: ! 171: flline(); }; ! 172: | error ! 173: { flline(); needkwd = NO; inioctl = NO; ! 174: yyerrok; yyclearin; } ! 175: ; ! 176: ! 177: thislabel: SLABEL ! 178: { ! 179: if(yystno != 0) ! 180: { ! 181: $$ = thislabel = mklabel(yystno); ! 182: if( ! headerdone ) { ! 183: if (procclass == CLUNKNOWN) ! 184: procclass = CLMAIN; ! 185: puthead(CNULL, procclass); ! 186: } ! 187: if(thislabel->labdefined) ! 188: execerr("label %s already defined", ! 189: convic(thislabel->stateno) ); ! 190: else { ! 191: if(thislabel->blklevel!=0 && thislabel->blklevel<blklevel ! 192: && thislabel->labtype!=LABFORMAT) ! 193: warn1("there is a branch to label %s from outside block", ! 194: convic( (ftnint) (thislabel->stateno) ) ); ! 195: thislabel->blklevel = blklevel; ! 196: thislabel->labdefined = YES; ! 197: if(thislabel->labtype != LABFORMAT) ! 198: p1_label((long)(thislabel - labeltab)); ! 199: } ! 200: } ! 201: else $$ = thislabel = NULL; ! 202: } ! 203: ; ! 204: ! 205: entry: SPROGRAM new_proc progname ! 206: {startproc($3, CLMAIN); } ! 207: | SPROGRAM new_proc progname progarglist ! 208: { warn("ignoring arguments to main program"); ! 209: /* hashclear(); */ ! 210: startproc($3, CLMAIN); } ! 211: | SBLOCK new_proc progname ! 212: { if($3) NO66("named BLOCKDATA"); ! 213: startproc($3, CLBLOCK); } ! 214: | SSUBROUTINE new_proc entryname arglist ! 215: { entrypt(CLPROC, TYSUBR, (ftnint) 0, $3, $4); } ! 216: | SFUNCTION new_proc entryname arglist ! 217: { entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, $3, $4); } ! 218: | type SFUNCTION new_proc entryname arglist ! 219: { entrypt(CLPROC, $1, varleng, $4, $5); } ! 220: | SENTRY entryname arglist ! 221: { if(parstate==OUTSIDE || procclass==CLMAIN ! 222: || procclass==CLBLOCK) ! 223: execerr("misplaced entry statement", CNULL); ! 224: entrypt(CLENTRY, 0, (ftnint) 0, $2, $3); ! 225: } ! 226: ; ! 227: ! 228: new_proc: ! 229: { newproc(); } ! 230: ; ! 231: ! 232: entryname: name ! 233: { $$ = newentry($1, 1); } ! 234: ; ! 235: ! 236: name: SNAME ! 237: { $$ = mkname(token); } ! 238: ; ! 239: ! 240: progname: { $$ = NULL; } ! 241: | entryname ! 242: ; ! 243: ! 244: progarglist: ! 245: SLPAR SRPAR ! 246: | SLPAR progargs SRPAR ! 247: ; ! 248: ! 249: progargs: progarg ! 250: | progargs SCOMMA progarg ! 251: ; ! 252: ! 253: progarg: SNAME ! 254: | SNAME SEQUALS SNAME ! 255: ; ! 256: ! 257: arglist: ! 258: { $$ = 0; } ! 259: | SLPAR SRPAR ! 260: { NO66(" () argument list"); ! 261: $$ = 0; } ! 262: | SLPAR args SRPAR ! 263: {$$ = $2; } ! 264: ; ! 265: ! 266: args: arg ! 267: { $$ = ($1 ? mkchain((char *)$1,CHNULL) : CHNULL ); } ! 268: | args SCOMMA arg ! 269: { if($3) $1 = $$ = mkchain((char *)$3, $1); } ! 270: ; ! 271: ! 272: arg: name ! 273: { if($1->vstg!=STGUNKNOWN && $1->vstg!=STGARG) ! 274: dclerr("name declared as argument after use", $1); ! 275: $1->vstg = STGARG; ! 276: } ! 277: | SSTAR ! 278: { NO66("altenate return argument"); ! 279: ! 280: /* substars means that '*'ed formal parameters should be replaced. ! 281: This is used to specify alternate return labels; in theory, only ! 282: parameter slots which have '*' should accept the statement labels. ! 283: This compiler chooses to ignore the '*'s in the formal declaration, and ! 284: always return the proper value anyway. ! 285: ! 286: This variable is only referred to in proc.c */ ! 287: ! 288: $$ = 0; substars = YES; } ! 289: ; ! 290: ! 291: ! 292: ! 293: filename: SHOLLERITH ! 294: { ! 295: char *s; ! 296: s = copyn(toklen+1, token); ! 297: s[toklen] = '\0'; ! 298: $$ = s; ! 299: } ! 300: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.