13e12c5d1SDavid du Colombier %{ 23e12c5d1SDavid du Colombier #include "cc.h" 33e12c5d1SDavid du Colombier %} 43e12c5d1SDavid du Colombier %union { 53e12c5d1SDavid du Colombier Node* node; 63e12c5d1SDavid du Colombier Sym* sym; 73e12c5d1SDavid du Colombier Type* type; 87dd7cddfSDavid du Colombier struct 97dd7cddfSDavid du Colombier { 103e12c5d1SDavid du Colombier Type* t; 11d40255d8SDavid du Colombier uchar c; 123e12c5d1SDavid du Colombier } tycl; 137dd7cddfSDavid du Colombier struct 147dd7cddfSDavid du Colombier { 153e12c5d1SDavid du Colombier Type* t1; 163e12c5d1SDavid du Colombier Type* t2; 17d40255d8SDavid du Colombier Type* t3; 18d40255d8SDavid du Colombier uchar c; 193e12c5d1SDavid du Colombier } tyty; 207dd7cddfSDavid du Colombier struct 217dd7cddfSDavid du Colombier { 227dd7cddfSDavid du Colombier char* s; 237dd7cddfSDavid du Colombier long l; 247dd7cddfSDavid du Colombier } sval; 253e12c5d1SDavid du Colombier long lval; 263e12c5d1SDavid du Colombier double dval; 27219b2ee8SDavid du Colombier vlong vval; 283e12c5d1SDavid du Colombier } 29219b2ee8SDavid du Colombier %type <sym> ltag 309a747e4fSDavid du Colombier %type <lval> gctname gcname cname gname tname 319a747e4fSDavid du Colombier %type <lval> gctnlist gcnlist zgnlist 3280ee5cbfSDavid du Colombier %type <type> tlist sbody complex 3380ee5cbfSDavid du Colombier %type <tycl> types 343e12c5d1SDavid du Colombier %type <node> zarglist arglist zcexpr 353e12c5d1SDavid du Colombier %type <node> name block stmnt cexpr expr xuexpr pexpr 367dd7cddfSDavid du Colombier %type <node> zelist elist adecl slist uexpr string lstring 373e12c5d1SDavid du Colombier %type <node> xdecor xdecor2 labels label ulstmnt 38219b2ee8SDavid du Colombier %type <node> adlist edecor tag qual qlist 393e12c5d1SDavid du Colombier %type <node> abdecor abdecor1 abdecor2 abdecor3 404bada075SDavid du Colombier %type <node> zexpr lexpr init ilist forexpr 413e12c5d1SDavid du Colombier 423e12c5d1SDavid du Colombier %left ';' 433e12c5d1SDavid du Colombier %left ',' 443e12c5d1SDavid du Colombier %right '=' LPE LME LMLE LDVE LMDE LRSHE LLSHE LANDE LXORE LORE 453e12c5d1SDavid du Colombier %right '?' ':' 463e12c5d1SDavid du Colombier %left LOROR 473e12c5d1SDavid du Colombier %left LANDAND 483e12c5d1SDavid du Colombier %left '|' 493e12c5d1SDavid du Colombier %left '^' 503e12c5d1SDavid du Colombier %left '&' 513e12c5d1SDavid du Colombier %left LEQ LNE 523e12c5d1SDavid du Colombier %left '<' '>' LLE LGE 533e12c5d1SDavid du Colombier %left LLSH LRSH 543e12c5d1SDavid du Colombier %left '+' '-' 553e12c5d1SDavid du Colombier %left '*' '/' '%' 563e12c5d1SDavid du Colombier %right LMM LPP LMG '.' '[' '(' 573e12c5d1SDavid du Colombier 5880ee5cbfSDavid du Colombier %token <sym> LNAME LTYPE 59219b2ee8SDavid du Colombier %token <dval> LFCONST LDCONST 60219b2ee8SDavid du Colombier %token <vval> LCONST LLCONST LUCONST LULCONST LVLCONST LUVLCONST 617dd7cddfSDavid du Colombier %token <sval> LSTRING LLSTRING 623e12c5d1SDavid du Colombier %token LAUTO LBREAK LCASE LCHAR LCONTINUE LDEFAULT LDO 633e12c5d1SDavid du Colombier %token LDOUBLE LELSE LEXTERN LFLOAT LFOR LGOTO 643e12c5d1SDavid du Colombier %token LIF LINT LLONG LREGISTER LRETURN LSHORT LSIZEOF LUSED 6580ee5cbfSDavid du Colombier %token LSTATIC LSTRUCT LSWITCH LTYPEDEF LTYPESTR LUNION LUNSIGNED 6680ee5cbfSDavid du Colombier %token LWHILE LVOID LENUM LSIGNED LCONSTNT LVOLATILE LSET LSIGNOF 674bada075SDavid du Colombier %token LRESTRICT LINLINE 683e12c5d1SDavid du Colombier %% 693e12c5d1SDavid du Colombier prog: 703e12c5d1SDavid du Colombier | prog xdecl 713e12c5d1SDavid du Colombier 723e12c5d1SDavid du Colombier /* 733e12c5d1SDavid du Colombier * external declarator 743e12c5d1SDavid du Colombier */ 753e12c5d1SDavid du Colombier xdecl: 763e12c5d1SDavid du Colombier zctlist ';' 773e12c5d1SDavid du Colombier { 783e12c5d1SDavid du Colombier dodecl(xdecl, lastclass, lasttype, Z); 793e12c5d1SDavid du Colombier } 803e12c5d1SDavid du Colombier | zctlist xdlist ';' 813e12c5d1SDavid du Colombier | zctlist xdecor 823e12c5d1SDavid du Colombier { 833e12c5d1SDavid du Colombier lastdcl = T; 843e12c5d1SDavid du Colombier firstarg = S; 853e12c5d1SDavid du Colombier dodecl(xdecl, lastclass, lasttype, $2); 863e12c5d1SDavid du Colombier if(lastdcl == T || lastdcl->etype != TFUNC) { 873e12c5d1SDavid du Colombier diag($2, "not a function"); 883e12c5d1SDavid du Colombier lastdcl = types[TFUNC]; 893e12c5d1SDavid du Colombier } 903e12c5d1SDavid du Colombier thisfn = lastdcl; 913e12c5d1SDavid du Colombier markdcl(); 923e12c5d1SDavid du Colombier firstdcl = dclstack; 933e12c5d1SDavid du Colombier argmark($2, 0); 943e12c5d1SDavid du Colombier } 953e12c5d1SDavid du Colombier pdecl 963e12c5d1SDavid du Colombier { 973e12c5d1SDavid du Colombier argmark($2, 1); 983e12c5d1SDavid du Colombier } 993e12c5d1SDavid du Colombier block 1003e12c5d1SDavid du Colombier { 1017dd7cddfSDavid du Colombier Node *n; 1027dd7cddfSDavid du Colombier 1037dd7cddfSDavid du Colombier n = revertdcl(); 1047dd7cddfSDavid du Colombier if(n) 1057dd7cddfSDavid du Colombier $6 = new(OLIST, n, $6); 106fc375d71SDavid du Colombier if(!debug['a'] && !debug['Z']) 1073e12c5d1SDavid du Colombier codgen($6, $2); 1083e12c5d1SDavid du Colombier } 1093e12c5d1SDavid du Colombier 1103e12c5d1SDavid du Colombier xdlist: 1113e12c5d1SDavid du Colombier xdecor 1123e12c5d1SDavid du Colombier { 1133e12c5d1SDavid du Colombier dodecl(xdecl, lastclass, lasttype, $1); 1143e12c5d1SDavid du Colombier } 1153e12c5d1SDavid du Colombier | xdecor 1163e12c5d1SDavid du Colombier { 1177dd7cddfSDavid du Colombier $1 = dodecl(xdecl, lastclass, lasttype, $1); 1183e12c5d1SDavid du Colombier } 1193e12c5d1SDavid du Colombier '=' init 1203e12c5d1SDavid du Colombier { 1213e12c5d1SDavid du Colombier doinit($1->sym, $1->type, 0L, $4); 1223e12c5d1SDavid du Colombier } 1233e12c5d1SDavid du Colombier | xdlist ',' xdlist 1243e12c5d1SDavid du Colombier 1253e12c5d1SDavid du Colombier xdecor: 1263e12c5d1SDavid du Colombier xdecor2 1277dd7cddfSDavid du Colombier | '*' zgnlist xdecor 1283e12c5d1SDavid du Colombier { 1293e12c5d1SDavid du Colombier $$ = new(OIND, $3, Z); 1307dd7cddfSDavid du Colombier $$->garb = simpleg($2); 1313e12c5d1SDavid du Colombier } 1323e12c5d1SDavid du Colombier 1333e12c5d1SDavid du Colombier xdecor2: 1343e12c5d1SDavid du Colombier tag 1353e12c5d1SDavid du Colombier | '(' xdecor ')' 1363e12c5d1SDavid du Colombier { 1373e12c5d1SDavid du Colombier $$ = $2; 1383e12c5d1SDavid du Colombier } 1393e12c5d1SDavid du Colombier | xdecor2 '(' zarglist ')' 1403e12c5d1SDavid du Colombier { 1413e12c5d1SDavid du Colombier $$ = new(OFUNC, $1, $3); 1423e12c5d1SDavid du Colombier } 1433e12c5d1SDavid du Colombier | xdecor2 '[' zexpr ']' 1443e12c5d1SDavid du Colombier { 1453e12c5d1SDavid du Colombier $$ = new(OARRAY, $1, $3); 1463e12c5d1SDavid du Colombier } 1473e12c5d1SDavid du Colombier 1483e12c5d1SDavid du Colombier /* 1493e12c5d1SDavid du Colombier * automatic declarator 1503e12c5d1SDavid du Colombier */ 1513e12c5d1SDavid du Colombier adecl: 1524bada075SDavid du Colombier ctlist ';' 1533e12c5d1SDavid du Colombier { 1543e12c5d1SDavid du Colombier $$ = dodecl(adecl, lastclass, lasttype, Z); 1553e12c5d1SDavid du Colombier } 1564bada075SDavid du Colombier | ctlist adlist ';' 1573e12c5d1SDavid du Colombier { 1584bada075SDavid du Colombier $$ = $2; 1593e12c5d1SDavid du Colombier } 1603e12c5d1SDavid du Colombier 1613e12c5d1SDavid du Colombier adlist: 1623e12c5d1SDavid du Colombier xdecor 1633e12c5d1SDavid du Colombier { 1643e12c5d1SDavid du Colombier dodecl(adecl, lastclass, lasttype, $1); 1653e12c5d1SDavid du Colombier $$ = Z; 1663e12c5d1SDavid du Colombier } 1673e12c5d1SDavid du Colombier | xdecor 1683e12c5d1SDavid du Colombier { 1693e12c5d1SDavid du Colombier $1 = dodecl(adecl, lastclass, lasttype, $1); 1703e12c5d1SDavid du Colombier } 1713e12c5d1SDavid du Colombier '=' init 1723e12c5d1SDavid du Colombier { 1733e12c5d1SDavid du Colombier long w; 1743e12c5d1SDavid du Colombier 1753e12c5d1SDavid du Colombier w = $1->sym->type->width; 1763e12c5d1SDavid du Colombier $$ = doinit($1->sym, $1->type, 0L, $4); 1773e12c5d1SDavid du Colombier $$ = contig($1->sym, $$, w); 1783e12c5d1SDavid du Colombier } 1793e12c5d1SDavid du Colombier | adlist ',' adlist 1803e12c5d1SDavid du Colombier { 1813e12c5d1SDavid du Colombier $$ = $1; 1823e12c5d1SDavid du Colombier if($3 != Z) { 1833e12c5d1SDavid du Colombier $$ = $3; 1843e12c5d1SDavid du Colombier if($1 != Z) 1853e12c5d1SDavid du Colombier $$ = new(OLIST, $1, $3); 1863e12c5d1SDavid du Colombier } 1873e12c5d1SDavid du Colombier } 1883e12c5d1SDavid du Colombier 1893e12c5d1SDavid du Colombier /* 1903e12c5d1SDavid du Colombier * parameter declarator 1913e12c5d1SDavid du Colombier */ 1923e12c5d1SDavid du Colombier pdecl: 1933e12c5d1SDavid du Colombier | pdecl ctlist pdlist ';' 1943e12c5d1SDavid du Colombier 1953e12c5d1SDavid du Colombier pdlist: 1963e12c5d1SDavid du Colombier xdecor 1973e12c5d1SDavid du Colombier { 1983e12c5d1SDavid du Colombier dodecl(pdecl, lastclass, lasttype, $1); 1993e12c5d1SDavid du Colombier } 2003e12c5d1SDavid du Colombier | pdlist ',' pdlist 2013e12c5d1SDavid du Colombier 2023e12c5d1SDavid du Colombier /* 2033e12c5d1SDavid du Colombier * structure element declarator 2043e12c5d1SDavid du Colombier */ 2053e12c5d1SDavid du Colombier edecl: 20680ee5cbfSDavid du Colombier tlist 2073e12c5d1SDavid du Colombier { 2083e12c5d1SDavid du Colombier lasttype = $1; 2093e12c5d1SDavid du Colombier } 2103e12c5d1SDavid du Colombier zedlist ';' 21180ee5cbfSDavid du Colombier | edecl tlist 2123e12c5d1SDavid du Colombier { 2133e12c5d1SDavid du Colombier lasttype = $2; 2143e12c5d1SDavid du Colombier } 2153e12c5d1SDavid du Colombier zedlist ';' 2163e12c5d1SDavid du Colombier 2173e12c5d1SDavid du Colombier zedlist: /* extension */ 2183e12c5d1SDavid du Colombier { 2197dd7cddfSDavid du Colombier lastfield = 0; 2203e12c5d1SDavid du Colombier edecl(CXXX, lasttype, S); 2213e12c5d1SDavid du Colombier } 2223e12c5d1SDavid du Colombier | edlist 2233e12c5d1SDavid du Colombier 2243e12c5d1SDavid du Colombier edlist: 2253e12c5d1SDavid du Colombier edecor 2263e12c5d1SDavid du Colombier { 2273e12c5d1SDavid du Colombier dodecl(edecl, CXXX, lasttype, $1); 2283e12c5d1SDavid du Colombier } 2293e12c5d1SDavid du Colombier | edlist ',' edlist 2303e12c5d1SDavid du Colombier 2313e12c5d1SDavid du Colombier edecor: 2323e12c5d1SDavid du Colombier xdecor 2333e12c5d1SDavid du Colombier { 2343e12c5d1SDavid du Colombier lastbit = 0; 2353e12c5d1SDavid du Colombier firstbit = 1; 2363e12c5d1SDavid du Colombier } 2373e12c5d1SDavid du Colombier | tag ':' lexpr 2383e12c5d1SDavid du Colombier { 2393e12c5d1SDavid du Colombier $$ = new(OBIT, $1, $3); 2403e12c5d1SDavid du Colombier } 2413e12c5d1SDavid du Colombier | ':' lexpr 2423e12c5d1SDavid du Colombier { 2433e12c5d1SDavid du Colombier $$ = new(OBIT, Z, $2); 2443e12c5d1SDavid du Colombier } 2453e12c5d1SDavid du Colombier 2463e12c5d1SDavid du Colombier /* 2473e12c5d1SDavid du Colombier * abstract declarator 2483e12c5d1SDavid du Colombier */ 2493e12c5d1SDavid du Colombier abdecor: 2503e12c5d1SDavid du Colombier { 2513e12c5d1SDavid du Colombier $$ = (Z); 2523e12c5d1SDavid du Colombier } 2533e12c5d1SDavid du Colombier | abdecor1 2543e12c5d1SDavid du Colombier 2553e12c5d1SDavid du Colombier abdecor1: 2567dd7cddfSDavid du Colombier '*' zgnlist 2573e12c5d1SDavid du Colombier { 2583e12c5d1SDavid du Colombier $$ = new(OIND, (Z), Z); 2597dd7cddfSDavid du Colombier $$->garb = simpleg($2); 2603e12c5d1SDavid du Colombier } 2617dd7cddfSDavid du Colombier | '*' zgnlist abdecor1 2623e12c5d1SDavid du Colombier { 2633e12c5d1SDavid du Colombier $$ = new(OIND, $3, Z); 2647dd7cddfSDavid du Colombier $$->garb = simpleg($2); 2653e12c5d1SDavid du Colombier } 2663e12c5d1SDavid du Colombier | abdecor2 2673e12c5d1SDavid du Colombier 2683e12c5d1SDavid du Colombier abdecor2: 2693e12c5d1SDavid du Colombier abdecor3 2703e12c5d1SDavid du Colombier | abdecor2 '(' zarglist ')' 2713e12c5d1SDavid du Colombier { 2723e12c5d1SDavid du Colombier $$ = new(OFUNC, $1, $3); 2733e12c5d1SDavid du Colombier } 2743e12c5d1SDavid du Colombier | abdecor2 '[' zexpr ']' 2753e12c5d1SDavid du Colombier { 2763e12c5d1SDavid du Colombier $$ = new(OARRAY, $1, $3); 2773e12c5d1SDavid du Colombier } 2783e12c5d1SDavid du Colombier 2793e12c5d1SDavid du Colombier abdecor3: 2803e12c5d1SDavid du Colombier '(' ')' 2813e12c5d1SDavid du Colombier { 2823e12c5d1SDavid du Colombier $$ = new(OFUNC, (Z), Z); 2833e12c5d1SDavid du Colombier } 2843e12c5d1SDavid du Colombier | '[' zexpr ']' 2853e12c5d1SDavid du Colombier { 2863e12c5d1SDavid du Colombier $$ = new(OARRAY, (Z), $2); 2873e12c5d1SDavid du Colombier } 2883e12c5d1SDavid du Colombier | '(' abdecor1 ')' 2893e12c5d1SDavid du Colombier { 2903e12c5d1SDavid du Colombier $$ = $2; 2913e12c5d1SDavid du Colombier } 2923e12c5d1SDavid du Colombier 2933e12c5d1SDavid du Colombier init: 2943e12c5d1SDavid du Colombier expr 2953e12c5d1SDavid du Colombier | '{' ilist '}' 2963e12c5d1SDavid du Colombier { 2973e12c5d1SDavid du Colombier $$ = new(OINIT, invert($2), Z); 2983e12c5d1SDavid du Colombier } 2993e12c5d1SDavid du Colombier 3003e12c5d1SDavid du Colombier qual: 3013e12c5d1SDavid du Colombier '[' lexpr ']' 3023e12c5d1SDavid du Colombier { 3033e12c5d1SDavid du Colombier $$ = new(OARRAY, $2, Z); 3043e12c5d1SDavid du Colombier } 305219b2ee8SDavid du Colombier | '.' ltag 3063e12c5d1SDavid du Colombier { 307219b2ee8SDavid du Colombier $$ = new(OELEM, Z, Z); 308219b2ee8SDavid du Colombier $$->sym = $2; 3093e12c5d1SDavid du Colombier } 310219b2ee8SDavid du Colombier | qual '=' 3113e12c5d1SDavid du Colombier 312219b2ee8SDavid du Colombier qlist: 313219b2ee8SDavid du Colombier init ',' 314219b2ee8SDavid du Colombier | qlist init ',' 3153e12c5d1SDavid du Colombier { 3163e12c5d1SDavid du Colombier $$ = new(OLIST, $1, $2); 3173e12c5d1SDavid du Colombier } 318219b2ee8SDavid du Colombier | qual 319219b2ee8SDavid du Colombier | qlist qual 3203e12c5d1SDavid du Colombier { 321219b2ee8SDavid du Colombier $$ = new(OLIST, $1, $2); 3223e12c5d1SDavid du Colombier } 323219b2ee8SDavid du Colombier 324219b2ee8SDavid du Colombier ilist: 325219b2ee8SDavid du Colombier qlist 326219b2ee8SDavid du Colombier | init 327219b2ee8SDavid du Colombier | qlist init 3283e12c5d1SDavid du Colombier { 329219b2ee8SDavid du Colombier $$ = new(OLIST, $1, $2); 3303e12c5d1SDavid du Colombier } 3313e12c5d1SDavid du Colombier 3323e12c5d1SDavid du Colombier zarglist: 3333e12c5d1SDavid du Colombier { 3343e12c5d1SDavid du Colombier $$ = Z; 3353e12c5d1SDavid du Colombier } 3363e12c5d1SDavid du Colombier | arglist 3373e12c5d1SDavid du Colombier { 3383e12c5d1SDavid du Colombier $$ = invert($1); 3393e12c5d1SDavid du Colombier } 3403e12c5d1SDavid du Colombier 3413e12c5d1SDavid du Colombier 3423e12c5d1SDavid du Colombier arglist: 3433e12c5d1SDavid du Colombier name 3443e12c5d1SDavid du Colombier | tlist abdecor 3453e12c5d1SDavid du Colombier { 3463e12c5d1SDavid du Colombier $$ = new(OPROTO, $2, Z); 3473e12c5d1SDavid du Colombier $$->type = $1; 3483e12c5d1SDavid du Colombier } 3493e12c5d1SDavid du Colombier | tlist xdecor 3503e12c5d1SDavid du Colombier { 3513e12c5d1SDavid du Colombier $$ = new(OPROTO, $2, Z); 3523e12c5d1SDavid du Colombier $$->type = $1; 3533e12c5d1SDavid du Colombier } 3543e12c5d1SDavid du Colombier | '.' '.' '.' 3553e12c5d1SDavid du Colombier { 3563e12c5d1SDavid du Colombier $$ = new(ODOTDOT, Z, Z); 3573e12c5d1SDavid du Colombier } 3583e12c5d1SDavid du Colombier | arglist ',' arglist 3593e12c5d1SDavid du Colombier { 3603e12c5d1SDavid du Colombier $$ = new(OLIST, $1, $3); 3613e12c5d1SDavid du Colombier } 3623e12c5d1SDavid du Colombier 3633e12c5d1SDavid du Colombier block: 3644bada075SDavid du Colombier '{' slist '}' 3653e12c5d1SDavid du Colombier { 3664bada075SDavid du Colombier $$ = invert($2); 3674bada075SDavid du Colombier // if($2 != Z) 3684bada075SDavid du Colombier // $$ = new(OLIST, $2, $$); 3699a747e4fSDavid du Colombier if($$ == Z) 3709a747e4fSDavid du Colombier $$ = new(OLIST, Z, Z); 3713e12c5d1SDavid du Colombier } 3723e12c5d1SDavid du Colombier 3733e12c5d1SDavid du Colombier slist: 3743e12c5d1SDavid du Colombier { 3753e12c5d1SDavid du Colombier $$ = Z; 3763e12c5d1SDavid du Colombier } 3774bada075SDavid du Colombier | slist adecl 3784bada075SDavid du Colombier { 3794bada075SDavid du Colombier $$ = new(OLIST, $1, $2); 3804bada075SDavid du Colombier } 3813e12c5d1SDavid du Colombier | slist stmnt 3823e12c5d1SDavid du Colombier { 3833e12c5d1SDavid du Colombier $$ = new(OLIST, $1, $2); 3843e12c5d1SDavid du Colombier } 3853e12c5d1SDavid du Colombier 3863e12c5d1SDavid du Colombier labels: 3873e12c5d1SDavid du Colombier label 3883e12c5d1SDavid du Colombier | labels label 3893e12c5d1SDavid du Colombier { 3903e12c5d1SDavid du Colombier $$ = new(OLIST, $1, $2); 3913e12c5d1SDavid du Colombier } 3923e12c5d1SDavid du Colombier 3933e12c5d1SDavid du Colombier label: 3943e12c5d1SDavid du Colombier LCASE expr ':' 3953e12c5d1SDavid du Colombier { 3963e12c5d1SDavid du Colombier $$ = new(OCASE, $2, Z); 3973e12c5d1SDavid du Colombier } 3983e12c5d1SDavid du Colombier | LDEFAULT ':' 3993e12c5d1SDavid du Colombier { 4003e12c5d1SDavid du Colombier $$ = new(OCASE, Z, Z); 4013e12c5d1SDavid du Colombier } 4023e12c5d1SDavid du Colombier | LNAME ':' 4033e12c5d1SDavid du Colombier { 4043e12c5d1SDavid du Colombier $$ = new(OLABEL, dcllabel($1, 1), Z); 4053e12c5d1SDavid du Colombier } 4063e12c5d1SDavid du Colombier 4073e12c5d1SDavid du Colombier stmnt: 4083e12c5d1SDavid du Colombier error ';' 4093e12c5d1SDavid du Colombier { 4103e12c5d1SDavid du Colombier $$ = Z; 4113e12c5d1SDavid du Colombier } 4123e12c5d1SDavid du Colombier | ulstmnt 4133e12c5d1SDavid du Colombier | labels ulstmnt 4143e12c5d1SDavid du Colombier { 4153e12c5d1SDavid du Colombier $$ = new(OLIST, $1, $2); 4163e12c5d1SDavid du Colombier } 4173e12c5d1SDavid du Colombier 4184bada075SDavid du Colombier forexpr: 4194bada075SDavid du Colombier zcexpr 4204bada075SDavid du Colombier | ctlist adlist 4214bada075SDavid du Colombier { 4224ac975e2SDavid du Colombier $$ = $2; 4234bada075SDavid du Colombier } 4244bada075SDavid du Colombier 4253e12c5d1SDavid du Colombier ulstmnt: 4263e12c5d1SDavid du Colombier zcexpr ';' 4273e12c5d1SDavid du Colombier | { 4283e12c5d1SDavid du Colombier markdcl(); 4293e12c5d1SDavid du Colombier } 4303e12c5d1SDavid du Colombier block 4313e12c5d1SDavid du Colombier { 4327dd7cddfSDavid du Colombier $$ = revertdcl(); 4337dd7cddfSDavid du Colombier if($$) 4347dd7cddfSDavid du Colombier $$ = new(OLIST, $$, $2); 4357dd7cddfSDavid du Colombier else 4363e12c5d1SDavid du Colombier $$ = $2; 4373e12c5d1SDavid du Colombier } 4383e12c5d1SDavid du Colombier | LIF '(' cexpr ')' stmnt 4393e12c5d1SDavid du Colombier { 4403e12c5d1SDavid du Colombier $$ = new(OIF, $3, new(OLIST, $5, Z)); 4419a747e4fSDavid du Colombier if($5 == Z) 4429a747e4fSDavid du Colombier warn($3, "empty if body"); 4433e12c5d1SDavid du Colombier } 4443e12c5d1SDavid du Colombier | LIF '(' cexpr ')' stmnt LELSE stmnt 4453e12c5d1SDavid du Colombier { 4463e12c5d1SDavid du Colombier $$ = new(OIF, $3, new(OLIST, $5, $7)); 4479a747e4fSDavid du Colombier if($5 == Z) 4489a747e4fSDavid du Colombier warn($3, "empty if body"); 4499a747e4fSDavid du Colombier if($7 == Z) 4509a747e4fSDavid du Colombier warn($3, "empty else body"); 4513e12c5d1SDavid du Colombier } 4524bada075SDavid du Colombier | { markdcl(); } LFOR '(' forexpr ';' zcexpr ';' zcexpr ')' stmnt 4533e12c5d1SDavid du Colombier { 4544bada075SDavid du Colombier $$ = revertdcl(); 4554bada075SDavid du Colombier if($$){ 4564bada075SDavid du Colombier if($4) 4574bada075SDavid du Colombier $4 = new(OLIST, $$, $4); 4584bada075SDavid du Colombier else 4594bada075SDavid du Colombier $4 = $$; 4604bada075SDavid du Colombier } 4614bada075SDavid du Colombier $$ = new(OFOR, new(OLIST, $6, new(OLIST, $4, $8)), $10); 4623e12c5d1SDavid du Colombier } 4633e12c5d1SDavid du Colombier | LWHILE '(' cexpr ')' stmnt 4643e12c5d1SDavid du Colombier { 4653e12c5d1SDavid du Colombier $$ = new(OWHILE, $3, $5); 4663e12c5d1SDavid du Colombier } 4673e12c5d1SDavid du Colombier | LDO stmnt LWHILE '(' cexpr ')' ';' 4683e12c5d1SDavid du Colombier { 4693e12c5d1SDavid du Colombier $$ = new(ODWHILE, $5, $2); 4703e12c5d1SDavid du Colombier } 4713e12c5d1SDavid du Colombier | LRETURN zcexpr ';' 4723e12c5d1SDavid du Colombier { 4733e12c5d1SDavid du Colombier $$ = new(ORETURN, $2, Z); 4743e12c5d1SDavid du Colombier $$->type = thisfn->link; 4753e12c5d1SDavid du Colombier } 476219b2ee8SDavid du Colombier | LSWITCH '(' cexpr ')' stmnt 4773e12c5d1SDavid du Colombier { 478219b2ee8SDavid du Colombier $$ = new(OCONST, Z, Z); 479219b2ee8SDavid du Colombier $$->vconst = 0; 4807dd7cddfSDavid du Colombier $$->type = types[TINT]; 481219b2ee8SDavid du Colombier $3 = new(OSUB, $$, $3); 482219b2ee8SDavid du Colombier 483219b2ee8SDavid du Colombier $$ = new(OCONST, Z, Z); 484219b2ee8SDavid du Colombier $$->vconst = 0; 4857dd7cddfSDavid du Colombier $$->type = types[TINT]; 486219b2ee8SDavid du Colombier $3 = new(OSUB, $$, $3); 487219b2ee8SDavid du Colombier 4883e12c5d1SDavid du Colombier $$ = new(OSWITCH, $3, $5); 4893e12c5d1SDavid du Colombier } 4903e12c5d1SDavid du Colombier | LBREAK ';' 4913e12c5d1SDavid du Colombier { 4923e12c5d1SDavid du Colombier $$ = new(OBREAK, Z, Z); 4933e12c5d1SDavid du Colombier } 4943e12c5d1SDavid du Colombier | LCONTINUE ';' 4953e12c5d1SDavid du Colombier { 4963e12c5d1SDavid du Colombier $$ = new(OCONTINUE, Z, Z); 4973e12c5d1SDavid du Colombier } 4989a747e4fSDavid du Colombier | LGOTO ltag ';' 4993e12c5d1SDavid du Colombier { 5003e12c5d1SDavid du Colombier $$ = new(OGOTO, dcllabel($2, 0), Z); 5013e12c5d1SDavid du Colombier } 5023e12c5d1SDavid du Colombier | LUSED '(' zelist ')' ';' 5033e12c5d1SDavid du Colombier { 5043e12c5d1SDavid du Colombier $$ = new(OUSED, $3, Z); 5053e12c5d1SDavid du Colombier } 5063e12c5d1SDavid du Colombier | LSET '(' zelist ')' ';' 5073e12c5d1SDavid du Colombier { 5083e12c5d1SDavid du Colombier $$ = new(OSET, $3, Z); 5093e12c5d1SDavid du Colombier } 5103e12c5d1SDavid du Colombier 5113e12c5d1SDavid du Colombier zcexpr: 5123e12c5d1SDavid du Colombier { 5133e12c5d1SDavid du Colombier $$ = Z; 5143e12c5d1SDavid du Colombier } 5153e12c5d1SDavid du Colombier | cexpr 5163e12c5d1SDavid du Colombier 5173e12c5d1SDavid du Colombier zexpr: 5183e12c5d1SDavid du Colombier { 5193e12c5d1SDavid du Colombier $$ = Z; 5203e12c5d1SDavid du Colombier } 5213e12c5d1SDavid du Colombier | lexpr 5223e12c5d1SDavid du Colombier 5233e12c5d1SDavid du Colombier lexpr: 5243e12c5d1SDavid du Colombier expr 5253e12c5d1SDavid du Colombier { 5263e12c5d1SDavid du Colombier $$ = new(OCAST, $1, Z); 5273e12c5d1SDavid du Colombier $$->type = types[TLONG]; 5283e12c5d1SDavid du Colombier } 5293e12c5d1SDavid du Colombier 5303e12c5d1SDavid du Colombier cexpr: 5313e12c5d1SDavid du Colombier expr 5323e12c5d1SDavid du Colombier | cexpr ',' cexpr 5333e12c5d1SDavid du Colombier { 5343e12c5d1SDavid du Colombier $$ = new(OCOMMA, $1, $3); 5353e12c5d1SDavid du Colombier } 5363e12c5d1SDavid du Colombier 5373e12c5d1SDavid du Colombier expr: 5383e12c5d1SDavid du Colombier xuexpr 5393e12c5d1SDavid du Colombier | expr '*' expr 5403e12c5d1SDavid du Colombier { 5413e12c5d1SDavid du Colombier $$ = new(OMUL, $1, $3); 5423e12c5d1SDavid du Colombier } 5433e12c5d1SDavid du Colombier | expr '/' expr 5443e12c5d1SDavid du Colombier { 5453e12c5d1SDavid du Colombier $$ = new(ODIV, $1, $3); 5463e12c5d1SDavid du Colombier } 5473e12c5d1SDavid du Colombier | expr '%' expr 5483e12c5d1SDavid du Colombier { 5493e12c5d1SDavid du Colombier $$ = new(OMOD, $1, $3); 5503e12c5d1SDavid du Colombier } 5513e12c5d1SDavid du Colombier | expr '+' expr 5523e12c5d1SDavid du Colombier { 5533e12c5d1SDavid du Colombier $$ = new(OADD, $1, $3); 5543e12c5d1SDavid du Colombier } 5553e12c5d1SDavid du Colombier | expr '-' expr 5563e12c5d1SDavid du Colombier { 5573e12c5d1SDavid du Colombier $$ = new(OSUB, $1, $3); 5583e12c5d1SDavid du Colombier } 5593e12c5d1SDavid du Colombier | expr LRSH expr 5603e12c5d1SDavid du Colombier { 5613e12c5d1SDavid du Colombier $$ = new(OASHR, $1, $3); 5623e12c5d1SDavid du Colombier } 5633e12c5d1SDavid du Colombier | expr LLSH expr 5643e12c5d1SDavid du Colombier { 5653e12c5d1SDavid du Colombier $$ = new(OASHL, $1, $3); 5663e12c5d1SDavid du Colombier } 5673e12c5d1SDavid du Colombier | expr '<' expr 5683e12c5d1SDavid du Colombier { 5693e12c5d1SDavid du Colombier $$ = new(OLT, $1, $3); 5703e12c5d1SDavid du Colombier } 5713e12c5d1SDavid du Colombier | expr '>' expr 5723e12c5d1SDavid du Colombier { 5733e12c5d1SDavid du Colombier $$ = new(OGT, $1, $3); 5743e12c5d1SDavid du Colombier } 5753e12c5d1SDavid du Colombier | expr LLE expr 5763e12c5d1SDavid du Colombier { 5773e12c5d1SDavid du Colombier $$ = new(OLE, $1, $3); 5783e12c5d1SDavid du Colombier } 5793e12c5d1SDavid du Colombier | expr LGE expr 5803e12c5d1SDavid du Colombier { 5813e12c5d1SDavid du Colombier $$ = new(OGE, $1, $3); 5823e12c5d1SDavid du Colombier } 5833e12c5d1SDavid du Colombier | expr LEQ expr 5843e12c5d1SDavid du Colombier { 5853e12c5d1SDavid du Colombier $$ = new(OEQ, $1, $3); 5863e12c5d1SDavid du Colombier } 5873e12c5d1SDavid du Colombier | expr LNE expr 5883e12c5d1SDavid du Colombier { 5893e12c5d1SDavid du Colombier $$ = new(ONE, $1, $3); 5903e12c5d1SDavid du Colombier } 5913e12c5d1SDavid du Colombier | expr '&' expr 5923e12c5d1SDavid du Colombier { 5933e12c5d1SDavid du Colombier $$ = new(OAND, $1, $3); 5943e12c5d1SDavid du Colombier } 5953e12c5d1SDavid du Colombier | expr '^' expr 5963e12c5d1SDavid du Colombier { 5973e12c5d1SDavid du Colombier $$ = new(OXOR, $1, $3); 5983e12c5d1SDavid du Colombier } 5993e12c5d1SDavid du Colombier | expr '|' expr 6003e12c5d1SDavid du Colombier { 6013e12c5d1SDavid du Colombier $$ = new(OOR, $1, $3); 6023e12c5d1SDavid du Colombier } 6033e12c5d1SDavid du Colombier | expr LANDAND expr 6043e12c5d1SDavid du Colombier { 6053e12c5d1SDavid du Colombier $$ = new(OANDAND, $1, $3); 6063e12c5d1SDavid du Colombier } 6073e12c5d1SDavid du Colombier | expr LOROR expr 6083e12c5d1SDavid du Colombier { 6093e12c5d1SDavid du Colombier $$ = new(OOROR, $1, $3); 6103e12c5d1SDavid du Colombier } 6113e12c5d1SDavid du Colombier | expr '?' cexpr ':' expr 6123e12c5d1SDavid du Colombier { 6133e12c5d1SDavid du Colombier $$ = new(OCOND, $1, new(OLIST, $3, $5)); 6143e12c5d1SDavid du Colombier } 6153e12c5d1SDavid du Colombier | expr '=' expr 6163e12c5d1SDavid du Colombier { 6173e12c5d1SDavid du Colombier $$ = new(OAS, $1, $3); 6183e12c5d1SDavid du Colombier } 6193e12c5d1SDavid du Colombier | expr LPE expr 6203e12c5d1SDavid du Colombier { 6213e12c5d1SDavid du Colombier $$ = new(OASADD, $1, $3); 6223e12c5d1SDavid du Colombier } 6233e12c5d1SDavid du Colombier | expr LME expr 6243e12c5d1SDavid du Colombier { 6253e12c5d1SDavid du Colombier $$ = new(OASSUB, $1, $3); 6263e12c5d1SDavid du Colombier } 6273e12c5d1SDavid du Colombier | expr LMLE expr 6283e12c5d1SDavid du Colombier { 6293e12c5d1SDavid du Colombier $$ = new(OASMUL, $1, $3); 6303e12c5d1SDavid du Colombier } 6313e12c5d1SDavid du Colombier | expr LDVE expr 6323e12c5d1SDavid du Colombier { 6333e12c5d1SDavid du Colombier $$ = new(OASDIV, $1, $3); 6343e12c5d1SDavid du Colombier } 6353e12c5d1SDavid du Colombier | expr LMDE expr 6363e12c5d1SDavid du Colombier { 6373e12c5d1SDavid du Colombier $$ = new(OASMOD, $1, $3); 6383e12c5d1SDavid du Colombier } 6393e12c5d1SDavid du Colombier | expr LLSHE expr 6403e12c5d1SDavid du Colombier { 6413e12c5d1SDavid du Colombier $$ = new(OASASHL, $1, $3); 6423e12c5d1SDavid du Colombier } 6433e12c5d1SDavid du Colombier | expr LRSHE expr 6443e12c5d1SDavid du Colombier { 6453e12c5d1SDavid du Colombier $$ = new(OASASHR, $1, $3); 6463e12c5d1SDavid du Colombier } 6473e12c5d1SDavid du Colombier | expr LANDE expr 6483e12c5d1SDavid du Colombier { 6493e12c5d1SDavid du Colombier $$ = new(OASAND, $1, $3); 6503e12c5d1SDavid du Colombier } 6513e12c5d1SDavid du Colombier | expr LXORE expr 6523e12c5d1SDavid du Colombier { 6533e12c5d1SDavid du Colombier $$ = new(OASXOR, $1, $3); 6543e12c5d1SDavid du Colombier } 6553e12c5d1SDavid du Colombier | expr LORE expr 6563e12c5d1SDavid du Colombier { 6573e12c5d1SDavid du Colombier $$ = new(OASOR, $1, $3); 6583e12c5d1SDavid du Colombier } 6593e12c5d1SDavid du Colombier 6603e12c5d1SDavid du Colombier xuexpr: 6613e12c5d1SDavid du Colombier uexpr 6623e12c5d1SDavid du Colombier | '(' tlist abdecor ')' xuexpr 6633e12c5d1SDavid du Colombier { 6643e12c5d1SDavid du Colombier $$ = new(OCAST, $5, Z); 6653e12c5d1SDavid du Colombier dodecl(NODECL, CXXX, $2, $3); 6663e12c5d1SDavid du Colombier $$->type = lastdcl; 66722a127bbSDavid du Colombier $$->xcast = 1; 6683e12c5d1SDavid du Colombier } 6693e12c5d1SDavid du Colombier | '(' tlist abdecor ')' '{' ilist '}' /* extension */ 6703e12c5d1SDavid du Colombier { 6713e12c5d1SDavid du Colombier $$ = new(OSTRUCT, $6, Z); 6723e12c5d1SDavid du Colombier dodecl(NODECL, CXXX, $2, $3); 6733e12c5d1SDavid du Colombier $$->type = lastdcl; 6743e12c5d1SDavid du Colombier } 6753e12c5d1SDavid du Colombier 6763e12c5d1SDavid du Colombier uexpr: 6773e12c5d1SDavid du Colombier pexpr 6783e12c5d1SDavid du Colombier | '*' xuexpr 6793e12c5d1SDavid du Colombier { 6803e12c5d1SDavid du Colombier $$ = new(OIND, $2, Z); 6813e12c5d1SDavid du Colombier } 6823e12c5d1SDavid du Colombier | '&' xuexpr 6833e12c5d1SDavid du Colombier { 6843e12c5d1SDavid du Colombier $$ = new(OADDR, $2, Z); 6853e12c5d1SDavid du Colombier } 6863e12c5d1SDavid du Colombier | '+' xuexpr 6873e12c5d1SDavid du Colombier { 68880ee5cbfSDavid du Colombier $$ = new(OPOS, $2, Z); 6893e12c5d1SDavid du Colombier } 6903e12c5d1SDavid du Colombier | '-' xuexpr 6913e12c5d1SDavid du Colombier { 69280ee5cbfSDavid du Colombier $$ = new(ONEG, $2, Z); 6933e12c5d1SDavid du Colombier } 6943e12c5d1SDavid du Colombier | '!' xuexpr 6953e12c5d1SDavid du Colombier { 6963e12c5d1SDavid du Colombier $$ = new(ONOT, $2, Z); 6973e12c5d1SDavid du Colombier } 6983e12c5d1SDavid du Colombier | '~' xuexpr 6993e12c5d1SDavid du Colombier { 70080ee5cbfSDavid du Colombier $$ = new(OCOM, $2, Z); 7013e12c5d1SDavid du Colombier } 7023e12c5d1SDavid du Colombier | LPP xuexpr 7033e12c5d1SDavid du Colombier { 7043e12c5d1SDavid du Colombier $$ = new(OPREINC, $2, Z); 7053e12c5d1SDavid du Colombier } 7063e12c5d1SDavid du Colombier | LMM xuexpr 7073e12c5d1SDavid du Colombier { 7083e12c5d1SDavid du Colombier $$ = new(OPREDEC, $2, Z); 7093e12c5d1SDavid du Colombier } 7103e12c5d1SDavid du Colombier | LSIZEOF uexpr 7113e12c5d1SDavid du Colombier { 7123e12c5d1SDavid du Colombier $$ = new(OSIZE, $2, Z); 7133e12c5d1SDavid du Colombier } 7147dd7cddfSDavid du Colombier | LSIGNOF uexpr 7157dd7cddfSDavid du Colombier { 7167dd7cddfSDavid du Colombier $$ = new(OSIGN, $2, Z); 7177dd7cddfSDavid du Colombier } 7183e12c5d1SDavid du Colombier 7193e12c5d1SDavid du Colombier pexpr: 7203e12c5d1SDavid du Colombier '(' cexpr ')' 7213e12c5d1SDavid du Colombier { 7223e12c5d1SDavid du Colombier $$ = $2; 7233e12c5d1SDavid du Colombier } 7243e12c5d1SDavid du Colombier | LSIZEOF '(' tlist abdecor ')' 7253e12c5d1SDavid du Colombier { 7263e12c5d1SDavid du Colombier $$ = new(OSIZE, Z, Z); 7273e12c5d1SDavid du Colombier dodecl(NODECL, CXXX, $3, $4); 7283e12c5d1SDavid du Colombier $$->type = lastdcl; 7293e12c5d1SDavid du Colombier } 7307dd7cddfSDavid du Colombier | LSIGNOF '(' tlist abdecor ')' 7317dd7cddfSDavid du Colombier { 7327dd7cddfSDavid du Colombier $$ = new(OSIGN, Z, Z); 7337dd7cddfSDavid du Colombier dodecl(NODECL, CXXX, $3, $4); 7347dd7cddfSDavid du Colombier $$->type = lastdcl; 7357dd7cddfSDavid du Colombier } 7363e12c5d1SDavid du Colombier | pexpr '(' zelist ')' 7373e12c5d1SDavid du Colombier { 7383e12c5d1SDavid du Colombier $$ = new(OFUNC, $1, Z); 7393e12c5d1SDavid du Colombier if($1->op == ONAME) 7403e12c5d1SDavid du Colombier if($1->type == T) 7417dd7cddfSDavid du Colombier dodecl(xdecl, CXXX, types[TINT], $$); 7423e12c5d1SDavid du Colombier $$->right = invert($3); 7433e12c5d1SDavid du Colombier } 7443e12c5d1SDavid du Colombier | pexpr '[' cexpr ']' 7453e12c5d1SDavid du Colombier { 7463e12c5d1SDavid du Colombier $$ = new(OIND, new(OADD, $1, $3), Z); 7473e12c5d1SDavid du Colombier } 7483e12c5d1SDavid du Colombier | pexpr LMG ltag 7493e12c5d1SDavid du Colombier { 7503e12c5d1SDavid du Colombier $$ = new(ODOT, new(OIND, $1, Z), Z); 751219b2ee8SDavid du Colombier $$->sym = $3; 7523e12c5d1SDavid du Colombier } 7533e12c5d1SDavid du Colombier | pexpr '.' ltag 7543e12c5d1SDavid du Colombier { 7553e12c5d1SDavid du Colombier $$ = new(ODOT, $1, Z); 756219b2ee8SDavid du Colombier $$->sym = $3; 7573e12c5d1SDavid du Colombier } 7583e12c5d1SDavid du Colombier | pexpr LPP 7593e12c5d1SDavid du Colombier { 7603e12c5d1SDavid du Colombier $$ = new(OPOSTINC, $1, Z); 7613e12c5d1SDavid du Colombier } 7623e12c5d1SDavid du Colombier | pexpr LMM 7633e12c5d1SDavid du Colombier { 7643e12c5d1SDavid du Colombier $$ = new(OPOSTDEC, $1, Z); 7653e12c5d1SDavid du Colombier } 7663e12c5d1SDavid du Colombier | name 7673e12c5d1SDavid du Colombier | LCONST 7683e12c5d1SDavid du Colombier { 7693e12c5d1SDavid du Colombier $$ = new(OCONST, Z, Z); 7707dd7cddfSDavid du Colombier $$->type = types[TINT]; 771219b2ee8SDavid du Colombier $$->vconst = $1; 77222a127bbSDavid du Colombier $$->cstring = strdup(symb); 7733e12c5d1SDavid du Colombier } 7743e12c5d1SDavid du Colombier | LLCONST 7753e12c5d1SDavid du Colombier { 7763e12c5d1SDavid du Colombier $$ = new(OCONST, Z, Z); 7773e12c5d1SDavid du Colombier $$->type = types[TLONG]; 778219b2ee8SDavid du Colombier $$->vconst = $1; 77922a127bbSDavid du Colombier $$->cstring = strdup(symb); 7803e12c5d1SDavid du Colombier } 7813e12c5d1SDavid du Colombier | LUCONST 7823e12c5d1SDavid du Colombier { 7833e12c5d1SDavid du Colombier $$ = new(OCONST, Z, Z); 7847dd7cddfSDavid du Colombier $$->type = types[TUINT]; 785219b2ee8SDavid du Colombier $$->vconst = $1; 78622a127bbSDavid du Colombier $$->cstring = strdup(symb); 7873e12c5d1SDavid du Colombier } 7883e12c5d1SDavid du Colombier | LULCONST 7893e12c5d1SDavid du Colombier { 7903e12c5d1SDavid du Colombier $$ = new(OCONST, Z, Z); 7913e12c5d1SDavid du Colombier $$->type = types[TULONG]; 792219b2ee8SDavid du Colombier $$->vconst = $1; 79322a127bbSDavid du Colombier $$->cstring = strdup(symb); 7943e12c5d1SDavid du Colombier } 7953e12c5d1SDavid du Colombier | LDCONST 7963e12c5d1SDavid du Colombier { 7973e12c5d1SDavid du Colombier $$ = new(OCONST, Z, Z); 7983e12c5d1SDavid du Colombier $$->type = types[TDOUBLE]; 799219b2ee8SDavid du Colombier $$->fconst = $1; 80022a127bbSDavid du Colombier $$->cstring = strdup(symb); 8013e12c5d1SDavid du Colombier } 8023e12c5d1SDavid du Colombier | LFCONST 8033e12c5d1SDavid du Colombier { 8043e12c5d1SDavid du Colombier $$ = new(OCONST, Z, Z); 8053e12c5d1SDavid du Colombier $$->type = types[TFLOAT]; 806219b2ee8SDavid du Colombier $$->fconst = $1; 80722a127bbSDavid du Colombier $$->cstring = strdup(symb); 8083e12c5d1SDavid du Colombier } 8093e12c5d1SDavid du Colombier | LVLCONST 8103e12c5d1SDavid du Colombier { 8113e12c5d1SDavid du Colombier $$ = new(OCONST, Z, Z); 8123e12c5d1SDavid du Colombier $$->type = types[TVLONG]; 813219b2ee8SDavid du Colombier $$->vconst = $1; 81422a127bbSDavid du Colombier $$->cstring = strdup(symb); 815219b2ee8SDavid du Colombier } 816219b2ee8SDavid du Colombier | LUVLCONST 817219b2ee8SDavid du Colombier { 818219b2ee8SDavid du Colombier $$ = new(OCONST, Z, Z); 819219b2ee8SDavid du Colombier $$->type = types[TUVLONG]; 820219b2ee8SDavid du Colombier $$->vconst = $1; 82122a127bbSDavid du Colombier $$->cstring = strdup(symb); 8223e12c5d1SDavid du Colombier } 8237dd7cddfSDavid du Colombier | string 8247dd7cddfSDavid du Colombier | lstring 8257dd7cddfSDavid du Colombier 8267dd7cddfSDavid du Colombier string: 8277dd7cddfSDavid du Colombier LSTRING 8283e12c5d1SDavid du Colombier { 8293e12c5d1SDavid du Colombier $$ = new(OSTRING, Z, Z); 8303e12c5d1SDavid du Colombier $$->type = typ(TARRAY, types[TCHAR]); 8317dd7cddfSDavid du Colombier $$->type->width = $1.l + 1; 8327dd7cddfSDavid du Colombier $$->cstring = $1.s; 8337dd7cddfSDavid du Colombier $$->sym = symstring; 8343e12c5d1SDavid du Colombier $$->etype = TARRAY; 8353e12c5d1SDavid du Colombier $$->class = CSTATIC; 8363e12c5d1SDavid du Colombier } 8377dd7cddfSDavid du Colombier | string LSTRING 8387dd7cddfSDavid du Colombier { 8397dd7cddfSDavid du Colombier char *s; 8407dd7cddfSDavid du Colombier int n; 8417dd7cddfSDavid du Colombier 8427dd7cddfSDavid du Colombier n = $1->type->width - 1; 8437dd7cddfSDavid du Colombier s = alloc(n+$2.l+MAXALIGN); 8447dd7cddfSDavid du Colombier 8457dd7cddfSDavid du Colombier memcpy(s, $1->cstring, n); 8467dd7cddfSDavid du Colombier memcpy(s+n, $2.s, $2.l); 8477dd7cddfSDavid du Colombier s[n+$2.l] = 0; 8487dd7cddfSDavid du Colombier 8497dd7cddfSDavid du Colombier $$ = $1; 8507dd7cddfSDavid du Colombier $$->type->width += $2.l; 8517dd7cddfSDavid du Colombier $$->cstring = s; 8527dd7cddfSDavid du Colombier } 8537dd7cddfSDavid du Colombier 8547dd7cddfSDavid du Colombier lstring: 8557dd7cddfSDavid du Colombier LLSTRING 8563e12c5d1SDavid du Colombier { 8573e12c5d1SDavid du Colombier $$ = new(OLSTRING, Z, Z); 858*82726826SDavid du Colombier $$->type = typ(TARRAY, types[TRUNE]); 859*82726826SDavid du Colombier $$->type->width = $1.l + sizeof(TRune); 860*82726826SDavid du Colombier $$->rstring = (TRune*)$1.s; 8617dd7cddfSDavid du Colombier $$->sym = symstring; 8623e12c5d1SDavid du Colombier $$->etype = TARRAY; 8633e12c5d1SDavid du Colombier $$->class = CSTATIC; 8643e12c5d1SDavid du Colombier } 8657dd7cddfSDavid du Colombier | lstring LLSTRING 8667dd7cddfSDavid du Colombier { 8677dd7cddfSDavid du Colombier char *s; 8687dd7cddfSDavid du Colombier int n; 8697dd7cddfSDavid du Colombier 870*82726826SDavid du Colombier n = $1->type->width - sizeof(TRune); 8717dd7cddfSDavid du Colombier s = alloc(n+$2.l+MAXALIGN); 8727dd7cddfSDavid du Colombier 8737dd7cddfSDavid du Colombier memcpy(s, $1->rstring, n); 8747dd7cddfSDavid du Colombier memcpy(s+n, $2.s, $2.l); 875*82726826SDavid du Colombier *(TRune*)(s+n+$2.l) = 0; 8767dd7cddfSDavid du Colombier 8777dd7cddfSDavid du Colombier $$ = $1; 8787dd7cddfSDavid du Colombier $$->type->width += $2.l; 879*82726826SDavid du Colombier $$->rstring = (TRune*)s; 8807dd7cddfSDavid du Colombier } 8813e12c5d1SDavid du Colombier 8823e12c5d1SDavid du Colombier zelist: 8833e12c5d1SDavid du Colombier { 8843e12c5d1SDavid du Colombier $$ = Z; 8853e12c5d1SDavid du Colombier } 8863e12c5d1SDavid du Colombier | elist 8873e12c5d1SDavid du Colombier 8883e12c5d1SDavid du Colombier elist: 8893e12c5d1SDavid du Colombier expr 8903e12c5d1SDavid du Colombier | elist ',' elist 8913e12c5d1SDavid du Colombier { 8923e12c5d1SDavid du Colombier $$ = new(OLIST, $1, $3); 8933e12c5d1SDavid du Colombier } 8943e12c5d1SDavid du Colombier 8953e12c5d1SDavid du Colombier sbody: 8963e12c5d1SDavid du Colombier '{' 8973e12c5d1SDavid du Colombier { 8983e12c5d1SDavid du Colombier $<tyty>$.t1 = strf; 8993e12c5d1SDavid du Colombier $<tyty>$.t2 = strl; 900d40255d8SDavid du Colombier $<tyty>$.t3 = lasttype; 901d40255d8SDavid du Colombier $<tyty>$.c = lastclass; 9023e12c5d1SDavid du Colombier strf = T; 9033e12c5d1SDavid du Colombier strl = T; 9043e12c5d1SDavid du Colombier lastbit = 0; 9053e12c5d1SDavid du Colombier firstbit = 1; 906d40255d8SDavid du Colombier lastclass = CXXX; 907d40255d8SDavid du Colombier lasttype = T; 9083e12c5d1SDavid du Colombier } 9093e12c5d1SDavid du Colombier edecl '}' 9103e12c5d1SDavid du Colombier { 9113e12c5d1SDavid du Colombier $$ = strf; 9123e12c5d1SDavid du Colombier strf = $<tyty>2.t1; 9133e12c5d1SDavid du Colombier strl = $<tyty>2.t2; 914d40255d8SDavid du Colombier lasttype = $<tyty>2.t3; 915d40255d8SDavid du Colombier lastclass = $<tyty>2.c; 9163e12c5d1SDavid du Colombier } 9173e12c5d1SDavid du Colombier 9183e12c5d1SDavid du Colombier zctlist: 9193e12c5d1SDavid du Colombier { 9203e12c5d1SDavid du Colombier lastclass = CXXX; 9217dd7cddfSDavid du Colombier lasttype = types[TINT]; 9223e12c5d1SDavid du Colombier } 9233e12c5d1SDavid du Colombier | ctlist 9243e12c5d1SDavid du Colombier 9253e12c5d1SDavid du Colombier types: 9263e12c5d1SDavid du Colombier complex 9273e12c5d1SDavid du Colombier { 9283e12c5d1SDavid du Colombier $$.t = $1; 9293e12c5d1SDavid du Colombier $$.c = CXXX; 9303e12c5d1SDavid du Colombier } 9319a747e4fSDavid du Colombier | tname 9323e12c5d1SDavid du Colombier { 9339a747e4fSDavid du Colombier $$.t = simplet($1); 9349a747e4fSDavid du Colombier $$.c = CXXX; 9353e12c5d1SDavid du Colombier } 9369a747e4fSDavid du Colombier | gcnlist 9373e12c5d1SDavid du Colombier { 9383e12c5d1SDavid du Colombier $$.t = simplet($1); 9393e12c5d1SDavid du Colombier $$.c = simplec($1); 9407dd7cddfSDavid du Colombier $$.t = garbt($$.t, $1); 9413e12c5d1SDavid du Colombier } 9429a747e4fSDavid du Colombier | complex gctnlist 9439a747e4fSDavid du Colombier { 9449a747e4fSDavid du Colombier $$.t = $1; 9459a747e4fSDavid du Colombier $$.c = simplec($2); 9469a747e4fSDavid du Colombier $$.t = garbt($$.t, $2); 9479a747e4fSDavid du Colombier if($2 & ~BCLASS & ~BGARB) 9489a747e4fSDavid du Colombier diag(Z, "duplicate types given: %T and %Q", $1, $2); 9499a747e4fSDavid du Colombier } 9509a747e4fSDavid du Colombier | tname gctnlist 9519a747e4fSDavid du Colombier { 9529a747e4fSDavid du Colombier $$.t = simplet(typebitor($1, $2)); 9539a747e4fSDavid du Colombier $$.c = simplec($2); 9549a747e4fSDavid du Colombier $$.t = garbt($$.t, $2); 9559a747e4fSDavid du Colombier } 9569a747e4fSDavid du Colombier | gcnlist complex zgnlist 9573e12c5d1SDavid du Colombier { 9583e12c5d1SDavid du Colombier $$.t = $2; 9593e12c5d1SDavid du Colombier $$.c = simplec($1); 9609a747e4fSDavid du Colombier $$.t = garbt($$.t, $1|$3); 9613e12c5d1SDavid du Colombier } 9629a747e4fSDavid du Colombier | gcnlist tname 9633e12c5d1SDavid du Colombier { 9649a747e4fSDavid du Colombier $$.t = simplet($2); 9659a747e4fSDavid du Colombier $$.c = simplec($1); 9669a747e4fSDavid du Colombier $$.t = garbt($$.t, $1); 9679a747e4fSDavid du Colombier } 9689a747e4fSDavid du Colombier | gcnlist tname gctnlist 9699a747e4fSDavid du Colombier { 9709a747e4fSDavid du Colombier $$.t = simplet(typebitor($2, $3)); 9713e12c5d1SDavid du Colombier $$.c = simplec($1|$3); 9727dd7cddfSDavid du Colombier $$.t = garbt($$.t, $1|$3); 9737dd7cddfSDavid du Colombier } 9747dd7cddfSDavid du Colombier 9753e12c5d1SDavid du Colombier tlist: 9763e12c5d1SDavid du Colombier types 9773e12c5d1SDavid du Colombier { 9783e12c5d1SDavid du Colombier $$ = $1.t; 9793e12c5d1SDavid du Colombier if($1.c != CXXX) 9807dd7cddfSDavid du Colombier diag(Z, "illegal combination of class 4: %s", cnames[$1.c]); 9813e12c5d1SDavid du Colombier } 9823e12c5d1SDavid du Colombier 9833e12c5d1SDavid du Colombier ctlist: 9843e12c5d1SDavid du Colombier types 9853e12c5d1SDavid du Colombier { 9863e12c5d1SDavid du Colombier lasttype = $1.t; 9873e12c5d1SDavid du Colombier lastclass = $1.c; 9883e12c5d1SDavid du Colombier } 9893e12c5d1SDavid du Colombier 9903e12c5d1SDavid du Colombier complex: 9913e12c5d1SDavid du Colombier LSTRUCT ltag 9923e12c5d1SDavid du Colombier { 993219b2ee8SDavid du Colombier dotag($2, TSTRUCT, 0); 994219b2ee8SDavid du Colombier $$ = $2->suetag; 9953e12c5d1SDavid du Colombier } 9963e12c5d1SDavid du Colombier | LSTRUCT ltag 9973e12c5d1SDavid du Colombier { 998219b2ee8SDavid du Colombier dotag($2, TSTRUCT, autobn); 9993e12c5d1SDavid du Colombier } 10003e12c5d1SDavid du Colombier sbody 10013e12c5d1SDavid du Colombier { 1002219b2ee8SDavid du Colombier $$ = $2->suetag; 10033e12c5d1SDavid du Colombier if($$->link != T) 1004219b2ee8SDavid du Colombier diag(Z, "redeclare tag: %s", $2->name); 10053e12c5d1SDavid du Colombier $$->link = $4; 1006d40255d8SDavid du Colombier sualign($$); 10073e12c5d1SDavid du Colombier } 10083e12c5d1SDavid du Colombier | LSTRUCT sbody 10093e12c5d1SDavid du Colombier { 1010219b2ee8SDavid du Colombier taggen++; 1011219b2ee8SDavid du Colombier sprint(symb, "_%d_", taggen); 1012219b2ee8SDavid du Colombier $$ = dotag(lookup(), TSTRUCT, autobn); 1013219b2ee8SDavid du Colombier $$->link = $2; 1014d40255d8SDavid du Colombier sualign($$); 10153e12c5d1SDavid du Colombier } 10163e12c5d1SDavid du Colombier | LUNION ltag 10173e12c5d1SDavid du Colombier { 1018219b2ee8SDavid du Colombier dotag($2, TUNION, 0); 1019219b2ee8SDavid du Colombier $$ = $2->suetag; 10203e12c5d1SDavid du Colombier } 10213e12c5d1SDavid du Colombier | LUNION ltag 10223e12c5d1SDavid du Colombier { 1023219b2ee8SDavid du Colombier dotag($2, TUNION, autobn); 10243e12c5d1SDavid du Colombier } 10253e12c5d1SDavid du Colombier sbody 10263e12c5d1SDavid du Colombier { 1027219b2ee8SDavid du Colombier $$ = $2->suetag; 10283e12c5d1SDavid du Colombier if($$->link != T) 1029219b2ee8SDavid du Colombier diag(Z, "redeclare tag: %s", $2->name); 10303e12c5d1SDavid du Colombier $$->link = $4; 1031d40255d8SDavid du Colombier sualign($$); 10323e12c5d1SDavid du Colombier } 10333e12c5d1SDavid du Colombier | LUNION sbody 10343e12c5d1SDavid du Colombier { 1035219b2ee8SDavid du Colombier taggen++; 1036219b2ee8SDavid du Colombier sprint(symb, "_%d_", taggen); 1037219b2ee8SDavid du Colombier $$ = dotag(lookup(), TUNION, autobn); 1038219b2ee8SDavid du Colombier $$->link = $2; 1039d40255d8SDavid du Colombier sualign($$); 10403e12c5d1SDavid du Colombier } 10413e12c5d1SDavid du Colombier | LENUM ltag 10423e12c5d1SDavid du Colombier { 1043219b2ee8SDavid du Colombier dotag($2, TENUM, 0); 1044219b2ee8SDavid du Colombier $$ = $2->suetag; 10453e12c5d1SDavid du Colombier if($$->link == T) 10467dd7cddfSDavid du Colombier $$->link = types[TINT]; 10473e12c5d1SDavid du Colombier $$ = $$->link; 10483e12c5d1SDavid du Colombier } 10493e12c5d1SDavid du Colombier | LENUM ltag 10503e12c5d1SDavid du Colombier { 1051219b2ee8SDavid du Colombier dotag($2, TENUM, autobn); 10523e12c5d1SDavid du Colombier } 10533e12c5d1SDavid du Colombier '{' 10543e12c5d1SDavid du Colombier { 1055219b2ee8SDavid du Colombier en.tenum = T; 1056219b2ee8SDavid du Colombier en.cenum = T; 10573e12c5d1SDavid du Colombier } 10583e12c5d1SDavid du Colombier enum '}' 10593e12c5d1SDavid du Colombier { 1060219b2ee8SDavid du Colombier $$ = $2->suetag; 10613e12c5d1SDavid du Colombier if($$->link != T) 1062219b2ee8SDavid du Colombier diag(Z, "redeclare tag: %s", $2->name); 1063219b2ee8SDavid du Colombier if(en.tenum == T) { 1064219b2ee8SDavid du Colombier diag(Z, "enum type ambiguous: %s", $2->name); 10657dd7cddfSDavid du Colombier en.tenum = types[TINT]; 1066219b2ee8SDavid du Colombier } 1067219b2ee8SDavid du Colombier $$->link = en.tenum; 1068219b2ee8SDavid du Colombier $$ = en.tenum; 10693e12c5d1SDavid du Colombier } 10703e12c5d1SDavid du Colombier | LENUM '{' 10713e12c5d1SDavid du Colombier { 1072219b2ee8SDavid du Colombier en.tenum = T; 1073219b2ee8SDavid du Colombier en.cenum = T; 10743e12c5d1SDavid du Colombier } 10753e12c5d1SDavid du Colombier enum '}' 10763e12c5d1SDavid du Colombier { 1077219b2ee8SDavid du Colombier $$ = en.tenum; 10783e12c5d1SDavid du Colombier } 107980ee5cbfSDavid du Colombier | LTYPE 10803e12c5d1SDavid du Colombier { 10813e12c5d1SDavid du Colombier $$ = tcopy($1->type); 1082219b2ee8SDavid du Colombier } 10833e12c5d1SDavid du Colombier 10847dd7cddfSDavid du Colombier gctnlist: 10857dd7cddfSDavid du Colombier gctname 10867dd7cddfSDavid du Colombier | gctnlist gctname 10877dd7cddfSDavid du Colombier { 10887dd7cddfSDavid du Colombier $$ = typebitor($1, $2); 10897dd7cddfSDavid du Colombier } 10907dd7cddfSDavid du Colombier 10917dd7cddfSDavid du Colombier zgnlist: 10927dd7cddfSDavid du Colombier { 10937dd7cddfSDavid du Colombier $$ = 0; 10947dd7cddfSDavid du Colombier } 10957dd7cddfSDavid du Colombier | zgnlist gname 10967dd7cddfSDavid du Colombier { 10977dd7cddfSDavid du Colombier $$ = typebitor($1, $2); 10987dd7cddfSDavid du Colombier } 10997dd7cddfSDavid du Colombier 11007dd7cddfSDavid du Colombier gctname: 11017dd7cddfSDavid du Colombier tname 11027dd7cddfSDavid du Colombier | gname 11037dd7cddfSDavid du Colombier | cname 11043e12c5d1SDavid du Colombier 11059a747e4fSDavid du Colombier gcnlist: 11069a747e4fSDavid du Colombier gcname 11079a747e4fSDavid du Colombier | gcnlist gcname 11089a747e4fSDavid du Colombier { 11099a747e4fSDavid du Colombier $$ = typebitor($1, $2); 11109a747e4fSDavid du Colombier } 11119a747e4fSDavid du Colombier 11129a747e4fSDavid du Colombier gcname: 11139a747e4fSDavid du Colombier gname 11149a747e4fSDavid du Colombier | cname 11159a747e4fSDavid du Colombier 11163e12c5d1SDavid du Colombier enum: 11173e12c5d1SDavid du Colombier LNAME 11183e12c5d1SDavid du Colombier { 11193e12c5d1SDavid du Colombier doenum($1, Z); 11203e12c5d1SDavid du Colombier } 1121219b2ee8SDavid du Colombier | LNAME '=' expr 11223e12c5d1SDavid du Colombier { 1123219b2ee8SDavid du Colombier doenum($1, $3); 11243e12c5d1SDavid du Colombier } 11253e12c5d1SDavid du Colombier | enum ',' 11263e12c5d1SDavid du Colombier | enum ',' enum 11273e12c5d1SDavid du Colombier 11287dd7cddfSDavid du Colombier tname: /* type words */ 11297dd7cddfSDavid du Colombier LCHAR { $$ = BCHAR; } 11303e12c5d1SDavid du Colombier | LSHORT { $$ = BSHORT; } 11313e12c5d1SDavid du Colombier | LINT { $$ = BINT; } 11323e12c5d1SDavid du Colombier | LLONG { $$ = BLONG; } 11333e12c5d1SDavid du Colombier | LSIGNED { $$ = BSIGNED; } 11343e12c5d1SDavid du Colombier | LUNSIGNED { $$ = BUNSIGNED; } 11353e12c5d1SDavid du Colombier | LFLOAT { $$ = BFLOAT; } 11363e12c5d1SDavid du Colombier | LDOUBLE { $$ = BDOUBLE; } 11373e12c5d1SDavid du Colombier | LVOID { $$ = BVOID; } 11383e12c5d1SDavid du Colombier 11397dd7cddfSDavid du Colombier cname: /* class words */ 11407dd7cddfSDavid du Colombier LAUTO { $$ = BAUTO; } 11413e12c5d1SDavid du Colombier | LSTATIC { $$ = BSTATIC; } 11423e12c5d1SDavid du Colombier | LEXTERN { $$ = BEXTERN; } 11433e12c5d1SDavid du Colombier | LTYPEDEF { $$ = BTYPEDEF; } 114480ee5cbfSDavid du Colombier | LTYPESTR { $$ = BTYPESTR; } 11453e12c5d1SDavid du Colombier | LREGISTER { $$ = BREGISTER; } 11464bada075SDavid du Colombier | LINLINE { $$ = 0; } 11473e12c5d1SDavid du Colombier 114880ee5cbfSDavid du Colombier gname: /* garbage words */ 11497dd7cddfSDavid du Colombier LCONSTNT { $$ = BCONSTNT; } 11507dd7cddfSDavid du Colombier | LVOLATILE { $$ = BVOLATILE; } 11514bada075SDavid du Colombier | LRESTRICT { $$ = 0; } 11523e12c5d1SDavid du Colombier 11533e12c5d1SDavid du Colombier name: 11543e12c5d1SDavid du Colombier LNAME 11553e12c5d1SDavid du Colombier { 11563e12c5d1SDavid du Colombier $$ = new(ONAME, Z, Z); 11573e12c5d1SDavid du Colombier if($1->class == CLOCAL) 11583e12c5d1SDavid du Colombier $1 = mkstatic($1); 11593e12c5d1SDavid du Colombier $$->sym = $1; 11603e12c5d1SDavid du Colombier $$->type = $1->type; 11613e12c5d1SDavid du Colombier $$->etype = TVOID; 11623e12c5d1SDavid du Colombier if($$->type != T) 11633e12c5d1SDavid du Colombier $$->etype = $$->type->etype; 1164219b2ee8SDavid du Colombier $$->xoffset = $1->offset; 11653e12c5d1SDavid du Colombier $$->class = $1->class; 11663e12c5d1SDavid du Colombier $1->aused = 1; 11673e12c5d1SDavid du Colombier } 11683e12c5d1SDavid du Colombier tag: 11693e12c5d1SDavid du Colombier ltag 11703e12c5d1SDavid du Colombier { 11713e12c5d1SDavid du Colombier $$ = new(ONAME, Z, Z); 1172219b2ee8SDavid du Colombier $$->sym = $1; 1173219b2ee8SDavid du Colombier $$->type = $1->type; 11743e12c5d1SDavid du Colombier $$->etype = TVOID; 11753e12c5d1SDavid du Colombier if($$->type != T) 11763e12c5d1SDavid du Colombier $$->etype = $$->type->etype; 1177219b2ee8SDavid du Colombier $$->xoffset = $1->offset; 1178219b2ee8SDavid du Colombier $$->class = $1->class; 11793e12c5d1SDavid du Colombier } 11803e12c5d1SDavid du Colombier ltag: 11813e12c5d1SDavid du Colombier LNAME 118280ee5cbfSDavid du Colombier | LTYPE 11833e12c5d1SDavid du Colombier %% 1184