Blob


1 %{
2 #include <u.h>
3 #include <libc.h>
4 #include <bio.h>
5 #include <mach.h>
6 #define Extern extern
7 #include "acid.h"
8 %}
10 %union
11 {
12 Node *node;
13 Lsym *sym;
14 ulong ival;
15 float fval;
16 String *string;
17 }
19 %type <node> expr monexpr term stmnt name args zexpr slist
20 %type <node> member members mname castexpr idlist
21 %type <sym> zname
23 %left ';'
24 %right '='
25 %left Tfmt
26 %left Toror
27 %left Tandand
28 %left '|'
29 %left '^'
30 %left '&'
31 %left Teq Tneq
32 %left '<' '>' Tleq Tgeq
33 %left Tlsh Trsh
34 %left '+' '-'
35 %left '*' '/' '%'
36 %right Tdec Tinc Tindir '.' '[' '('
38 %token <sym> Tid
39 %token <ival> Tconst Tfmt
40 %token <fval> Tfconst
41 %token <string> Tstring
42 %token Tif Tdo Tthen Telse Twhile Tloop Thead Ttail Tappend Tfn Tret Tlocal
43 %token Tcomplex Twhat Tdelete Teval Tbuiltin
45 %%
47 prog :
48 | prog bigstmnt
49 ;
51 bigstmnt : stmnt
52 {
53 /* hold on to current command for gc */
54 mkvar("_thiscmd")->proc = $1;
55 execute($1);
56 gc();
57 if(interactive && nlcount){
58 Bprint(bout, "acid; ");
59 nlcount = 0;
60 }
61 }
62 | Tfn Tid '(' args ')' zsemi '{' slist '}'
63 {
64 $2->proc = an(OLIST, $4, $8);
65 }
66 | Tfn Tid
67 {
68 $2->proc = nil;
69 }
70 | Tcomplex name '{' members '}' ';'
71 {
72 defcomplex($2, $4);
73 }
74 ;
76 zsemi :
77 | ';' zsemi
79 members : member
80 | members member
81 {
82 $$ = an(OLIST, $1, $2);
83 }
84 ;
86 mname : Tid
87 {
88 $$ = an(ONAME, ZN, ZN);
89 $$->sym = $1;
90 }
91 ;
93 member : Tconst Tconst mname ';'
94 {
95 $3->store.u.ival = $2;
96 $3->store.fmt = $1;
97 $$ = $3;
98 }
99 | Tconst mname Tconst mname ';'
101 $4->store.u.ival = $3;
102 $4->store.fmt = $1;
103 $4->right = $2;
104 $$ = $4;
106 | mname Tconst mname ';'
108 $3->store.u.ival = $2;
109 $3->left = $1;
110 $$ = $3;
112 | '{' members '}' ';'
114 $$ = an(OCTRUCT, $2, ZN);
118 zname :
119 { $$ = 0; }
120 | Tid
123 slist : stmnt
124 | slist stmnt
126 $$ = an(OLIST, $1, $2);
130 stmnt : zexpr ';'
131 | '{' slist '}'
133 $$ = $2;
135 | Tif expr Tthen stmnt
137 $$ = an(OIF, $2, $4);
139 | Tif expr Tthen stmnt Telse stmnt
141 $$ = an(OIF, $2, an(OELSE, $4, $6));
143 | Tloop expr ',' expr Tdo stmnt
145 $$ = an(ODO, an(OLIST, $2, $4), $6);
147 | Twhile expr Tdo stmnt
149 $$ = an(OWHILE, $2, $4);
151 | Tret expr ';'
153 $$ = an(ORET, $2, ZN);
155 | Tlocal idlist
157 $$ = an(OLOCAL, $2, ZN);
159 | Tcomplex Tid name ';'
161 $$ = an(OCOMPLEX, $3, ZN);
162 $$->sym = $2;
166 idlist : Tid
168 $$ = an(ONAME, ZN, ZN);
169 $$->sym = $1;
171 | idlist ',' Tid
173 $$ = an(ONAME, $1, ZN);
174 $$->sym = $3;
178 zexpr :
179 { $$ = 0; }
180 | expr
183 expr : castexpr
184 | expr '*' expr
186 $$ = an(OMUL, $1, $3);
188 | expr '/' expr
190 $$ = an(ODIV, $1, $3);
192 | expr '%' expr
194 $$ = an(OMOD, $1, $3);
196 | expr '+' expr
198 $$ = an(OADD, $1, $3);
200 | expr '-' expr
202 $$ = an(OSUB, $1, $3);
204 | expr Trsh expr
206 $$ = an(ORSH, $1, $3);
208 | expr Tlsh expr
210 $$ = an(OLSH, $1, $3);
212 | expr '<' expr
214 $$ = an(OLT, $1, $3);
216 | expr '>' expr
218 $$ = an(OGT, $1, $3);
220 | expr Tleq expr
222 $$ = an(OLEQ, $1, $3);
224 | expr Tgeq expr
226 $$ = an(OGEQ, $1, $3);
228 | expr Teq expr
230 $$ = an(OEQ, $1, $3);
232 | expr Tneq expr
234 $$ = an(ONEQ, $1, $3);
236 | expr '&' expr
238 $$ = an(OLAND, $1, $3);
240 | expr '^' expr
242 $$ = an(OXOR, $1, $3);
244 | expr '|' expr
246 $$ = an(OLOR, $1, $3);
248 | expr Tandand expr
250 $$ = an(OCAND, $1, $3);
252 | expr Toror expr
254 $$ = an(OCOR, $1, $3);
256 | expr '=' expr
258 $$ = an(OASGN, $1, $3);
260 | expr Tfmt
262 $$ = an(OFMT, $1, con($2));
266 castexpr : monexpr
267 | '(' Tid ')' monexpr
269 $$ = an(OCAST, $4, ZN);
270 $$->sym = $2;
274 monexpr : term
275 | '*' monexpr
277 $$ = an(OINDM, $2, ZN);
279 | '@' monexpr
281 $$ = an(OINDC, $2, ZN);
283 | '+' monexpr
285 $$ = an(OUPLUS, $2, ZN);
287 | '-' monexpr
289 $$ = con(0);
290 $$ = an(OSUB, $$, $2);
292 | Tdec monexpr
294 $$ = an(OEDEC, $2, ZN);
296 | Tinc monexpr
298 $$ = an(OEINC, $2, ZN);
300 | Thead monexpr
302 $$ = an(OHEAD, $2, ZN);
304 | Ttail monexpr
306 $$ = an(OTAIL, $2, ZN);
308 | Tappend monexpr ',' monexpr
310 $$ = an(OAPPEND, $2, $4);
312 | Tdelete monexpr ',' monexpr
314 $$ = an(ODELETE, $2, $4);
316 | '!' monexpr
318 $$ = an(ONOT, $2, ZN);
320 | '~' monexpr
322 $$ = an(OXOR, $2, con(-1));
324 | Teval monexpr
326 $$ = an(OEVAL, $2, ZN);
330 term : '(' expr ')'
332 $$ = $2;
334 | '{' args '}'
336 $$ = an(OCTRUCT, $2, ZN);
338 | term '[' expr ']'
340 $$ = an(OINDEX, $1, $3);
342 | term Tdec
344 $$ = an(OPDEC, $1, ZN);
346 | term '.' Tid
348 $$ = an(ODOT, $1, ZN);
349 $$->sym = $3;
351 | term Tindir Tid
353 $$ = an(ODOT, an(OINDM, $1, ZN), ZN);
354 $$->sym = $3;
356 | term Tinc
358 $$ = an(OPINC, $1, ZN);
360 | name '(' args ')'
362 $$ = an(OCALL, $1, $3);
364 | Tbuiltin name '(' args ')'
366 $$ = an(OCALL, $2, $4);
367 $$->builtin = 1;
369 | name
370 | Tconst
372 $$ = con($1);
374 | Tfconst
376 $$ = an(OCONST, ZN, ZN);
377 $$->type = TFLOAT;
378 $$->store.fmt = 'f';
379 $$->store.u.fval = $1;
381 | Tstring
383 $$ = an(OCONST, ZN, ZN);
384 $$->type = TSTRING;
385 $$->store.u.string = $1;
386 $$->store.fmt = 's';
388 | Twhat zname
390 $$ = an(OWHAT, ZN, ZN);
391 $$->sym = $2;
395 name : Tid
397 $$ = an(ONAME, ZN, ZN);
398 $$->sym = $1;
400 | Tid ':' name
402 $$ = an(OFRAME, $3, ZN);
403 $$->sym = $1;
407 args : zexpr
408 | args ',' zexpr
410 $$ = an(OLIST, $1, $3);