xref: /plan9/sys/src/cmd/cc/cc.y (revision 82726826a7b3d40fb66339b4b0e95b60314f98b9)
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