plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

dbg.y (5611B)


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