]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/acid/dbg.y
fix ref822 again: remove uniqarray(), fix case with many entries in 'n'.
[plan9front.git] / sys / src / cmd / acid / dbg.y
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 %}
9
10 %union
11 {
12         Node    *node;
13         Lsym    *sym;
14         uvlong  ival;
15         float   fval;
16         String  *string;
17 }
18
19 %type <node> expr monexpr term stmnt name args zexpr slist
20 %type <node> member members mname castexpr idlist
21 %type <sym> zname
22
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 '.' '[' '('
37
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
44
45 %%
46
47 prog            : 
48                 | prog bigstmnt
49                 ;
50
51 bigstmnt        : stmnt
52                 {
53                         execrec($1);
54                         if(interactive)
55                                 Bprint(bout, "acid: ");
56                 }
57                 | Tfn Tid '(' args ')' zsemi '{' slist '}'
58                 {
59                         $2->proc = an(OLIST, $4, $8);
60                 }
61                 | Tfn Tid
62                 {
63                         $2->proc = nil;
64                 }
65                 | Tcomplex name '{' members '}' ';'
66                 {
67                         defcomplex($2, $4);
68                 }
69                 ;
70
71 zsemi           :
72                 | ';' zsemi
73
74 members         : member
75                 | members member
76                 {
77                         $$ = an(OLIST, $1, $2);
78                 }
79                 ;
80
81 mname           : Tid
82                 {
83                         $$ = an(ONAME, ZN, ZN);
84                         $$->sym = $1;
85                 }
86                 ;
87
88 member          : Tconst Tconst mname ';'
89                 {
90                         $3->ival = $2;
91                         $3->fmt = $1;
92                         $$ = $3;
93                 }
94                 | Tconst mname Tconst mname ';'
95                 {
96                         $4->ival = $3;
97                         $4->fmt = $1;
98                         $4->right = $2;
99                         $$ = $4;
100                 }
101                 | mname Tconst mname ';'
102                 {
103                         $3->ival = $2;
104                         $3->left = $1;
105                         $$ = $3;
106                 }
107                 | '{' members '}' ';'
108                 {
109                         $$ = an(OCTRUCT, $2, ZN);
110                 }
111                 ;
112
113 zname           : 
114                 { $$ = 0; }
115                 | Tid
116                 ;
117
118 slist           : stmnt
119                 | slist stmnt
120                 {
121                         $$ = an(OLIST, $1, $2);
122                 }
123                 ;
124
125 stmnt           : zexpr ';'
126                 | '{' slist '}'
127                 {
128                         $$ = $2;
129                 }
130                 | Tif expr Tthen stmnt
131                 {
132                         $$ = an(OIF, $2, $4);
133                 }
134                 | Tif expr Tthen stmnt Telse stmnt
135                 {
136                         $$ = an(OIF, $2, an(OELSE, $4, $6));
137                 }
138                 | Tloop expr ',' expr Tdo stmnt
139                 {
140                         $$ = an(ODO, an(OLIST, $2, $4), $6);
141                 }
142                 | Twhile expr Tdo stmnt
143                 {
144                         $$ = an(OWHILE, $2, $4);
145                 }
146                 | Tret expr ';'
147                 {
148                         $$ = an(ORET, $2, ZN);
149                 }
150                 | Tlocal idlist
151                 {
152                         $$ = an(OLOCAL, $2, ZN);
153                 }
154                 | Tcomplex Tid name ';'
155                 {
156                         $$ = an(OCOMPLEX, $3, ZN);
157                         $$->sym = $2;
158                 }
159                 ;
160
161 idlist          : Tid
162                 {
163                         $$ = an(ONAME, ZN, ZN);
164                         $$->sym = $1;
165                 }
166                 | idlist ',' Tid
167                 {
168                         $$ = an(ONAME, $1, ZN);
169                         $$->sym = $3;
170                 }
171                 ;
172
173 zexpr           :
174                 { $$ = 0; }
175                 | expr
176                 ;
177
178 expr            : castexpr
179                 | expr '*' expr
180                 {
181                         $$ = an(OMUL, $1, $3); 
182                 }
183                 | expr '/' expr
184                 {
185                         $$ = an(ODIV, $1, $3);
186                 }
187                 | expr '%' expr
188                 {
189                         $$ = an(OMOD, $1, $3);
190                 }
191                 | expr '+' expr
192                 {
193                         $$ = an(OADD, $1, $3);
194                 }
195                 | expr '-' expr
196                 {
197                         $$ = an(OSUB, $1, $3);
198                 }
199                 | expr Trsh expr
200                 {
201                         $$ = an(ORSH, $1, $3);
202                 }
203                 | expr Tlsh expr
204                 {
205                         $$ = an(OLSH, $1, $3);
206                 }
207                 | expr '<' expr
208                 {
209                         $$ = an(OLT, $1, $3);
210                 }
211                 | expr '>' expr
212                 {
213                         $$ = an(OGT, $1, $3);
214                 }
215                 | expr Tleq expr
216                 {
217                         $$ = an(OLEQ, $1, $3);
218                 }
219                 | expr Tgeq expr
220                 {
221                         $$ = an(OGEQ, $1, $3);
222                 }
223                 | expr Teq expr
224                 {
225                         $$ = an(OEQ, $1, $3);
226                 }
227                 | expr Tneq expr
228                 {
229                         $$ = an(ONEQ, $1, $3);
230                 }
231                 | expr '&' expr
232                 {
233                         $$ = an(OLAND, $1, $3);
234                 }
235                 | expr '^' expr
236                 {
237                         $$ = an(OXOR, $1, $3);
238                 }
239                 | expr '|' expr
240                 {
241                         $$ = an(OLOR, $1, $3);
242                 }
243                 | expr Tandand expr
244                 {
245                         $$ = an(OCAND, $1, $3);
246                 }
247                 | expr Toror expr
248                 {
249                         $$ = an(OCOR, $1, $3);
250                 }
251                 | expr '=' expr
252                 {
253                         $$ = an(OASGN, $1, $3);
254                 }
255                 | expr Tfmt
256                 {
257                         $$ = an(OFMT, $1, con($2));
258                 }
259                 ;
260
261 castexpr        : monexpr
262                 | '(' Tid ')' monexpr
263                 {
264                         $$ = an(OCAST, $4, ZN);
265                         $$->sym = $2;
266                 }
267                 ;
268
269 monexpr         : term
270                 | '*' monexpr 
271                 {
272                         $$ = an(OINDM, $2, ZN);
273                 }
274                 | '@' monexpr 
275                 {
276                         $$ = an(OINDC, $2, ZN);
277                 }
278                 | '+' monexpr
279                 {
280                         $$ = an(OADD, $2, ZN);
281                 }
282                 | '-' monexpr
283                 {
284                         $$ = con(0);
285                         $$ = an(OSUB, $$, $2);
286                 }
287                 | Tdec monexpr
288                 {
289                         $$ = an(OEDEC, $2, ZN);
290                 }
291                 | Tinc monexpr
292                 {
293                         $$ = an(OEINC, $2, ZN);
294                 }
295                 | Thead monexpr
296                 {
297                         $$ = an(OHEAD, $2, ZN);
298                 }
299                 | Ttail monexpr
300                 {
301                         $$ = an(OTAIL, $2, ZN);
302                 }
303                 | Tappend monexpr ',' monexpr
304                 {
305                         $$ = an(OAPPEND, $2, $4);
306                 }
307                 | Tdelete monexpr ',' monexpr
308                 {
309                         $$ = an(ODELETE, $2, $4);
310                 }
311                 | '!' monexpr
312                 {
313                         $$ = an(ONOT, $2, ZN);
314                 }
315                 | '~' monexpr
316                 {
317                         $$ = an(OXOR, $2, con(-1));
318                 }
319                 | Teval monexpr
320                 {
321                         $$ = an(OEVAL, $2, ZN); 
322                 }
323                 ;
324
325 term            : '(' expr ')'
326                 {
327                         $$ = $2;
328                 }
329                 | '{' args '}'
330                 {
331                         $$ = an(OCTRUCT, $2, ZN);
332                 }
333                 | term '[' expr ']'
334                 {
335                         $$ = an(OINDEX, $1, $3);
336                 }
337                 | term Tdec
338                 {
339                         $$ = an(OPDEC, $1, ZN);
340                 }
341                 | term '.' Tid
342                 {
343                         $$ = an(ODOT, $1, ZN);
344                         $$->sym = $3;
345                 }
346                 | term Tindir Tid
347                 {
348                         $$ = an(ODOT, an(OINDM, $1, ZN), ZN);
349                         $$->sym = $3;
350                 }
351                 | term Tinc
352                 {
353                         $$ = an(OPINC, $1, ZN);
354                 }
355                 | name '(' args ')'
356                 {
357                         $$ = an(OCALL, $1, $3);
358                 }
359                 | Tbuiltin name '(' args ')'
360                 {
361                         $$ = an(OCALL, $2, $4);
362                         $$->builtin = 1;
363                 }
364                 | name
365                 | Tconst
366                 {
367                         $$ = con($1);
368                 }
369                 | Tfconst
370                 {
371                         $$ = an(OCONST, ZN, ZN);
372                         $$->type = TFLOAT;
373                         $$->fmt = 'f';
374                         $$->fval = $1;
375                 }
376                 | Tstring
377                 {
378                         $$ = an(OCONST, ZN, ZN);
379                         $$->type = TSTRING;
380                         $$->string = $1;
381                         $$->fmt = 's';
382                 }
383                 | Twhat zname
384                 {
385                         $$ = an(OWHAT, ZN, ZN);
386                         $$->sym = $2;
387                 }
388                 ;
389
390 name            : Tid
391                 {
392                         $$ = an(ONAME, ZN, ZN);
393                         $$->sym = $1;
394                 }
395                 | Tid ':' name
396                 {
397                         $$ = an(OFRAME, $3, ZN);
398                         $$->sym = $1;
399                 }
400                 ;
401
402 args            : zexpr
403                 | args ','  zexpr
404                 {
405                         $$ = an(OLIST, $1, $3);
406                 }
407                 ;