11 static struct labelblock *labarray[100];
12 static int lastwasbranch = NO;
13 static int thiswasbranch = NO;
17 /* Specify precedences and associativies. */
26 %nonassoc SLT SGT SLE SGE SEQ SNE
33 struct labelblock *label;
34 struct extsym *extsym;
45 %type <label> thislabel label labelval
47 %type <num> SLABEL type dcl typename addop relop
49 %type <extsym> progname entryname common comblock
50 %type <bigptr> name var call lhs simple inelt other bit_const
51 value simple_const complex_const arg
52 %type <chainp> args datavarlist datavar dospec funarglist funargs exprlist
53 callarglist inlist outlist out2 equivlist arglist
56 %type <bigptr> uexpr callarg opt_expr unpar_fexpr ubound expr fexpr
65 { lastwasbranch = NO; }
68 { if($1 && ($1->labelno==dorange))
70 if(lastwasbranch && thislabel==NULL)
71 warn1("statement cannot be reached");
72 lastwasbranch = thiswasbranch;
75 | thislabel SINCLUDE filename
77 | thislabel SEND end_spec
78 { lastwasbranch = NO; endproc(); }
80 { execerr("unclassifiable statement", 0); flline(); }
82 { flline(); needkwd = NO; inioctl = NO;
90 $$ = thislabel = mklabel( (ftnint) $1);
93 if(thislabel->labdefined)
94 execerr("label %s already defined",
95 convic(thislabel->stateno) );
97 if(thislabel->blklevel!=0 && thislabel->blklevel<blklevel
98 && thislabel->labtype!=LABFORMAT)
99 warn1("there is a branch to label %s from outside block",
100 convic( (ftnint) (thislabel->stateno) ) );
101 thislabel->blklevel = blklevel;
102 thislabel->labdefined = YES;
103 if(thislabel->labtype != LABFORMAT)
104 putlabel(thislabel->labelno);
107 else $$ = thislabel = NULL;
111 entry: SPROGRAM new_proc progname
112 { startproc($3, CLMAIN); }
113 | SBLOCK new_proc progname
114 { startproc($3, CLBLOCK); }
115 | SSUBROUTINE new_proc entryname arglist
116 { entrypt(CLPROC, TYSUBR, (ftnint) 0, $3, $4); }
117 | SFUNCTION new_proc entryname arglist
118 { entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, $3, $4); }
119 | type SFUNCTION new_proc entryname arglist
120 { entrypt(CLPROC, $1, varleng, $4, $5); }
121 | SENTRY entryname arglist
122 { if(parstate==OUTSIDE || procclass==CLMAIN
123 || procclass==CLBLOCK)
124 execerr("misplaced entry statement", 0);
125 entrypt(CLENTRY, 0, (ftnint) 0, $2, $3);
134 { $$ = newentry($1); }
138 { $$ = mkname(toklen, token); }
141 progname: { $$ = NULL; }
154 { $$ = ($1 ? mkchain($1,0) : 0 ); }
156 { if($3) $1 = $$ = hookup($1, mkchain($3,0)); }
160 { $1->vstg = STGARG; }
162 { $$ = 0; substars = YES; }
170 s = copyn(toklen+1, token);