xref: /netbsd-src/external/bsd/pcc/dist/pcc/f77/fcom/gram.exec (revision 6e0bca226213170693d0d173dd885840754030f8)
1exec:	  iffable
2	| SDO end_spec label opt_comma dospec
3		{
4		if($3->labdefined)
5			execerr("no backward DO loops");
6		$3->blklevel = blklevel+1;
7		exdo($3->labelno, $5);
8		}
9	| logif iffable
10		{ exendif();  thiswasbranch = NO; }
11	| logif STHEN
12	| SELSEIF end_spec SLPAR expr SRPAR STHEN
13		{ exelif($4); lastwasbranch = NO; }
14	| SELSE end_spec
15		{ exelse(); lastwasbranch = NO; }
16	| SENDIF end_spec
17		{ exendif(); lastwasbranch = NO; }
18	;
19
20logif:	  SLOGIF end_spec SLPAR expr SRPAR
21		{ exif($4); }
22	;
23
24dospec:	  name SEQUALS exprlist
25		{ $$ = mkchain($1, $3); }
26	;
27
28iffable:  let lhs SEQUALS expr
29		{ exequals($2, $4); }
30	| SASSIGN end_spec labelval STO name
31		{ exassign($5, $3); }
32	| SCONTINUE end_spec
33	| goto
34	| io
35		{ inioctl = NO; }
36	| SARITHIF end_spec SLPAR expr SRPAR label SCOMMA label SCOMMA label
37		{ exarif($4, $6, $8, $10);  thiswasbranch = YES; }
38	| call
39		{ excall($1, 0, 0, labarray); }
40	| call SLPAR SRPAR
41		{ excall($1, 0, 0, labarray); }
42	| call SLPAR callarglist SRPAR
43		{ excall($1, mklist($3), nstars, labarray); }
44	| SRETURN end_spec opt_expr
45		{ exreturn($3);  thiswasbranch = YES; }
46	| stop end_spec opt_expr
47		{ exstop($1, $3);  thiswasbranch = $1; }
48	;
49
50let:	  SLET
51		{ if(parstate == OUTSIDE)
52			{
53			newproc();
54			startproc(0, CLMAIN);
55			}
56		}
57	;
58
59goto:	  SGOTO end_spec label
60		{ exgoto($3);  thiswasbranch = YES; }
61	| SASGOTO end_spec name
62		{ exasgoto($3);  thiswasbranch = YES; }
63	| SASGOTO end_spec name opt_comma SLPAR labellist SRPAR
64		{ exasgoto($3);  thiswasbranch = YES; }
65	| SCOMPGOTO end_spec SLPAR labellist SRPAR opt_comma expr
66		{ putcmgo(fixtype($7), nstars, labarray); }
67	;
68
69opt_comma:
70	| SCOMMA
71	;
72
73call:	  SCALL end_spec name
74		{ nstars = 0; $$ = $3; }
75	;
76
77callarglist:  callarg
78		{ $$ = ($1 ? mkchain($1,0) : 0); }
79	| callarglist SCOMMA callarg
80		{ if($3) {
81			if($1) $$ = hookup($1, mkchain($3,0));
82			else $$ = mkchain($3,0);
83		}
84		}
85	;
86
87callarg:  expr
88	| SSTAR label
89		{ labarray[nstars++] = $2; $$ = 0; }
90	;
91
92stop:	  SPAUSE
93		{ $$ = 0; }
94	| SSTOP
95		{ $$ = 1; }
96	;
97
98exprlist:  expr
99		{ $$ = mkchain($1, 0); }
100	| exprlist SCOMMA expr
101		{ $$ = hookup($1, mkchain($3,0) ); }
102	;
103
104end_spec:
105		{ if(parstate == OUTSIDE)
106			{
107			newproc();
108			startproc(0, CLMAIN);
109			}
110		  if(parstate < INDATA) enddcl();
111		}
112	;
113