|
|
1.1 root 1: exec: iffable
2: | SDO end_spec label dospec
3: {
4: if($3->labdefined)
5: execerr("no backward DO loops", 0);
6: $3->blklevel = blklevel+1;
7: exdo($3->labelno, $4);
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:
20: logif: SLOGIF end_spec SLPAR expr SRPAR
21: { exif($4); }
22: ;
23:
24: dospec: name SEQUALS exprlist
25: { $$ = mkchain($1, $3); }
26: ;
27:
28: iffable: 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: { if(nstars < MAXLABLIST)
44: excall($1, mklist($3), nstars, labarray);
45: else
46: err("too many alternate returns");
47: }
48: | SRETURN end_spec opt_expr
49: { exreturn($3); thiswasbranch = YES; }
50: | stop end_spec opt_expr
51: { exstop($1, $3); thiswasbranch = $1; }
52: ;
53:
54: let: SLET
55: { if(parstate == OUTSIDE)
56: {
57: newproc();
58: startproc(0, CLMAIN);
59: }
60: }
61: ;
62:
63: goto: SGOTO end_spec label
64: { exgoto($3); thiswasbranch = YES; }
65: | SASGOTO end_spec name
66: { exasgoto($3); thiswasbranch = YES; }
67: | SASGOTO end_spec name opt_comma SLPAR labellist SRPAR
68: { exasgoto($3); thiswasbranch = YES; }
69: | SCOMPGOTO end_spec SLPAR labellist SRPAR opt_comma expr
70: { if(nstars < MAXLABLIST)
71: putcmgo(fixtype($7), nstars, labarray);
72: else
73: err("computed GOTO list too long");
74: }
75: ;
76:
77: opt_comma:
78: | SCOMMA
79: ;
80:
81: call: SCALL end_spec name
82: { nstars = 0; $$ = $3; }
83: ;
84:
85: callarglist: callarg
86: { $$ = ($1 ? mkchain($1,0) : 0); }
87: | callarglist SCOMMA callarg
88: { if($3)
89: if($1) $$ = hookup($1, mkchain($3,0));
90: else $$ = mkchain($3,0);
91: }
92: ;
93:
94: callarg: expr
95: | SSTAR label
96: { if(nstars<MAXLABLIST) labarray[nstars++] = $2; $$ = 0; }
97: ;
98:
99: stop: SPAUSE
100: { $$ = 0; }
101: | SSTOP
102: { $$ = 1; }
103: ;
104:
105: exprlist: expr
106: { $$ = mkchain($1, 0); }
107: | exprlist SCOMMA expr
108: { $$ = hookup($1, mkchain($3,0) ); }
109: ;
110:
111: end_spec:
112: { if(parstate == OUTSIDE)
113: {
114: newproc();
115: startproc(0, CLMAIN);
116: }
117: if(parstate < INDATA) enddcl();
118: }
119: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.