📄 typesets.c
字号:
break; case LSHT: e1->Val.ulval <<= e2->Val.ulval; break; case RSHT: e1->Val.ulval >>= e2->Val.ulval; break; case AND: e1->Val.ulval = e1->Val.ulval & e2->Val.ulval; break; case BOR: e1->Val.ulval = e1->Val.ulval | e2->Val.ulval; break; case XOR: e1->Val.ulval = e1->Val.ulval ^ e2->Val.ulval; break; default: EiC_set_bastype(t_int, e1->Type); switch (op) { case LT: e1->Val.ival = e1->Val.ulval < e2->Val.ulval; break; case LE: e1->Val.ival = e1->Val.ulval <= e2->Val.ulval; break; case EQ: e1->Val.ival = e1->Val.ulval == e2->Val.ulval; break; case NE: e1->Val.ival = e1->Val.ulval != e2->Val.ulval; break; case GT: e1->Val.ival = e1->Val.ulval > e2->Val.ulval; break; case GE: e1->Val.ival = e1->Val.ulval >= e2->Val.ulval; break; } break; } break; case t_pointer: switch (op) { case LT: e1->Val.ival = e1->Val.p.p < e2->Val.p.p; break; case LE: e1->Val.ival = e1->Val.p.p <= e2->Val.p.p; break; case EQ: e1->Val.ival = e1->Val.p.p == e2->Val.p.p; break; case NE: e1->Val.ival = e1->Val.p.p != e2->Val.p.p; break; case GT: e1->Val.ival = e1->Val.p.p > e2->Val.p.p; break; case GE: e1->Val.ival = e1->Val.p.p >= e2->Val.p.p; break; default: EiC_error("Illegal constant pointer operation"); } e1->Type = EiC_addtype(t_int, EiC_freetype(e1->Type)); setConst(e1->Type); break; default: EiC_error("Illegal constants"); } return 1;}void * EiC_getaddress(token_t * e1){ void *p = NULL; int t = EiC_gettype(e1->Type); switch (t) { case t_builtin: if (e1->Sym->val.vfunc != 0) p = (void*)e1->Sym->val.vfunc; else EiC_error("No link to builtin function"); e1->Type = EiC_addtype(t_pointer, e1->Type); break; case t_funcdec: case t_func: p = e1->Sym; e1->Type = EiC_addtype(t_pointer, e1->Type); break; case t_union: case t_struct: EiC_error("Illegal use of structure or uion: need an lvalue"); case t_array: if (t == t_array) EiC_exchtype(t_pointer, e1->Type); case t_pointer: if(e1->Sym && EiC_gettype(e1->Sym->type) == t_ref) p = EiC_ENV->AR[e1->Sym->val.ival].v.p.p; else p = &EiC_ENV->AR[e1->Sym->val.ival].v; break; default: /* watch out 4 reference variables */ if(e1->Sym && EiC_gettype(e1->Sym->type) == t_ref) { e1->Type = EiC_succType(e1->Type); if(EiC_gettype(e1->Type) != t_pointer) EiC_error("Illegal use of reference variable: %s", e1->Sym->id); p = *(void**)EiC_ENV->AR[e1->Sym->val.ival].v.p.p; } else EiC_error("Unknown type: need an lvalue"); } return p;}void derefConst(token_t * e1){ /* assumes incoming type is a ptr or array */ e1->Type = EiC_succType(e1->Type); switch(EiC_gettype(e1->Type)) { case t_char: case t_uchar: case t_short: case t_ushort: case t_int: case t_uint: case t_long: case t_ulong: case t_llong: case t_float: case t_double: case t_pointer: case t_union: case t_struct: EiC_generate(&e1->Code,pushptr,&e1->Val, 0); e1->Type = EiC_addtype(t_lval,e1->Type); break; case t_void: return; case t_array: EiC_exchtype(t_pointer,e1->Type); setConst(e1->Type); break; default: EiC_error("Unknown const in derefConst"); }}#if 0void EiC_addRval(code_t * code, int type, val_t *v, int st){ /* optomise away rvals */ int i; if((i=nextinst(code))) if(IsSto_op(opcode(code,i-1)) && ivalcode(code,i) == ivalcode(code,i-1)) return; EiC_generate(code,type,v,st);}#endifvoid EiC_output(token_t * e1){ static val_t v; if (e1->Pflag == 0) { int t = EiC_gettype(e1->Type); if(isconst(e1->Type)) { switch (t) { CASE_INT: EiC_generate(&e1->Code, pushint, &e1->Val, 0); break; CASE_UINT: EiC_generate(&e1->Code, pushuint, &e1->Val, 0); break; CASE_LONG: EiC_generate(&e1->Code, pushlong, &e1->Val, 0); break; CASE_ULONG: EiC_generate(&e1->Code, pushulong, &e1->Val, 0); break; case t_llong: EiC_generate(&e1->Code, pushllong, &e1->Val, 0); break; CASE_FLOAT:EiC_generate(&e1->Code, pushdouble, &e1->Val, 0); break; case t_union: case t_struct: case t_array: if (t == t_array) EiC_exchtype(t_pointer, e1->Type); case t_pointer: EiC_generate(&e1->Code, pushptr, &e1->Val, 0); break; case t_void: return; default: EiC_error("Unknown const type through output"); } e1->Pflag =1; unsetConst(e1->Type); return; } switch (t) { case t_char: EiC_generate(&e1->Code, rvalchar, &e1->Val, EiC_GI(e1)); EiC_exchtype(t_int,e1->Type); break; case t_uchar: EiC_generate(&e1->Code, rvaluchar, &e1->Val, EiC_GI(e1)); EiC_exchtype(t_int,e1->Type); break; case t_short: EiC_generate(&e1->Code, rvalshort, &e1->Val, EiC_GI(e1)); EiC_exchtype(t_int,e1->Type); break; case t_ushort: EiC_generate(&e1->Code, rvalushort, &e1->Val, EiC_GI(e1)); EiC_exchtype(t_int,e1->Type); break; case t_int: case t_uint: /*EiC_addRval(&e1->Code, rvalint, &e1->Val, EiC_GI(e1));*/ EiC_generate(&e1->Code, rvalint, &e1->Val, EiC_GI(e1)); break; CASE_LONG: CASE_ULONG:EiC_generate(&e1->Code, rvallong, &e1->Val, EiC_GI(e1)); break; case t_llong: EiC_generate(&e1->Code, rvalllong, &e1->Val, EiC_GI(e1)); break; case t_float: EiC_generate(&e1->Code, rvalfloat, &e1->Val,EiC_GI(e1)); EiC_exchtype(t_double,e1->Type); break; case t_double: EiC_generate(&e1->Code, rvaldouble, &e1->Val,EiC_GI(e1)); break; case t_builtin: if (e1->Sym->val.vfunc != 0) { v.vfunc = e1->Sym->val.vfunc; EiC_generate(&e1->Code, pushptr, &v, 0); e1->Type = EiC_addtype(t_pointer, e1->Type); } else EiC_error("No link to builtin function"); break; case t_funcdec: EiC_exchtype(t_func, e1->Type); case t_func: v.p.p = e1->Sym; EiC_generate(&e1->Code, pushptr, &v, 0); e1->Type = EiC_addtype(t_pointer, e1->Type); break; case t_union: case t_struct: case t_array: if (t == t_array) EiC_exchtype(t_pointer, e1->Type); case t_pointer: if(issafe(e1->Type)) EiC_generate(&e1->Code, rvalptr, &e1->Val, EiC_GI(e1)); else EiC_generate(&e1->Code, rvaluptr, &e1->Val, EiC_GI(e1)); break; case t_ref: EiC_generate(&e1->Code, rvaluptr, &e1->Val, EiC_GI(e1)); return; case t_lval: e1->Type = EiC_succType(e1->Type); switch (EiC_gettype(e1->Type)) { case t_uchar: EiC_generate(&e1->Code, drefuchar, &e1->Val, 0); break; case t_char: EiC_generate(&e1->Code, drefchar, &e1->Val, 0); break; case t_short: EiC_generate(&e1->Code, drefshort, &e1->Val, 0); break; case t_ushort: EiC_generate(&e1->Code, drefushort, &e1->Val, 0); break; case t_int: EiC_generate(&e1->Code, drefint, &e1->Val, 0); break; case t_uint: EiC_generate(&e1->Code, drefuint, &e1->Val, 0); break; CASE_LONG:EiC_generate(&e1->Code, dreflong, &e1->Val, 0); break; CASE_ULONG:EiC_generate(&e1->Code, drefulong, &e1->Val, 0); break; case t_llong:EiC_generate(&e1->Code, drefllong, &e1->Val, 0); break; case t_float: EiC_generate(&e1->Code, dreffloat, &e1->Val, 0); break; case t_double: EiC_generate(&e1->Code, drefdouble, &e1->Val, 0); break; case t_array: case t_struct: case t_union: break; case t_pointer: if(issafe(e1->Type)) EiC_generate(&e1->Code, drefptr, &e1->Val, EiC_GI(e1)); else EiC_generate(&e1->Code, drefuptr, &e1->Val, EiC_GI(e1)); break; case t_funcdec: case t_func: e1->Type = EiC_succType(e1->Type); if(EiC_gettype(nextType(e1->Type)) == t_void) EiC_generate(&e1->Code, eiccall, &e1->Val, 0); else EiC_generate(&e1->Code, eiccall, &e1->Val, 1); break; case t_builtin: if(EiC_gettype(nextType(e1->Type)) == t_void) EiC_generate(&e1->Code, call, &e1->Val, 0); else EiC_generate(&e1->Code, call, &e1->Val, 1); e1->Type = EiC_succType(e1->Type); break; default: EiC_error("Illegal lvalue"); break; } break; case t_void: return; case ID: EiC_error("Undeclared identifier %s",e1->Sym->id); break; default: EiC_error("Unknown type through output"); return; } e1->Pflag = 1; }}void EiC_do_inc_dec(token_t * e1, int op){ val_t v; int t; switch (EiC_gettype(e1->Type)) { CASE_INT: t = EiC_gettype(e1->Type); EiC_output(e1); v.ival = 1; if (op == INC) op = incint; else op = decint; EiC_exchtype(t,e1->Type); break; CASE_UINT: t = EiC_gettype(e1->Type); EiC_output(e1); v.ival = 1; if (op == INC) op = incuint; else op = decuint; EiC_exchtype(t,e1->Type); break; CASE_LONG: EiC_output(e1); v.ival = 1; if (op == INC) op = inclong; else op = declong; break; CASE_ULONG: EiC_output(e1); v.ival = 1; if (op == INC) op = inculong; else op = deculong; break; case t_llong: EiC_output(e1); v.ival = 1; if (op == INC) op = incllong; else op = decllong; break; case t_pointer: EiC_output(e1); v.ival = EiC_get_sizeof(nextType(e1->Type)); if (op == INC) op = incptr; else op = decptr; break; case t_lval: v.ival = 1; EiC_generate(&e1->Code, dupval, &v, 0); EiC_output(e1); EiC_do_inc_dec(e1, op); v.ival = 1; /*EiC_generate(&e1->Code, bump, &v, 0);*/ e1->Type = EiC_addtype(t_lval, e1->Type); return; case t_float: case t_double: t = EiC_gettype(e1->Type); EiC_output(e1); v.ival = 1; if (op == INC) op = incdouble; else op = decdouble; EiC_exchtype(t,e1->Type); break; default: EiC_error("Cannot apply inc\\dec"); return; } EiC_generate(&e1->Code, op, &v, 0);}void EiC_do_stooutput(token_t * e1){ if (e1->Pflag == 0) { switch (EiC_gettype(e1->Type)) { case t_char: case t_uchar: EiC_generate(&e1->Code, stochar, &e1->Val, EiC_GI(e1)); break; case t_short: case t_ushort: EiC_generate(&e1->Code, stoshort, &e1->Val, EiC_GI(e1)); break; case t_int: case t_uint: EiC_generate(&e1->Code, stoint, &e1->Val, EiC_GI(e1)); break; CASE_LONG: CASE_ULONG:EiC_generate(&e1->Code, stolong, &e1->Val, EiC_GI(e1)); break; case t_llong:EiC_generate(&e1->Code, stollong, &e1->Val, EiC_GI(e1)); break; case t_float: EiC_generate(&e1->Code, stofloat, &e1->Val, EiC_GI(e1)); break; case t_double: EiC_generate(&e1->Code, stodouble, &e1->Val, EiC_GI(e1)); break; case t_pointer: if(issafe(e1->Type)) EiC_generate(&e1->Code, stoptr, &e1->Val, EiC_GI(e1)); else EiC_generate(&e1->Code, stouptr, &e1->Val, EiC_GI(e1)); break; case t_struct: case t_union:{ val_t v; v.ival = EiC_get_sizeof(e1->Type); EiC_output(e1); EiC_generate(&e1->Code, refmem, &v, 0); } break; case t_lval: e1->Type = EiC_succType(e1->Type); if(isconst(e1->Type) || isconstp(e1->Type)) EiC_error("Illegal assignment operation"); switch (EiC_gettype(e1->Type)) { case t_uchar: case t_char: EiC_generate(&e1->Code, refchar, &e1->Val, 0); break; case t_short: case t_ushort: EiC_generate(&e1->Code, refshort, &e1->Val, 0); break; case t_int: case t_uint: EiC_generate(&e1->Code, refint, &e1->Val, 0); break; CASE_LONG:EiC_generate(&e1->Code, reflong, &e1->Val, 0); break; CASE_ULONG:EiC_generate(&e1->Code, refulong, &e1->Val, 0); break; case t_llong: EiC_generate(&e1->Code, refllong, &e1->Val, 0); break; case t_float: EiC_generate(&e1->Code, reffloat, &e1->Val, 0); break; case t_double: EiC_generate(&e1->Code, refdouble, &e1->Val, 0); break; case t_pointer: if(issafe(e1->Type)) EiC_generate(&e1->Code, refptr, &e1->Val, EiC_GI(e1)); else EiC_generate(&e1->Code, refuptr, &e1->Val, EiC_GI(e1)); break; case t_struct: case t_union:{ val_t v; v.ival = EiC_get_sizeof(e1->Type); EiC_generate(&e1->Code, refmem, &v, 0); } break; default: EiC_error("Illegal lvalue"); break; } break; default: EiC_error(" Invalid assignment"); break; } e1->Pflag = 1; }}void binhconst(unsigned opr, token_t * e1, token_t * e2){ void (*f) (unsigned, token_t *, token_t *); int t; if(!e1->Pflag && isconst(e1->Type) && isconst(e2->Type)) { if(e2->Pflag) EiC_output(e1); else { do_binaryop(e1, e2, opr); return; } } /* * Now perform usual arithmetic conversion * i.e promote to larger type. */ if(EiC_gettype(e1->Type) < EiC_gettype(e2->Type)) t = EiC_gettype(e2->Type); else t = EiC_gettype(e1->Type); switch (t) { CASE_INT: f = binhint; break; CASE_UINT: f = binhuint; break; CASE_LONG: f = binhlong; break; CASE_ULONG: f = binhulong; break; CASE_FLOAT: f = binhdouble; break; case t_llong: f = binhllong; break; case t_array: case t_pointer: f = EiC_binhlval; break; default: EiC_error("Unknown type in binhconst"); return; } (*f) (opr, e1, e2);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -