Charles.Forsyth20060303644188019 years agoHistory
1239 lines · 17.0 KB · Text
RawDownload
%{#include "cc.h"%}%union	{	Node*	node;	Sym*	sym;	Type*	type;	struct	{		Type*	t;		char	c;	} tycl;	struct	{		Type*	t1;		Type*	t2;	} tyty;	struct	{		char*	s;		long	l;	} sval;	long	lval;	double	dval;	vlong	vval;}%type	<sym>	ltag%type	<lval>	gctname cname gname tname%type	<lval>	gctnlist zgnlist tnlist%type	<type>	tlist etlist sbody complex%type	<tycl>	types etypes%type	<node>	zarglist arglist zcexpr%type	<node>	name block stmnt cexpr expr xuexpr pexpr%type	<node>	zelist elist adecl slist uexpr string lstring sstring slstring%type	<node>	xdecor xdecor2 labels label ulstmnt%type	<node>	adlist edecor tag qual qlist%type	<node>	abdecor abdecor1 abdecor2 abdecor3%type	<node>	zexpr lexpr init ilist %left	';'%left	','%right	'=' LPE LME LMLE LDVE LMDE LRSHE LLSHE LANDE LXORE LORE%right	'?' ':'%left	LOROR%left	LANDAND%left	'|'%left	'^'%left	'&'%left	LEQ LNE%left	'<' '>' LLE LGE%left	LLSH LRSH%left	'+' '-'%left	'*' '/' '%'%right	LMM LPP LMG '.' '[' '(' %token	<sym>	LNAME LCTYPE LSTYPE%token	<dval>	LFCONST LDCONST%token	<vval>	LCHARACTER LCONST LLCONST LUCONST LULCONST LVLCONST LUVLCONST%token	<sval>	LSTRING LLSTRING%token		LAUTO LBREAK LCASE LCHAR LCONTINUE LDEFAULT LDO%token		LDOUBLE LELSE LEXTERN LFLOAT LFOR LGOTO%token	LIF LINT LLONG LREGISTER LRETURN LSHORT LSIZEOF LUSED%token	LSTATIC LSTRUCT LSWITCH LTYPEDEF LUNION LUNSIGNED LWHILE%token	LVOID LENUM LSIGNED LCONSTNT LVOLATILE LSET LSIGNOF LVLONG%%prog:|	prog xdecl /* * external declarator */xdecl:	zctlist ';'	{		dodecl(xdecl, lastclass, lasttype, Z, 1);	}|	zctlist xdlist ';'|	zctlist xdecor	{		lastdcl = T;		dodecl(xdecl, lastclass, lasttype, $2, 0);		if(lastdcl == T || lastdcl->etype != TFUNC) {			diag($2, "not a function");			lastdcl = types[TFUNC];		}		thisfn = lastdcl;		markdcl();		firstdcl = dclstack;		argmark($2, 0);	}	pdecl	{		argmark($2, 1);	}	block	{		$6->blk = 0;		codgen($6, $2, lineno);		revertdcl();	} xdlist:	xdecor	{		dodecl(xdecl, lastclass, lasttype, $1, 1);	}|	xdecor	{		$1 = dodecl(xdecl, lastclass, lasttype, $1, 0);	}	'=' init	{		$4 = doinit($1->sym, $1->type, 0L, $4);		$4 = new(ODAS, $1, $4);		$4->type = $1->type;		$4->lineno = $1->lineno;		vtgen($4);	}|	xdlist ',' xdlist xdecor:	xdecor2|	'*' zgnlist xdecor	{		$$ = new(OIND, $3, Z);		$$->garb = simpleg($2);	} xdecor2:	tag|	'(' xdecor ')'	{		$$ = $2;	}|	xdecor2 '(' zarglist ')'	{		$$ = new(OFUNC, $1, $3);		/* outfun($$); */	}|	xdecor2 '[' zexpr ']'	{		$$ = new(OARRAY, $1, $3);	} /* * automatic declarator */adecl:	{		$$ = Z;	}|	adecl ctlist ';'	{		$$ = dodecl(adecl, lastclass, lasttype, Z, 1);		if($1 != Z)			if($$ != Z)				$$ = new(OLIST, $1, $$);			else				$$ = $1;	}|	adecl ctlist adlist ';'	{		$$ = $1;		if($3 != Z) {			$$ = $3;			if($1 != Z)				$$ = new(OLIST, $1, $3);		}	} adlist:	xdecor	{		$$ = dodecl(adecl, lastclass, lasttype, $1, 1);		if($$->sym->class == CSTATIC)			$$ = Z;	}|	xdecor	{		$1 = dodecl(adecl, lastclass, lasttype, $1, 0);	}	'=' init	{		/* long w; */ 		/* w = $1->sym->type->width; */		$$ = doinit($1->sym, $1->type, 0L, $4);		/* $$ = contig($1->sym, $$, w); */		$$ = new(ODAS, $1, $$);		$$->type = $1->type;		$$->lineno = $1->lineno;		vtgen($$);		if($1->sym->class == CSTATIC)			$$ = Z;	}|	adlist ',' adlist	{		$$ = $1;		if($3 != Z) {			$$ = $3;			if($1 != Z)				$$ = new(OLIST, $1, $3);		}	} /* * parameter declarator */pdecl:|	pdecl ctlist pdlist ';' pdlist:	xdecor	{		dodecl(pdecl, lastclass, lasttype, $1, 1);	}|	pdlist ',' pdlist /* * structure element declarator */edecl:	etlist	{		lasttype = $1;	}	zedlist ';'|	edecl etlist	{		lasttype = $2;	}	zedlist ';' zedlist:					/* extension */	{		lastfield = 0;		edecl(CXXX, lasttype, S);	}|	edlist edlist:	edecor	{		dodecl(edecl, CXXX, lasttype, $1, 1);	}|	edlist ',' edlist edecor:	xdecor	{		lastbit = 0;		firstbit = 1;	}|	tag ':' lexpr	{		$$ = new(OBIT, $1, $3);	}|	':' lexpr	{		$$ = new(OBIT, Z, $2);	} /* * abstract declarator */abdecor:	{		$$ = (Z);	}|	abdecor1 abdecor1:	'*' zgnlist	{		$$ = new(OIND, (Z), Z);		$$->garb = simpleg($2);	}|	'*' zgnlist abdecor1	{		$$ = new(OIND, $3, Z);		$$->garb = simpleg($2);	}|	abdecor2 abdecor2:	abdecor3|	abdecor2 '(' zarglist ')'	{		$$ = new(OFUNC, $1, $3);	}|	abdecor2 '[' zexpr ']'	{		$$ = new(OARRAY, $1, $3);	} abdecor3:	'(' ')'	{		$$ = new(OFUNC, (Z), Z);	}|	'[' zexpr ']'	{		$$ = new(OARRAY, (Z), $2);	}|	'(' abdecor1 ')'	{		$$ = $2;	} init:	expr|	'{' ilist '}'	{		$$ = new(OINIT, invert($2), Z);	} qual:	'[' lexpr ']'	{		$$ = new(OARRAY, $2, Z);	}|	'.' ltag	{		$$ = new(OELEM, Z, Z);		$$->sym = $2;	}|	qual '=' qlist:	init ','|	qlist init ','	{		$$ = new(OLIST, $1, $2);	}|	qual|	qlist qual	{		$$ = new(OLIST, $1, $2);	} ilist:	qlist|	init|	qlist init	{		$$ = new(OLIST, $1, $2);	} zarglist:	{		$$ = Z;	}|	arglist	{		$$ = invert($1);	}  arglist:	name|	tlist abdecor	{		$$ = new(OPROTO, $2, Z);		$$->type = $1;	}|	tlist xdecor	{		$$ = new(OPROTO, $2, Z);		$$->type = $1;	}|	'.' '.' '.'	{		$$ = new(ODOTDOT, Z, Z);	}|	arglist ',' arglist	{		$$ = new(OLIST, $1, $3);	} block:	'{' adecl slist '}'	{		$$ = invert($3);		if($2 != Z)			$$ = new(OLIST, $2, $$);		if($$ == Z)			$$ = new(ONUL, Z, Z);		$$->blk = 1;	} slist:	{		$$ = Z;	}|	slist stmnt	{		if($1 == Z)			$$ = $2;		else			$$ = new(OLIST, $1, $2);	} labels:	label|	labels label	{		$$ = new(OLIST, $1, $2);	} label:	LCASE expr ':'	{		$$ = new(OCASE, $2, Z);		$$->lineno = $2->lineno;	}|	LDEFAULT ':'	{		$$ = new(OCASE, Z, Z);	}|	LNAME ':'	{		$$ = new(OLABEL, dcllabel($1, 1), Z);		$1->lineno = lineno;	} stmnt:	error ';'	{		$$ = Z;	}|	ulstmnt|	labels ulstmnt	{		$$ = new(OLIST, $1, $2);	} ulstmnt:	zcexpr ';'	{		if($$ == Z)			$$ = new(ONUL, Z, Z);		$$->kind = KEXP;	}|	{		markdcl();	}	block	{		revertdcl();		$$ = $2;	}|	LIF '(' cexpr ')' stmnt	{		$$ = new(OIF, $3, new(OLIST, $5, Z));		$$->lineno = $3->lineno;		$5->blk = 0;	}|	LIF '(' cexpr ')' stmnt LELSE stmnt	{		$$ = new(OIF, $3, new(OLIST, $5, $7));		$$->lineno = $3->lineno;		$5->blk = $7->blk = 0;	}|	LFOR '(' zcexpr ';' zcexpr ';' zcexpr ')' stmnt	{		$$ = new(OFOR, new(OLIST, $5, new(OLIST, $3, $7)), $9);		if($3 != Z)			$$->lineno = $3->lineno;		else if($5 != Z)			$$->lineno = $5->lineno;		else if($7 != Z)			$$->lineno = $7->lineno;		else			$$->lineno = line($9);		$9->blk = 0;	}|	LWHILE '(' cexpr ')' stmnt	{		$$ = new(OWHILE, $3, $5);		$$->lineno = $3->lineno;		$5->blk = 0;	}|	LDO stmnt LWHILE '(' cexpr ')' ';'	{		$$ = new(ODWHILE, $5, $2);		$$->lineno = line($2);		$2->blk = 0;	}|	LRETURN zcexpr ';'	{		$$ = new(ORETURN, $2, Z);		$$->type = thisfn->link;		if($2 != Z)			$$->lineno = $2->lineno;	}|	LSWITCH '(' cexpr ')' stmnt	{		$$ = new(OSWITCH, $3, $5);		$$->lineno = $3->lineno;		$5->blk = 0;

Lines 1–500 of 1239.