ack/lang/fortran/comp/gram.exec

144 lines
2.9 KiB
Plaintext
Raw Permalink Normal View History

1991-10-07 16:35:03 +00:00
exec: iffable
| SDO end_spec intonlyon label intonlyoff opt_comma dospecw
{
if($4->labdefined)
execerr("no backward DO loops", CNULL);
$4->blklevel = blklevel+1;
exdo($4->labelno, NPNULL, $7);
}
| SDO end_spec opt_comma dospecw
{
exdo((int)(ctls - ctlstack - 2), NPNULL, $4);
NOEXT("DO without label");
}
| SENDDO
{ exenddo(NPNULL); }
| logif iffable
{ exendif(); thiswasbranch = NO; }
| logif STHEN
| SELSEIF end_spec SLPAR expr SRPAR STHEN
{ exelif($4); lastwasbranch = NO; }
| SELSE end_spec
{ exelse(); lastwasbranch = NO; }
| SENDIF end_spec
{ exendif(); lastwasbranch = NO; }
;
logif: SLOGIF end_spec SLPAR expr SRPAR
{ exif($4); }
;
dospec: name SEQUALS exprlist
{ $$ = mkchain((char *)$1, $3); }
;
dospecw: dospec
| SWHILE SLPAR expr SRPAR
{ $$ = mkchain(CNULL, (chainp)$3); }
;
iffable: let lhs SEQUALS expr
{ exequals((struct Primblock *)$2, $4); }
| SASSIGN end_spec assignlabel STO name
{ exassign($5, $3); }
| SCONTINUE end_spec
| goto
| io
{ inioctl = NO; }
| SARITHIF end_spec SLPAR expr SRPAR label SCOMMA label SCOMMA label
{ exarif($4, $6, $8, $10); thiswasbranch = YES; }
| call
{ excall($1, LBNULL, 0, labarray); }
| call SLPAR SRPAR
{ excall($1, LBNULL, 0, labarray); }
| call SLPAR callarglist SRPAR
{ if(nstars < MAXLABLIST)
excall($1, mklist(revchain($3)), nstars, labarray);
else
err("too many alternate returns");
}
| SRETURN end_spec opt_expr
{ exreturn($3); thiswasbranch = YES; }
| stop end_spec opt_expr
{ exstop($1, $3); thiswasbranch = $1; }
;
assignlabel: SICON
{ $$ = mklabel( convci(toklen, token) ); }
;
let: SLET
{ if(parstate == OUTSIDE)
{
newproc();
startproc(ESNULL, CLMAIN);
}
}
;
goto: SGOTO end_spec label
{ exgoto($3); thiswasbranch = YES; }
| SASGOTO end_spec name
{ 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
{ if(nstars < MAXLABLIST)
putcmgo(putx(fixtype($7)), nstars, labarray);
else
err("computed GOTO list too long");
}
;
opt_comma:
| SCOMMA
;
call: SCALL end_spec name
{ nstars = 0; $$ = $3; }
;
callarglist: callarg
{ $$ = $1 ? mkchain((char *)$1,CHNULL) : CHNULL; }
| callarglist SCOMMA callarg
{ $$ = $3 ? mkchain((char *)$3, $1) : $1; }
;
callarg: expr
| SSTAR label
{ if(nstars<MAXLABLIST) labarray[nstars++] = $2; $$ = 0; }
;
stop: SPAUSE
{ $$ = 0; }
| SSTOP
{ $$ = 1; }
;
exprlist: expr
{ $$ = mkchain((char *)$1, CHNULL); }
| exprlist SCOMMA expr
{ $$ = hookup($1, mkchain((char *)$3,CHNULL) ); }
;
end_spec:
{ if(parstate == OUTSIDE)
{
newproc();
startproc(ESNULL, CLMAIN);
}
/* This next statement depends on the ordering of the state table encoding */
if(parstate < INDATA) enddcl();
}
;
intonlyon:
{ intonly = YES; }
;
intonlyoff:
{ intonly = NO; }
;