Blob
1 %{2 #include <u.h>3 #include <libc.h>4 #include <bio.h>5 #include <mach.h>6 #define Extern extern7 #include "acid.h"8 %}10 %union11 {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 slist20 %type <node> member members mname castexpr idlist21 %type <sym> zname23 %left ';'24 %right '='25 %left Tfmt26 %left Toror27 %left Tandand28 %left '|'29 %left '^'30 %left '&'31 %left Teq Tneq32 %left '<' '>' Tleq Tgeq33 %left Tlsh Trsh34 %left '+' '-'35 %left '*' '/' '%'36 %right Tdec Tinc Tindir '.' '[' '('38 %token <sym> Tid39 %token <ival> Tconst Tfmt40 %token <fval> Tfconst41 %token <string> Tstring42 %token Tif Tdo Tthen Telse Twhile Tloop Thead Ttail Tappend Tfn Tret Tlocal43 %token Tcomplex Twhat Tdelete Teval Tbuiltin45 %%47 prog :48 | prog bigstmnt49 ;51 bigstmnt : stmnt52 {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 Tid67 {68 $2->proc = nil;69 }70 | Tcomplex name '{' members '}' ';'71 {72 defcomplex($2, $4);73 }74 ;76 zsemi :77 | ';' zsemi79 members : member80 | members member81 {82 $$ = an(OLIST, $1, $2);83 }84 ;86 mname : Tid87 {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 ';'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 ;118 zname :119 { $$ = 0; }120 | Tid121 ;123 slist : stmnt124 | slist stmnt125 {126 $$ = an(OLIST, $1, $2);127 }128 ;130 stmnt : zexpr ';'131 | '{' slist '}'132 {133 $$ = $2;134 }135 | Tif expr Tthen stmnt136 {137 $$ = an(OIF, $2, $4);138 }139 | Tif expr Tthen stmnt Telse stmnt140 {141 $$ = an(OIF, $2, an(OELSE, $4, $6));142 }143 | Tloop expr ',' expr Tdo stmnt144 {145 $$ = an(ODO, an(OLIST, $2, $4), $6);146 }147 | Twhile expr Tdo stmnt148 {149 $$ = an(OWHILE, $2, $4);150 }151 | Tret expr ';'152 {153 $$ = an(ORET, $2, ZN);154 }155 | Tlocal idlist156 {157 $$ = an(OLOCAL, $2, ZN);158 }159 | Tcomplex Tid name ';'160 {161 $$ = an(OCOMPLEX, $3, ZN);162 $$->sym = $2;163 }164 ;166 idlist : Tid167 {168 $$ = an(ONAME, ZN, ZN);169 $$->sym = $1;170 }171 | idlist ',' Tid172 {173 $$ = an(ONAME, $1, ZN);174 $$->sym = $3;175 }176 ;178 zexpr :179 { $$ = 0; }180 | expr181 ;183 expr : castexpr184 | expr '*' expr185 {186 $$ = an(OMUL, $1, $3);187 }188 | expr '/' expr189 {190 $$ = an(ODIV, $1, $3);191 }192 | expr '%' expr193 {194 $$ = an(OMOD, $1, $3);195 }196 | expr '+' expr197 {198 $$ = an(OADD, $1, $3);199 }200 | expr '-' expr201 {202 $$ = an(OSUB, $1, $3);203 }204 | expr Trsh expr205 {206 $$ = an(ORSH, $1, $3);207 }208 | expr Tlsh expr209 {210 $$ = an(OLSH, $1, $3);211 }212 | expr '<' expr213 {214 $$ = an(OLT, $1, $3);215 }216 | expr '>' expr217 {218 $$ = an(OGT, $1, $3);219 }220 | expr Tleq expr221 {222 $$ = an(OLEQ, $1, $3);223 }224 | expr Tgeq expr225 {226 $$ = an(OGEQ, $1, $3);227 }228 | expr Teq expr229 {230 $$ = an(OEQ, $1, $3);231 }232 | expr Tneq expr233 {234 $$ = an(ONEQ, $1, $3);235 }236 | expr '&' expr237 {238 $$ = an(OLAND, $1, $3);239 }240 | expr '^' expr241 {242 $$ = an(OXOR, $1, $3);243 }244 | expr '|' expr245 {246 $$ = an(OLOR, $1, $3);247 }248 | expr Tandand expr249 {250 $$ = an(OCAND, $1, $3);251 }252 | expr Toror expr253 {254 $$ = an(OCOR, $1, $3);255 }256 | expr '=' expr257 {258 $$ = an(OASGN, $1, $3);259 }260 | expr Tfmt261 {262 $$ = an(OFMT, $1, con($2));263 }264 ;266 castexpr : monexpr267 | '(' Tid ')' monexpr268 {269 $$ = an(OCAST, $4, ZN);270 $$->sym = $2;271 }272 ;274 monexpr : term275 | '*' monexpr276 {277 $$ = an(OINDM, $2, ZN);278 }279 | '@' monexpr280 {281 $$ = an(OINDC, $2, ZN);282 }283 | '+' monexpr284 {285 $$ = con(0);286 $$ = an(OADD, $2, $$);287 }288 | '-' monexpr289 {290 $$ = con(0);291 $$ = an(OSUB, $$, $2);292 }293 | Tdec monexpr294 {295 $$ = an(OEDEC, $2, ZN);296 }297 | Tinc monexpr298 {299 $$ = an(OEINC, $2, ZN);300 }301 | Thead monexpr302 {303 $$ = an(OHEAD, $2, ZN);304 }305 | Ttail monexpr306 {307 $$ = an(OTAIL, $2, ZN);308 }309 | Tappend monexpr ',' monexpr310 {311 $$ = an(OAPPEND, $2, $4);312 }313 | Tdelete monexpr ',' monexpr314 {315 $$ = an(ODELETE, $2, $4);316 }317 | '!' monexpr318 {319 $$ = an(ONOT, $2, ZN);320 }321 | '~' monexpr322 {323 $$ = an(OXOR, $2, con(-1));324 }325 | Teval monexpr326 {327 $$ = an(OEVAL, $2, ZN);328 }329 ;331 term : '(' expr ')'332 {333 $$ = $2;334 }335 | '{' args '}'336 {337 $$ = an(OCTRUCT, $2, ZN);338 }339 | term '[' expr ']'340 {341 $$ = an(OINDEX, $1, $3);342 }343 | term Tdec344 {345 $$ = an(OPDEC, $1, ZN);346 }347 | term '.' Tid348 {349 $$ = an(ODOT, $1, ZN);350 $$->sym = $3;351 }352 | term Tindir Tid353 {354 $$ = an(ODOT, an(OINDM, $1, ZN), ZN);355 $$->sym = $3;356 }357 | term Tinc358 {359 $$ = an(OPINC, $1, ZN);360 }361 | name '(' args ')'362 {363 $$ = an(OCALL, $1, $3);364 }365 | Tbuiltin name '(' args ')'366 {367 $$ = an(OCALL, $2, $4);368 $$->builtin = 1;369 }370 | name371 | Tconst372 {373 $$ = con($1);374 }375 | Tfconst376 {377 $$ = an(OCONST, ZN, ZN);378 $$->type = TFLOAT;379 $$->store.fmt = 'f';380 $$->store.u.fval = $1;381 }382 | Tstring383 {384 $$ = an(OCONST, ZN, ZN);385 $$->type = TSTRING;386 $$->store.u.string = $1;387 $$->store.fmt = 's';388 }389 | Twhat zname390 {391 $$ = an(OWHAT, ZN, ZN);392 $$->sym = $2;393 }394 ;396 name : Tid397 {398 $$ = an(ONAME, ZN, ZN);399 $$->sym = $1;400 }401 | Tid ':' name402 {403 $$ = an(OFRAME, $3, ZN);404 $$->sym = $1;405 }406 ;408 args : zexpr409 | args ',' zexpr410 {411 $$ = an(OLIST, $1, $3);412 }413 ;