1bd389b36SDavid du Colombier %{ 2bd389b36SDavid du Colombier #include <u.h> 3219b2ee8SDavid du Colombier #include <libc.h> 4bd389b36SDavid du Colombier #include <bio.h> 5bd389b36SDavid du Colombier #include <mach.h> 6bd389b36SDavid du Colombier #define Extern extern 7bd389b36SDavid du Colombier #include "acid.h" 8bd389b36SDavid du Colombier %} 9bd389b36SDavid du Colombier 10bd389b36SDavid du Colombier %union 11bd389b36SDavid du Colombier { 12bd389b36SDavid du Colombier Node *node; 13bd389b36SDavid du Colombier Lsym *sym; 144de34a7eSDavid du Colombier uvlong ival; 15bd389b36SDavid du Colombier float fval; 16bd389b36SDavid du Colombier String *string; 17bd389b36SDavid du Colombier } 18bd389b36SDavid du Colombier 19bd389b36SDavid du Colombier %type <node> expr monexpr term stmnt name args zexpr slist 20219b2ee8SDavid du Colombier %type <node> member members mname castexpr idlist 21219b2ee8SDavid du Colombier %type <sym> zname 22bd389b36SDavid du Colombier 23bd389b36SDavid du Colombier %left ';' 24bd389b36SDavid du Colombier %right '=' 25219b2ee8SDavid du Colombier %left Tfmt 26bd389b36SDavid du Colombier %left Toror 27bd389b36SDavid du Colombier %left Tandand 28bd389b36SDavid du Colombier %left '|' 29bd389b36SDavid du Colombier %left '^' 30bd389b36SDavid du Colombier %left '&' 31bd389b36SDavid du Colombier %left Teq Tneq 32bd389b36SDavid du Colombier %left '<' '>' Tleq Tgeq 33bd389b36SDavid du Colombier %left Tlsh Trsh 34bd389b36SDavid du Colombier %left '+' '-' 35bd389b36SDavid du Colombier %left '*' '/' '%' 36bd389b36SDavid du Colombier %right Tdec Tinc Tindir '.' '[' '(' 37bd389b36SDavid du Colombier 38bd389b36SDavid du Colombier %token <sym> Tid 39219b2ee8SDavid du Colombier %token <ival> Tconst Tfmt 40bd389b36SDavid du Colombier %token <fval> Tfconst 41bd389b36SDavid du Colombier %token <string> Tstring 42bd389b36SDavid du Colombier %token Tif Tdo Tthen Telse Twhile Tloop Thead Ttail Tappend Tfn Tret Tlocal 430b459c2cSDavid du Colombier %token Tcomplex Twhat Tdelete Teval Tbuiltin 44bd389b36SDavid du Colombier 45bd389b36SDavid du Colombier %% 46bd389b36SDavid du Colombier 47bd389b36SDavid du Colombier prog : 48bd389b36SDavid du Colombier | prog bigstmnt 49bd389b36SDavid du Colombier ; 50bd389b36SDavid du Colombier 51bd389b36SDavid du Colombier bigstmnt : stmnt 52bd389b36SDavid du Colombier { 530809e9a7SDavid du Colombier /* make stmnt a root so it isn't collected! */ 540809e9a7SDavid du Colombier mkvar("_thiscmd")->proc = $1; 55bd389b36SDavid du Colombier execute($1); 560809e9a7SDavid du Colombier mkvar("_thiscmd")->proc = nil; 57bd389b36SDavid du Colombier gc(); 58bd389b36SDavid du Colombier if(interactive) 59bd389b36SDavid du Colombier Bprint(bout, "acid: "); 60bd389b36SDavid du Colombier } 61219b2ee8SDavid du Colombier | Tfn Tid '(' args ')' zsemi '{' slist '}' 62bd389b36SDavid du Colombier { 63219b2ee8SDavid du Colombier $2->proc = an(OLIST, $4, $8); 64bd389b36SDavid du Colombier } 650b459c2cSDavid du Colombier | Tfn Tid 660b459c2cSDavid du Colombier { 670b459c2cSDavid du Colombier $2->proc = nil; 680b459c2cSDavid du Colombier } 69219b2ee8SDavid du Colombier | Tcomplex name '{' members '}' ';' 70bd389b36SDavid du Colombier { 71219b2ee8SDavid du Colombier defcomplex($2, $4); 72bd389b36SDavid du Colombier } 73bd389b36SDavid du Colombier ; 74bd389b36SDavid du Colombier 75219b2ee8SDavid du Colombier zsemi : 76219b2ee8SDavid du Colombier | ';' zsemi 77219b2ee8SDavid du Colombier 78219b2ee8SDavid du Colombier members : member 79219b2ee8SDavid du Colombier | members member 80219b2ee8SDavid du Colombier { 81219b2ee8SDavid du Colombier $$ = an(OLIST, $1, $2); 82219b2ee8SDavid du Colombier } 83219b2ee8SDavid du Colombier ; 84219b2ee8SDavid du Colombier 85219b2ee8SDavid du Colombier mname : Tid 86219b2ee8SDavid du Colombier { 87219b2ee8SDavid du Colombier $$ = an(ONAME, ZN, ZN); 88219b2ee8SDavid du Colombier $$->sym = $1; 89219b2ee8SDavid du Colombier } 90219b2ee8SDavid du Colombier ; 91219b2ee8SDavid du Colombier 92219b2ee8SDavid du Colombier member : Tconst Tconst mname ';' 93219b2ee8SDavid du Colombier { 94219b2ee8SDavid du Colombier $3->ival = $2; 95219b2ee8SDavid du Colombier $3->fmt = $1; 96219b2ee8SDavid du Colombier $$ = $3; 97219b2ee8SDavid du Colombier } 98219b2ee8SDavid du Colombier | Tconst mname Tconst mname ';' 99219b2ee8SDavid du Colombier { 100219b2ee8SDavid du Colombier $4->ival = $3; 101219b2ee8SDavid du Colombier $4->fmt = $1; 102219b2ee8SDavid du Colombier $4->right = $2; 103219b2ee8SDavid du Colombier $$ = $4; 104219b2ee8SDavid du Colombier } 105219b2ee8SDavid du Colombier | mname Tconst mname ';' 106219b2ee8SDavid du Colombier { 107219b2ee8SDavid du Colombier $3->ival = $2; 108219b2ee8SDavid du Colombier $3->left = $1; 109219b2ee8SDavid du Colombier $$ = $3; 110219b2ee8SDavid du Colombier } 111219b2ee8SDavid du Colombier | '{' members '}' ';' 112219b2ee8SDavid du Colombier { 113219b2ee8SDavid du Colombier $$ = an(OCTRUCT, $2, ZN); 114219b2ee8SDavid du Colombier } 115219b2ee8SDavid du Colombier ; 116219b2ee8SDavid du Colombier 117219b2ee8SDavid du Colombier zname : 118219b2ee8SDavid du Colombier { $$ = 0; } 119219b2ee8SDavid du Colombier | Tid 120219b2ee8SDavid du Colombier ; 121219b2ee8SDavid du Colombier 122bd389b36SDavid du Colombier slist : stmnt 123bd389b36SDavid du Colombier | slist stmnt 124bd389b36SDavid du Colombier { 125bd389b36SDavid du Colombier $$ = an(OLIST, $1, $2); 126bd389b36SDavid du Colombier } 127bd389b36SDavid du Colombier ; 128bd389b36SDavid du Colombier 129bd389b36SDavid du Colombier stmnt : zexpr ';' 130bd389b36SDavid du Colombier | '{' slist '}' 131bd389b36SDavid du Colombier { 132bd389b36SDavid du Colombier $$ = $2; 133bd389b36SDavid du Colombier } 134bd389b36SDavid du Colombier | Tif expr Tthen stmnt 135bd389b36SDavid du Colombier { 136bd389b36SDavid du Colombier $$ = an(OIF, $2, $4); 137bd389b36SDavid du Colombier } 138bd389b36SDavid du Colombier | Tif expr Tthen stmnt Telse stmnt 139bd389b36SDavid du Colombier { 140bd389b36SDavid du Colombier $$ = an(OIF, $2, an(OELSE, $4, $6)); 141bd389b36SDavid du Colombier } 142bd389b36SDavid du Colombier | Tloop expr ',' expr Tdo stmnt 143bd389b36SDavid du Colombier { 144bd389b36SDavid du Colombier $$ = an(ODO, an(OLIST, $2, $4), $6); 145bd389b36SDavid du Colombier } 146bd389b36SDavid du Colombier | Twhile expr Tdo stmnt 147bd389b36SDavid du Colombier { 148bd389b36SDavid du Colombier $$ = an(OWHILE, $2, $4); 149bd389b36SDavid du Colombier } 150bd389b36SDavid du Colombier | Tret expr ';' 151bd389b36SDavid du Colombier { 152bd389b36SDavid du Colombier $$ = an(ORET, $2, ZN); 153bd389b36SDavid du Colombier } 154219b2ee8SDavid du Colombier | Tlocal idlist 155bd389b36SDavid du Colombier { 156219b2ee8SDavid du Colombier $$ = an(OLOCAL, $2, ZN); 157219b2ee8SDavid du Colombier } 158219b2ee8SDavid du Colombier | Tcomplex Tid name ';' 159219b2ee8SDavid du Colombier { 160219b2ee8SDavid du Colombier $$ = an(OCOMPLEX, $3, ZN); 161bd389b36SDavid du Colombier $$->sym = $2; 162bd389b36SDavid du Colombier } 163219b2ee8SDavid du Colombier ; 164219b2ee8SDavid du Colombier 165219b2ee8SDavid du Colombier idlist : Tid 166bd389b36SDavid du Colombier { 167219b2ee8SDavid du Colombier $$ = an(ONAME, ZN, ZN); 168219b2ee8SDavid du Colombier $$->sym = $1; 169219b2ee8SDavid du Colombier } 170219b2ee8SDavid du Colombier | idlist ',' Tid 171219b2ee8SDavid du Colombier { 172219b2ee8SDavid du Colombier $$ = an(ONAME, $1, ZN); 173219b2ee8SDavid du Colombier $$->sym = $3; 174bd389b36SDavid du Colombier } 175bd389b36SDavid du Colombier ; 176bd389b36SDavid du Colombier 177bd389b36SDavid du Colombier zexpr : 178bd389b36SDavid du Colombier { $$ = 0; } 179bd389b36SDavid du Colombier | expr 180bd389b36SDavid du Colombier ; 181bd389b36SDavid du Colombier 182219b2ee8SDavid du Colombier expr : castexpr 183bd389b36SDavid du Colombier | expr '*' expr 184bd389b36SDavid du Colombier { 185bd389b36SDavid du Colombier $$ = an(OMUL, $1, $3); 186bd389b36SDavid du Colombier } 187bd389b36SDavid du Colombier | expr '/' expr 188bd389b36SDavid du Colombier { 189bd389b36SDavid du Colombier $$ = an(ODIV, $1, $3); 190bd389b36SDavid du Colombier } 191bd389b36SDavid du Colombier | expr '%' expr 192bd389b36SDavid du Colombier { 193bd389b36SDavid du Colombier $$ = an(OMOD, $1, $3); 194bd389b36SDavid du Colombier } 195bd389b36SDavid du Colombier | expr '+' expr 196bd389b36SDavid du Colombier { 197bd389b36SDavid du Colombier $$ = an(OADD, $1, $3); 198bd389b36SDavid du Colombier } 199bd389b36SDavid du Colombier | expr '-' expr 200bd389b36SDavid du Colombier { 201bd389b36SDavid du Colombier $$ = an(OSUB, $1, $3); 202bd389b36SDavid du Colombier } 203bd389b36SDavid du Colombier | expr Trsh expr 204bd389b36SDavid du Colombier { 205bd389b36SDavid du Colombier $$ = an(ORSH, $1, $3); 206bd389b36SDavid du Colombier } 207bd389b36SDavid du Colombier | expr Tlsh expr 208bd389b36SDavid du Colombier { 209bd389b36SDavid du Colombier $$ = an(OLSH, $1, $3); 210bd389b36SDavid du Colombier } 211bd389b36SDavid du Colombier | expr '<' expr 212bd389b36SDavid du Colombier { 213bd389b36SDavid du Colombier $$ = an(OLT, $1, $3); 214bd389b36SDavid du Colombier } 215bd389b36SDavid du Colombier | expr '>' expr 216bd389b36SDavid du Colombier { 217bd389b36SDavid du Colombier $$ = an(OGT, $1, $3); 218bd389b36SDavid du Colombier } 219bd389b36SDavid du Colombier | expr Tleq expr 220bd389b36SDavid du Colombier { 221bd389b36SDavid du Colombier $$ = an(OLEQ, $1, $3); 222bd389b36SDavid du Colombier } 223bd389b36SDavid du Colombier | expr Tgeq expr 224bd389b36SDavid du Colombier { 225bd389b36SDavid du Colombier $$ = an(OGEQ, $1, $3); 226bd389b36SDavid du Colombier } 227bd389b36SDavid du Colombier | expr Teq expr 228bd389b36SDavid du Colombier { 229bd389b36SDavid du Colombier $$ = an(OEQ, $1, $3); 230bd389b36SDavid du Colombier } 231bd389b36SDavid du Colombier | expr Tneq expr 232bd389b36SDavid du Colombier { 233bd389b36SDavid du Colombier $$ = an(ONEQ, $1, $3); 234bd389b36SDavid du Colombier } 235bd389b36SDavid du Colombier | expr '&' expr 236bd389b36SDavid du Colombier { 237bd389b36SDavid du Colombier $$ = an(OLAND, $1, $3); 238bd389b36SDavid du Colombier } 239bd389b36SDavid du Colombier | expr '^' expr 240bd389b36SDavid du Colombier { 241bd389b36SDavid du Colombier $$ = an(OXOR, $1, $3); 242bd389b36SDavid du Colombier } 243bd389b36SDavid du Colombier | expr '|' expr 244bd389b36SDavid du Colombier { 245bd389b36SDavid du Colombier $$ = an(OLOR, $1, $3); 246bd389b36SDavid du Colombier } 247bd389b36SDavid du Colombier | expr Tandand expr 248bd389b36SDavid du Colombier { 249bd389b36SDavid du Colombier $$ = an(OCAND, $1, $3); 250bd389b36SDavid du Colombier } 251bd389b36SDavid du Colombier | expr Toror expr 252bd389b36SDavid du Colombier { 253bd389b36SDavid du Colombier $$ = an(OCOR, $1, $3); 254bd389b36SDavid du Colombier } 255bd389b36SDavid du Colombier | expr '=' expr 256bd389b36SDavid du Colombier { 257bd389b36SDavid du Colombier $$ = an(OASGN, $1, $3); 258bd389b36SDavid du Colombier } 259219b2ee8SDavid du Colombier | expr Tfmt 260219b2ee8SDavid du Colombier { 261219b2ee8SDavid du Colombier $$ = an(OFMT, $1, con($2)); 262219b2ee8SDavid du Colombier } 263219b2ee8SDavid du Colombier ; 264219b2ee8SDavid du Colombier 265219b2ee8SDavid du Colombier castexpr : monexpr 266219b2ee8SDavid du Colombier | '(' Tid ')' monexpr 267219b2ee8SDavid du Colombier { 268219b2ee8SDavid du Colombier $$ = an(OCAST, $4, ZN); 269219b2ee8SDavid du Colombier $$->sym = $2; 270219b2ee8SDavid du Colombier } 271bd389b36SDavid du Colombier ; 272bd389b36SDavid du Colombier 273bd389b36SDavid du Colombier monexpr : term 274bd389b36SDavid du Colombier | '*' monexpr 275bd389b36SDavid du Colombier { 276bd389b36SDavid du Colombier $$ = an(OINDM, $2, ZN); 277bd389b36SDavid du Colombier } 278bd389b36SDavid du Colombier | '@' monexpr 279bd389b36SDavid du Colombier { 280bd389b36SDavid du Colombier $$ = an(OINDC, $2, ZN); 281bd389b36SDavid du Colombier } 282bd389b36SDavid du Colombier | '+' monexpr 283bd389b36SDavid du Colombier { 284*7c70c028SDavid du Colombier $$ = an(OADD, $2, ZN); 285bd389b36SDavid du Colombier } 286bd389b36SDavid du Colombier | '-' monexpr 287bd389b36SDavid du Colombier { 288bd389b36SDavid du Colombier $$ = con(0); 289bd389b36SDavid du Colombier $$ = an(OSUB, $$, $2); 290bd389b36SDavid du Colombier } 291bd389b36SDavid du Colombier | Tdec monexpr 292bd389b36SDavid du Colombier { 293bd389b36SDavid du Colombier $$ = an(OEDEC, $2, ZN); 294bd389b36SDavid du Colombier } 295bd389b36SDavid du Colombier | Tinc monexpr 296bd389b36SDavid du Colombier { 297bd389b36SDavid du Colombier $$ = an(OEINC, $2, ZN); 298bd389b36SDavid du Colombier } 299bd389b36SDavid du Colombier | Thead monexpr 300bd389b36SDavid du Colombier { 301bd389b36SDavid du Colombier $$ = an(OHEAD, $2, ZN); 302bd389b36SDavid du Colombier } 303bd389b36SDavid du Colombier | Ttail monexpr 304bd389b36SDavid du Colombier { 305bd389b36SDavid du Colombier $$ = an(OTAIL, $2, ZN); 306bd389b36SDavid du Colombier } 307bd389b36SDavid du Colombier | Tappend monexpr ',' monexpr 308bd389b36SDavid du Colombier { 309bd389b36SDavid du Colombier $$ = an(OAPPEND, $2, $4); 310bd389b36SDavid du Colombier } 311bd389b36SDavid du Colombier | Tdelete monexpr ',' monexpr 312bd389b36SDavid du Colombier { 313bd389b36SDavid du Colombier $$ = an(ODELETE, $2, $4); 314bd389b36SDavid du Colombier } 315bd389b36SDavid du Colombier | '!' monexpr 316bd389b36SDavid du Colombier { 317bd389b36SDavid du Colombier $$ = an(ONOT, $2, ZN); 318bd389b36SDavid du Colombier } 319bd389b36SDavid du Colombier | '~' monexpr 320bd389b36SDavid du Colombier { 321bd389b36SDavid du Colombier $$ = an(OXOR, $2, con(-1)); 322bd389b36SDavid du Colombier } 323219b2ee8SDavid du Colombier | Teval monexpr 324219b2ee8SDavid du Colombier { 325219b2ee8SDavid du Colombier $$ = an(OEVAL, $2, ZN); 326219b2ee8SDavid du Colombier } 327bd389b36SDavid du Colombier ; 328bd389b36SDavid du Colombier 329bd389b36SDavid du Colombier term : '(' expr ')' 330bd389b36SDavid du Colombier { 331bd389b36SDavid du Colombier $$ = $2; 332bd389b36SDavid du Colombier } 333bd389b36SDavid du Colombier | '{' args '}' 334bd389b36SDavid du Colombier { 335bd389b36SDavid du Colombier $$ = an(OCTRUCT, $2, ZN); 336bd389b36SDavid du Colombier } 337bd389b36SDavid du Colombier | term '[' expr ']' 338bd389b36SDavid du Colombier { 339bd389b36SDavid du Colombier $$ = an(OINDEX, $1, $3); 340bd389b36SDavid du Colombier } 341bd389b36SDavid du Colombier | term Tdec 342bd389b36SDavid du Colombier { 343bd389b36SDavid du Colombier $$ = an(OPDEC, $1, ZN); 344bd389b36SDavid du Colombier } 345bd389b36SDavid du Colombier | term '.' Tid 346bd389b36SDavid du Colombier { 347bd389b36SDavid du Colombier $$ = an(ODOT, $1, ZN); 348bd389b36SDavid du Colombier $$->sym = $3; 349bd389b36SDavid du Colombier } 350bd389b36SDavid du Colombier | term Tindir Tid 351bd389b36SDavid du Colombier { 352bd389b36SDavid du Colombier $$ = an(ODOT, an(OINDM, $1, ZN), ZN); 353bd389b36SDavid du Colombier $$->sym = $3; 354bd389b36SDavid du Colombier } 355bd389b36SDavid du Colombier | term Tinc 356bd389b36SDavid du Colombier { 357bd389b36SDavid du Colombier $$ = an(OPINC, $1, ZN); 358bd389b36SDavid du Colombier } 359bd389b36SDavid du Colombier | name '(' args ')' 360bd389b36SDavid du Colombier { 361bd389b36SDavid du Colombier $$ = an(OCALL, $1, $3); 362bd389b36SDavid du Colombier } 3630b459c2cSDavid du Colombier | Tbuiltin name '(' args ')' 3640b459c2cSDavid du Colombier { 3650b459c2cSDavid du Colombier $$ = an(OCALL, $2, $4); 3660b459c2cSDavid du Colombier $$->builtin = 1; 3670b459c2cSDavid du Colombier } 368bd389b36SDavid du Colombier | name 369bd389b36SDavid du Colombier | Tconst 370bd389b36SDavid du Colombier { 371bd389b36SDavid du Colombier $$ = con($1); 372bd389b36SDavid du Colombier } 373bd389b36SDavid du Colombier | Tfconst 374bd389b36SDavid du Colombier { 375bd389b36SDavid du Colombier $$ = an(OCONST, ZN, ZN); 376bd389b36SDavid du Colombier $$->type = TFLOAT; 377219b2ee8SDavid du Colombier $$->fmt = 'f'; 378bd389b36SDavid du Colombier $$->fval = $1; 379bd389b36SDavid du Colombier } 380bd389b36SDavid du Colombier | Tstring 381bd389b36SDavid du Colombier { 382bd389b36SDavid du Colombier $$ = an(OCONST, ZN, ZN); 383bd389b36SDavid du Colombier $$->type = TSTRING; 384bd389b36SDavid du Colombier $$->string = $1; 385bd389b36SDavid du Colombier $$->fmt = 's'; 386bd389b36SDavid du Colombier } 387219b2ee8SDavid du Colombier | Twhat zname 388219b2ee8SDavid du Colombier { 389219b2ee8SDavid du Colombier $$ = an(OWHAT, ZN, ZN); 390219b2ee8SDavid du Colombier $$->sym = $2; 391219b2ee8SDavid du Colombier } 392bd389b36SDavid du Colombier ; 393bd389b36SDavid du Colombier 394bd389b36SDavid du Colombier name : Tid 395bd389b36SDavid du Colombier { 396bd389b36SDavid du Colombier $$ = an(ONAME, ZN, ZN); 397bd389b36SDavid du Colombier $$->sym = $1; 398bd389b36SDavid du Colombier } 399bd389b36SDavid du Colombier | Tid ':' name 400bd389b36SDavid du Colombier { 401bd389b36SDavid du Colombier $$ = an(OFRAME, $3, ZN); 402bd389b36SDavid du Colombier $$->sym = $1; 403bd389b36SDavid du Colombier } 404bd389b36SDavid du Colombier ; 405bd389b36SDavid du Colombier 4067dd7cddfSDavid du Colombier args : zexpr 4077dd7cddfSDavid du Colombier | args ',' zexpr 408bd389b36SDavid du Colombier { 409bd389b36SDavid du Colombier $$ = an(OLIST, $1, $3); 410bd389b36SDavid du Colombier } 411bd389b36SDavid du Colombier ; 412