|
|
1.1 ! root 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.head 5.1 (Berkeley) 6/7/85 ! 7: */ ! 8: ! 9: /* ! 10: * gram.head ! 11: * ! 12: * First part of the f77 grammar, f77 compiler pass 1. ! 13: * ! 14: * University of Utah CS Dept modification history: ! 15: * ! 16: * $Log: gram.head,v $ ! 17: * Revision 3.2 84/11/06 17:40:52 donn ! 18: * Fixed bug with redundant labels causing errors when they appear on (e.g.) ! 19: * PROGRAM statements. ! 20: * ! 21: * Revision 3.1 84/10/13 00:22:16 donn ! 22: * Merged Jerry Berkman's version into mine. ! 23: * ! 24: * Revision 2.2 84/08/04 21:13:02 donn ! 25: * Moved some code out of gram.head into gram.exec in accordance with ! 26: * Jerry Berkman's fixes to make ASSIGNs work right. ! 27: * ! 28: * Revision 2.1 84/07/19 12:03:20 donn ! 29: * Changed comment headers for UofU. ! 30: * ! 31: * Revision 1.2 84/03/23 22:43:06 donn ! 32: * The subroutine argument temporary fixes from Bob Corbett didn't take into ! 33: * account the fact that the code generator collects all the assignments to ! 34: * temporaries at the start of a statement -- hence the temporaries need to ! 35: * be initialized once per statement instead of once per call. ! 36: * ! 37: */ ! 38: ! 39: %{ ! 40: # include "defs.h" ! 41: # include "data.h" ! 42: ! 43: #ifdef SDB ! 44: # include <a.out.h> ! 45: ! 46: # ifndef N_SO ! 47: # include <stab.h> ! 48: # endif ! 49: #endif ! 50: ! 51: static int equivlisterr; ! 52: static int do_name_err; ! 53: static int nstars; ! 54: static int ndim; ! 55: static int vartype; ! 56: static ftnint varleng; ! 57: static struct { expptr lb, ub; } dims[MAXDIM+1]; ! 58: static struct Labelblock *labarray[MAXLABLIST]; ! 59: static int lastwasbranch = NO; ! 60: static int thiswasbranch = NO; ! 61: extern ftnint yystno; ! 62: extern flag intonly; ! 63: ! 64: ftnint convci(); ! 65: double convcd(); ! 66: expptr mklogcon(), mkaddcon(), mkrealcon(), mkstrcon(), mkbitcon(); ! 67: expptr mkcxcon(); ! 68: struct Listblock *mklist(); ! 69: struct Listblock *mklist(); ! 70: struct Impldoblock *mkiodo(); ! 71: struct Extsym *comblock(); ! 72: ! 73: %} ! 74: ! 75: /* Specify precedences and associativities. */ ! 76: ! 77: %union { ! 78: int ival; ! 79: char *charpval; ! 80: chainp chval; ! 81: tagptr tagval; ! 82: expptr expval; ! 83: struct Labelblock *labval; ! 84: struct Nameblock *namval; ! 85: struct Eqvchain *eqvval; ! 86: struct Extsym *extval; ! 87: union Vexpr *vexpval; ! 88: struct ValList *drvals; ! 89: struct Vlist *dvals; ! 90: union Delt *deltp; ! 91: struct Rpair *rpairp; ! 92: struct Elist *elistp; ! 93: } ! 94: ! 95: %left SCOMMA ! 96: %nonassoc SCOLON ! 97: %right SEQUALS ! 98: %left SEQV SNEQV ! 99: %left SOR ! 100: %left SAND ! 101: %left SNOT ! 102: %nonassoc SLT SGT SLE SGE SEQ SNE ! 103: %left SCONCAT ! 104: %left SPLUS SMINUS ! 105: %left SSTAR SSLASH ! 106: %right SPOWER ! 107: ! 108: %start program ! 109: %type <labval> thislabel label assignlabel ! 110: %type <tagval> other inelt ! 111: %type <ival> lengspec type typespec typename dcl letter addop relop stop nameeq ! 112: %type <charpval> filename ! 113: %type <chval> namelistlist funarglist funargs dospec ! 114: %type <chval> callarglist arglist args exprlist inlist outlist out2 substring ! 115: %type <namval> name arg call var entryname progname ! 116: %type <expval> lhs expr uexpr opt_expr fexpr unpar_fexpr ! 117: %type <expval> ubound callarg complex_const simple_const ! 118: %type <extval> common comblock ! 119: %type <eqvval> equivlist ! 120: %type <expval> datavalue real_const unsignedreal bit_const ! 121: %type <vexpval> unsignedint int_const ! 122: %type <vexpval> dataname ! 123: %type <vexpval> iconprimary iconfactor iconterm iconexpr opticonexpr ! 124: %type <drvals> datarval datarvals ! 125: %type <dvals> iconexprlist datasubs ! 126: %type <deltp> dataelt dataimplieddo datalval ! 127: %type <rpairp> datarange ! 128: %type <elistp> dlist datalvals ! 129: ! 130: %% ! 131: ! 132: program: ! 133: | program stat SEOS ! 134: ; ! 135: ! 136: stat: thislabel entry ! 137: { lastwasbranch = NO; } ! 138: | thislabel spec ! 139: | thislabel exec ! 140: { if($1 && ($1->labelno==dorange)) ! 141: enddo($1->labelno); ! 142: if(lastwasbranch && thislabel==NULL) ! 143: warn("statement cannot be reached"); ! 144: lastwasbranch = thiswasbranch; ! 145: thiswasbranch = NO; ! 146: if($1) ! 147: { ! 148: if($1->labtype == LABFORMAT) ! 149: err("label already that of a format"); ! 150: else ! 151: $1->labtype = LABEXEC; ! 152: } ! 153: if(!optimflag) ! 154: { ! 155: argtemplist = hookup(argtemplist, activearglist); ! 156: activearglist = CHNULL; ! 157: } ! 158: } ! 159: | thislabel SINCLUDE filename ! 160: { doinclude( $3 ); } ! 161: | thislabel SEND end_spec ! 162: { lastwasbranch = NO; endproc(); } ! 163: | thislabel SUNKNOWN ! 164: { execerr("unclassifiable statement", CNULL); flline(); }; ! 165: | error ! 166: { flline(); needkwd = NO; inioctl = NO; ! 167: yyerrok; yyclearin; } ! 168: ; ! 169: ! 170: thislabel: SLABEL ! 171: { ! 172: #ifdef SDB ! 173: if( sdbflag ) ! 174: { ! 175: linenostab(lineno); ! 176: } ! 177: #endif ! 178: ! 179: if(yystno != 0) ! 180: { ! 181: $$ = thislabel = mklabel(yystno); ! 182: if(thislabel->labdefined) ! 183: execerr("label %s already defined", ! 184: convic(thislabel->stateno) ); ! 185: else { ! 186: if(thislabel->blklevel!=0 && thislabel->blklevel<blklevel ! 187: && thislabel->labtype!=LABFORMAT) ! 188: warn1("there is a branch to label %s from outside block", ! 189: convic( (ftnint) (thislabel->stateno) ) ); ! 190: thislabel->blklevel = blklevel; ! 191: thislabel->labdefined = YES; ! 192: } ! 193: } ! 194: else $$ = thislabel = NULL; ! 195: } ! 196: ; ! 197: ! 198: entry: SPROGRAM new_proc progname ! 199: {startproc($3, CLMAIN); } ! 200: | SBLOCK new_proc progname ! 201: { if($3) NO66("named BLOCKDATA"); ! 202: startproc($3, CLBLOCK); } ! 203: | SSUBROUTINE new_proc entryname arglist ! 204: { entrypt(CLPROC, TYSUBR, (ftnint) 0, $3, $4); } ! 205: | SFUNCTION new_proc entryname arglist ! 206: { entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, $3, $4); } ! 207: | type SFUNCTION new_proc entryname arglist ! 208: { entrypt(CLPROC, $1, varleng, $4, $5); } ! 209: | SENTRY entryname arglist ! 210: { if(parstate==OUTSIDE || procclass==CLMAIN ! 211: || procclass==CLBLOCK) ! 212: execerr("misplaced entry statement", CNULL); ! 213: entrypt(CLENTRY, 0, (ftnint) 0, $2, $3); ! 214: } ! 215: ; ! 216: ! 217: new_proc: ! 218: { newproc(); } ! 219: ; ! 220: ! 221: entryname: name ! 222: ; ! 223: ! 224: name: SNAME ! 225: { $$ = mkname(toklen, token); } ! 226: ; ! 227: ! 228: progname: { $$ = NULL; } ! 229: | entryname ! 230: ; ! 231: ! 232: arglist: ! 233: { $$ = 0; } ! 234: | SLPAR SRPAR ! 235: { NO66(" () argument list"); ! 236: $$ = 0; } ! 237: | SLPAR args SRPAR ! 238: {$$ = $2; } ! 239: ; ! 240: ! 241: args: arg ! 242: { $$ = ($1 ? mkchain($1,CHNULL) : CHNULL ); } ! 243: | args SCOMMA arg ! 244: { if($3) $1 = $$ = hookup($1, mkchain($3,CHNULL)); } ! 245: ; ! 246: ! 247: arg: name ! 248: { if(($1->vstg!=STGUNKNOWN && $1->vstg!=STGARG) ! 249: || ($1->vclass == CLPARAM) ) { ! 250: dclerr("name declared as argument after use", $1); ! 251: $$ = NULL; ! 252: } else ! 253: $1->vstg = STGARG; ! 254: } ! 255: | SSTAR ! 256: { NO66("altenate return argument"); ! 257: $$ = 0; substars = YES; } ! 258: ; ! 259: ! 260: ! 261: ! 262: filename: SHOLLERITH ! 263: { ! 264: char *s; ! 265: s = copyn(toklen+1, token); ! 266: s[toklen] = '\0'; ! 267: $$ = s; ! 268: } ! 269: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.