📄 cc.y
字号:
| expr '&' expr { $$ = new(OAND, $1, $3); }| expr '^' expr { $$ = new(OXOR, $1, $3); }| expr '|' expr { $$ = new(OOR, $1, $3); }| expr LANDAND expr { $$ = new(OANDAND, $1, $3); }| expr LOROR expr { $$ = new(OOROR, $1, $3); }| expr '?' cexpr ':' expr { $$ = new(OCOND, $1, new(OLIST, $3, $5)); }| expr '=' expr { $$ = new(OAS, $1, $3); }| expr LPE expr { $$ = new(OASADD, $1, $3); }| expr LME expr { $$ = new(OASSUB, $1, $3); }| expr LMLE expr { $$ = new(OASMUL, $1, $3); }| expr LDVE expr { $$ = new(OASDIV, $1, $3); }| expr LMDE expr { $$ = new(OASMOD, $1, $3); }| expr LLSHE expr { $$ = new(OASASHL, $1, $3); }| expr LRSHE expr { $$ = new(OASASHR, $1, $3); }| expr LANDE expr { $$ = new(OASAND, $1, $3); }| expr LXORE expr { $$ = new(OASXOR, $1, $3); }| expr LORE expr { $$ = new(OASOR, $1, $3); }xuexpr: uexpr| '(' tlist abdecor ')' xuexpr { $$ = new(OCAST, $5, Z); dodecl(NODECL, CXXX, $2, $3); $$->type = lastdcl; $$->xcast = 1; }| '(' tlist abdecor ')' '{' ilist '}' /* extension */ { $$ = new(OSTRUCT, $6, Z); dodecl(NODECL, CXXX, $2, $3); $$->type = lastdcl; }uexpr: pexpr| '*' xuexpr { $$ = new(OIND, $2, Z); }| '&' xuexpr { $$ = new(OADDR, $2, Z); }| '+' xuexpr { $$ = new(OPOS, $2, Z); }| '-' xuexpr { $$ = new(ONEG, $2, Z); }| '!' xuexpr { $$ = new(ONOT, $2, Z); }| '~' xuexpr { $$ = new(OCOM, $2, Z); }| LPP xuexpr { $$ = new(OPREINC, $2, Z); }| LMM xuexpr { $$ = new(OPREDEC, $2, Z); }| LSIZEOF uexpr { $$ = new(OSIZE, $2, Z); }| LSIGNOF uexpr { $$ = new(OSIGN, $2, Z); }pexpr: '(' cexpr ')' { $$ = $2; }| LSIZEOF '(' tlist abdecor ')' { $$ = new(OSIZE, Z, Z); dodecl(NODECL, CXXX, $3, $4); $$->type = lastdcl; }| LSIGNOF '(' tlist abdecor ')' { $$ = new(OSIGN, Z, Z); dodecl(NODECL, CXXX, $3, $4); $$->type = lastdcl; }| pexpr '(' zelist ')' { $$ = new(OFUNC, $1, Z); if($1->op == ONAME) if($1->type == T) dodecl(xdecl, CXXX, types[TINT], $$); $$->right = invert($3); }| pexpr '[' cexpr ']' { $$ = new(OIND, new(OADD, $1, $3), Z); }| pexpr LMG ltag { $$ = new(ODOT, new(OIND, $1, Z), Z); $$->sym = $3; }| pexpr '.' ltag { $$ = new(ODOT, $1, Z); $$->sym = $3; }| pexpr LPP { $$ = new(OPOSTINC, $1, Z); }| pexpr LMM { $$ = new(OPOSTDEC, $1, Z); }| name| LCONST { $$ = new(OCONST, Z, Z); $$->type = types[TINT]; $$->vconst = $1; $$->cstring = strdup(symb); }| LLCONST { $$ = new(OCONST, Z, Z); $$->type = types[TLONG]; $$->vconst = $1; $$->cstring = strdup(symb); }| LUCONST { $$ = new(OCONST, Z, Z); $$->type = types[TUINT]; $$->vconst = $1; $$->cstring = strdup(symb); }| LULCONST { $$ = new(OCONST, Z, Z); $$->type = types[TULONG]; $$->vconst = $1; $$->cstring = strdup(symb); }| LDCONST { $$ = new(OCONST, Z, Z); $$->type = types[TDOUBLE]; $$->fconst = $1; $$->cstring = strdup(symb); }| LFCONST { $$ = new(OCONST, Z, Z); $$->type = types[TFLOAT]; $$->fconst = $1; $$->cstring = strdup(symb); }| LVLCONST { $$ = new(OCONST, Z, Z); $$->type = types[TVLONG]; $$->vconst = $1; $$->cstring = strdup(symb); }| LUVLCONST { $$ = new(OCONST, Z, Z); $$->type = types[TUVLONG]; $$->vconst = $1; $$->cstring = strdup(symb); }| string| lstringstring: LSTRING { $$ = new(OSTRING, Z, Z); $$->type = typ(TARRAY, types[TCHAR]); $$->type->width = $1.l + 1; $$->cstring = $1.s; $$->sym = symstring; $$->etype = TARRAY; $$->class = CSTATIC; }| string LSTRING { char *s; int n; n = $1->type->width - 1; s = alloc(n+$2.l+MAXALIGN); memcpy(s, $1->cstring, n); memcpy(s+n, $2.s, $2.l); s[n+$2.l] = 0; $$ = $1; $$->type->width += $2.l; $$->cstring = s; }lstring: LLSTRING { $$ = new(OLSTRING, Z, Z); $$->type = typ(TARRAY, types[TUSHORT]); $$->type->width = $1.l + sizeof(ushort); $$->rstring = (ushort*)$1.s; $$->sym = symstring; $$->etype = TARRAY; $$->class = CSTATIC; }| lstring LLSTRING { char *s; int n; n = $1->type->width - sizeof(ushort); s = alloc(n+$2.l+MAXALIGN); memcpy(s, $1->rstring, n); memcpy(s+n, $2.s, $2.l); *(ushort*)(s+n+$2.l) = 0; $$ = $1; $$->type->width += $2.l; $$->rstring = (ushort*)s; }zelist: { $$ = Z; }| elistelist: expr| elist ',' elist { $$ = new(OLIST, $1, $3); }sbody: '{' { $<tyty>$.t1 = strf; $<tyty>$.t2 = strl; strf = T; strl = T; lastbit = 0; firstbit = 1; } edecl '}' { $$ = strf; strf = $<tyty>2.t1; strl = $<tyty>2.t2; }zctlist: { lastclass = CXXX; lasttype = types[TINT]; }| ctlisttypes: complex { $$.t = $1; $$.c = CXXX; }| tname { $$.t = simplet($1); $$.c = CXXX; }| gcnlist { $$.t = simplet($1); $$.c = simplec($1); $$.t = garbt($$.t, $1); }| complex gctnlist { $$.t = $1; $$.c = simplec($2); $$.t = garbt($$.t, $2); if($2 & ~BCLASS & ~BGARB) diag(Z, "duplicate types given: %T and %Q", $1, $2); }| tname gctnlist { $$.t = simplet(typebitor($1, $2)); $$.c = simplec($2); $$.t = garbt($$.t, $2); }| gcnlist complex zgnlist { $$.t = $2; $$.c = simplec($1); $$.t = garbt($$.t, $1|$3); }| gcnlist tname { $$.t = simplet($2); $$.c = simplec($1); $$.t = garbt($$.t, $1); }| gcnlist tname gctnlist { $$.t = simplet(typebitor($2, $3)); $$.c = simplec($1|$3); $$.t = garbt($$.t, $1|$3); }tlist: types { $$ = $1.t; if($1.c != CXXX) diag(Z, "illegal combination of class 4: %s", cnames[$1.c]); }ctlist: types { lasttype = $1.t; lastclass = $1.c; }complex: LSTRUCT ltag { dotag($2, TSTRUCT, 0); $$ = $2->suetag; }| LSTRUCT ltag { dotag($2, TSTRUCT, autobn); } sbody { $$ = $2->suetag; if($$->link != T) diag(Z, "redeclare tag: %s", $2->name); $$->link = $4; suallign($$); }| LSTRUCT sbody { taggen++; sprint(symb, "_%d_", taggen); $$ = dotag(lookup(), TSTRUCT, autobn); $$->link = $2; suallign($$); }| LUNION ltag { dotag($2, TUNION, 0); $$ = $2->suetag; }| LUNION ltag { dotag($2, TUNION, autobn); } sbody { $$ = $2->suetag; if($$->link != T) diag(Z, "redeclare tag: %s", $2->name); $$->link = $4; suallign($$); }| LUNION sbody { taggen++; sprint(symb, "_%d_", taggen); $$ = dotag(lookup(), TUNION, autobn); $$->link = $2; suallign($$); }| LENUM ltag { dotag($2, TENUM, 0); $$ = $2->suetag; if($$->link == T) $$->link = types[TINT]; $$ = $$->link; }| LENUM ltag { dotag($2, TENUM, autobn); } '{' { en.tenum = T; en.cenum = T; } enum '}' { $$ = $2->suetag; if($$->link != T) diag(Z, "redeclare tag: %s", $2->name); if(en.tenum == T) { diag(Z, "enum type ambiguous: %s", $2->name); en.tenum = types[TINT]; } $$->link = en.tenum; $$ = en.tenum; }| LENUM '{' { en.tenum = T; en.cenum = T; } enum '}' { $$ = en.tenum; }| LTYPE { $$ = tcopy($1->type); }gctnlist: gctname| gctnlist gctname { $$ = typebitor($1, $2); }zgnlist: { $$ = 0; }| zgnlist gname { $$ = typebitor($1, $2); }gctname: tname| gname| cnamegcnlist: gcname| gcnlist gcname { $$ = typebitor($1, $2); }gcname: gname| cnameenum: LNAME { doenum($1, Z); }| LNAME '=' expr { doenum($1, $3); }| enum ','| enum ',' enumtname: /* type words */ LCHAR { $$ = BCHAR; }| LSHORT { $$ = BSHORT; }| LINT { $$ = BINT; }| LLONG { $$ = BLONG; }| LSIGNED { $$ = BSIGNED; }| LUNSIGNED { $$ = BUNSIGNED; }| LFLOAT { $$ = BFLOAT; }| LDOUBLE { $$ = BDOUBLE; }| LVOID { $$ = BVOID; }cname: /* class words */ LAUTO { $$ = BAUTO; }| LSTATIC { $$ = BSTATIC; }| LEXTERN { $$ = BEXTERN; }| LTYPEDEF { $$ = BTYPEDEF; }| LTYPESTR { $$ = BTYPESTR; }| LREGISTER { $$ = BREGISTER; }| LINLINE { $$ = 0; }gname: /* garbage words */ LCONSTNT { $$ = BCONSTNT; }| LVOLATILE { $$ = BVOLATILE; }| LRESTRICT { $$ = 0; }name: LNAME { $$ = new(ONAME, Z, Z); if($1->class == CLOCAL) $1 = mkstatic($1); $$->sym = $1; $$->type = $1->type; $$->etype = TVOID; if($$->type != T) $$->etype = $$->type->etype; $$->xoffset = $1->offset; $$->class = $1->class; $1->aused = 1; }tag: ltag { $$ = new(ONAME, Z, Z); $$->sym = $1; $$->type = $1->type; $$->etype = TVOID; if($$->type != T) $$->etype = $$->type->etype; $$->xoffset = $1->offset; $$->class = $1->class; }ltag: LNAME| LTYPE%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -