| SDO end_spec label dospec
execerr("no backward DO loops");
$3->blklevel = blklevel+1;
{ exendif(); thiswasbranch = NO; }
| SELSEIF end_spec SLPAR expr SRPAR STHEN
logif: SLOGIF end_spec SLPAR expr SRPAR
dospec: name SEQUALS exprlist
{ $$ = mkchain($1, $3); }
iffable: let lhs SEQUALS expr
| SASSIGN end_spec labelval STO name
| SARITHIF end_spec SLPAR expr SRPAR label SCOMMA label SCOMMA label
{ exarif($4, $6, $8, $10); thiswasbranch = YES; }
{ excall($1, 0, 0, labarray); }
{ excall($1, 0, 0, labarray); }
| call SLPAR callarglist SRPAR
{ excall($1, mklist($3), nstars, labarray); }
| SRETURN end_spec opt_expr
{ exreturn($3); thiswasbranch = YES; }
{ exstop($1, $3); thiswasbranch = $1; }
{ if(parstate == OUTSIDE)
goto: SGOTO end_spec label
{ exgoto($3); thiswasbranch = YES; }
{ exasgoto($3); thiswasbranch = YES; }
| SASGOTO end_spec name opt_comma SLPAR labellist SRPAR
{ exasgoto($3); thiswasbranch = YES; }
| SCOMPGOTO end_spec SLPAR labellist SRPAR opt_comma expr
{ putcmgo(fixtype($7), nstars, labarray); }
call: SCALL end_spec name
{ $$ = ($1 ? mkchain($1,0) : 0); }
| callarglist SCOMMA callarg
if($1) $$ = hookup($1, mkchain($3,0));
{ labarray[nstars++] = $2; $$ = 0; }
{ $$ = hookup($1, mkchain($3,0) ); }
{ if(parstate == OUTSIDE)
if(parstate < INDATA) enddcl();