static struct { ptr lb, ub; } dims[MAXDIM+1];
static struct Labelblock *labarray[MAXLABLIST];
static int lastwasbranch = NO;
static int thiswasbranch = NO;
struct Addrblock *nextdata(), *mkbitcon();
struct Constblock *mklogcon(), *mkaddcon(), *mkrealcon();
struct Constblock *mkstrcon(), *mkcxcon();
struct Listblock *mklist();
struct Listblock *mklist();
struct Impldoblock *mkiodo();
struct Extsym *comblock();
/* Specify precedences and associativies. */
%nonassoc SLT SGT SLE SGE SEQ SNE
{ if($1 && ($1->labelno==dorange))
if(lastwasbranch && thislabel==NULL)
warn("statement cannot be reached");
lastwasbranch = thiswasbranch;
if($1->labtype == LABFORMAT)
err("label already that of a format");
| thislabel SINCLUDE filename
| thislabel SEND end_spec
{ lastwasbranch = NO; endproc(); }
{ execerr("unclassifiable statement", 0); flline(); };
{ flline(); needkwd = NO; inioctl = NO;
p2pass( stabdline(N_SLINE, lineno) );
sprintf(buff,"LL%d", ++dbglabel);
p2pass( stabline(0, N_SLINE, lineno, buff) );
p2pi("LL%d:\n", dbglabel);
$$ = thislabel = mklabel(yystno);
puthead(NULL, procclass);
if(thislabel->labdefined)
execerr("label %s already defined",
convic(thislabel->stateno) );
if(thislabel->blklevel!=0 && thislabel->blklevel<blklevel
&& thislabel->labtype!=LABFORMAT)
warn1("there is a branch to label %s from outside block",
convic( (ftnint) (thislabel->stateno) ) );
thislabel->blklevel = blklevel;
thislabel->labdefined = YES;
if(thislabel->labtype != LABFORMAT)
putlabel(thislabel->labelno);
else $$ = thislabel = NULL;
entry: SPROGRAM new_proc progname
{startproc($3, CLMAIN); }
| SBLOCK new_proc progname
{ if($3) NO66("named BLOCKDATA");
startproc($3, CLBLOCK); }
| SSUBROUTINE new_proc entryname arglist
{ entrypt(CLPROC, TYSUBR, (ftnint) 0, $3, $4); }
| SFUNCTION new_proc entryname arglist
{ entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, $3, $4); }
| type SFUNCTION new_proc entryname arglist
{ entrypt(CLPROC, $1, varleng, $4, $5); }
| SENTRY entryname arglist
{ if(parstate==OUTSIDE || procclass==CLMAIN
execerr("misplaced entry statement", 0);
entrypt(CLENTRY, 0, (ftnint) 0, $2, $3);
{ $$ = mkname(toklen, token); }
{ NO66(" () argument list");
{ $$ = ($1 ? mkchain($1,0) : 0 ); }
{ if($3) $1 = $$ = hookup($1, mkchain($3,0)); }
{ if($1->vstg!=STGUNKNOWN && $1->vstg!=STGARG)
dclerr("name declared as argument after use", $1);
{ NO66("altenate return argument");
$$ = 0; substars = YES; }
s = copyn(toklen+1, token);