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 ;