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 $$ = con(0);
286 $$ = an(OADD, $2, $$);
288 | '-' monexpr
290 $$ = con(0);
291 $$ = an(OSUB, $$, $2);
293 | Tdec monexpr
295 $$ = an(OEDEC, $2, ZN);
297 | Tinc monexpr
299 $$ = an(OEINC, $2, ZN);
301 | Thead monexpr
303 $$ = an(OHEAD, $2, ZN);
305 | Ttail monexpr
307 $$ = an(OTAIL, $2, ZN);
309 | Tappend monexpr ',' monexpr
311 $$ = an(OAPPEND, $2, $4);
313 | Tdelete monexpr ',' monexpr
315 $$ = an(ODELETE, $2, $4);
317 | '!' monexpr
319 $$ = an(ONOT, $2, ZN);
321 | '~' monexpr
323 $$ = an(OXOR, $2, con(-1));
325 | Teval monexpr
327 $$ = an(OEVAL, $2, ZN);
331 term : '(' expr ')'
333 $$ = $2;
335 | '{' args '}'
337 $$ = an(OCTRUCT, $2, ZN);
339 | term '[' expr ']'
341 $$ = an(OINDEX, $1, $3);
343 | term Tdec
345 $$ = an(OPDEC, $1, ZN);
347 | term '.' Tid
349 $$ = an(ODOT, $1, ZN);
350 $$->sym = $3;
352 | term Tindir Tid
354 $$ = an(ODOT, an(OINDM, $1, ZN), ZN);
355 $$->sym = $3;
357 | term Tinc
359 $$ = an(OPINC, $1, ZN);
361 | name '(' args ')'
363 $$ = an(OCALL, $1, $3);
365 | Tbuiltin name '(' args ')'
367 $$ = an(OCALL, $2, $4);
368 $$->builtin = 1;
370 | name
371 | Tconst
373 $$ = con($1);
375 | Tfconst
377 $$ = an(OCONST, ZN, ZN);
378 $$->type = TFLOAT;
379 $$->store.fmt = 'f';
380 $$->store.u.fval = $1;
382 | Tstring
384 $$ = an(OCONST, ZN, ZN);
385 $$->type = TSTRING;
386 $$->store.u.string = $1;
387 $$->store.fmt = 's';
389 | Twhat zname
391 $$ = an(OWHAT, ZN, ZN);
392 $$->sym = $2;
396 name : Tid
398 $$ = an(ONAME, ZN, ZN);
399 $$->sym = $1;
401 | Tid ':' name
403 $$ = an(OFRAME, $3, ZN);
404 $$->sym = $1;
408 args : zexpr
409 | args ',' zexpr
411 $$ = an(OLIST, $1, $3);