%{#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. Load more
%{ #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;