⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 typesets.c

📁 guide and some example with visualC++
💻 C
📖 第 1 页 / 共 4 页
字号:
	    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 + -