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

📄 typesets.c

📁 guide and some example with visualC++
💻 C
📖 第 1 页 / 共 4 页
字号:
	return;    }    EiC_exchtype(t_int,e1->Type);    u1.ival = n;    EiC_generate(&e1->Code, inst, &u1, 0);}static void checkint(unsigned obj, token_t * e1, token_t * e2){    if (EiC_gettype(e1->Type) != obj) {	if(!isconst(e1->Type))	    EiC_exchtype(obj, e1->Type);	else	    EiC_castconst(e1,e2,0);    }    if (EiC_gettype(e2->Type) != obj) {	if(!isconst(e1->Type))	    EiC_exchtype(obj, e2->Type);	else	    EiC_castconst(e2, e1, 0);    }    if (!e2->Pflag)	EiC_output(e2);}void binhint(unsigned oper, token_t * e1, token_t * e2){    checkint(t_int, e1, e2);    switch (oper) {      case '+':	EiC_generate(&e2->Code, addint, &e2->Val, 0);	break;      case '-':	EiC_generate(&e2->Code, subint, &e2->Val, 0);	break;      case '*':	EiC_generate(&e2->Code, multint, &e2->Val, 0);	break;      case '/':	EiC_generate(&e2->Code, divint, &e2->Val, 0);	break;      case '%':	EiC_generate(&e2->Code, modint, &e2->Val, 0);	break;      case LSHT:	EiC_generate(&e2->Code, lshtint, &e2->Val, 0);	break;      case RSHT:	EiC_generate(&e2->Code, rshtint, &e2->Val, 0);	break;      case LT:	EiC_generate(&e2->Code, ltint, &e2->Val, 0);	break;      case LE:	EiC_generate(&e2->Code, leint, &e2->Val, 0);	break;      case EQ:	EiC_generate(&e2->Code, eqint, &e2->Val, 0);	break;      case NE:	EiC_generate(&e2->Code, neint, &e2->Val, 0);	break;      case GT:	EiC_generate(&e2->Code, gtint, &e2->Val, 0);	break;      case GE:	EiC_generate(&e2->Code, geint, &e2->Val, 0);	break;      case BOR:	EiC_generate(&e2->Code, borint, &e2->Val, 0);	break;      case XOR:	EiC_generate(&e2->Code, xorint, &e2->Val, 0);	break;      case AND:	EiC_generate(&e2->Code, andint, &e2->Val, 0);	break;    }}void binhuint(unsigned oper, token_t * e1, token_t * e2){    checkint(t_uint, e1, e2);    switch (oper) {      case '+':	EiC_generate(&e2->Code, adduint, &e2->Val, 0);	break;      case '-':	EiC_generate(&e2->Code, subuint, &e2->Val, 0);	break;      case '*':	EiC_generate(&e2->Code, multuint, &e2->Val, 0);	break;      case '/':	EiC_generate(&e2->Code, divuint, &e2->Val, 0);	break;      case '%':	EiC_generate(&e2->Code, moduint, &e2->Val, 0);	break;      case LSHT:	EiC_generate(&e2->Code, lshtuint, &e2->Val, 0);	break;      case RSHT:	EiC_generate(&e2->Code, rshtuint, &e2->Val, 0);	break;      case BOR:	EiC_generate(&e2->Code, boruint, &e2->Val, 0);	break;      case XOR:	EiC_generate(&e2->Code, xoruint, &e2->Val, 0);	break;      case AND:	EiC_generate(&e2->Code, anduint, &e2->Val, 0);	break;      default:	EiC_output(e1);	EiC_exchtype(t_int, e1->Type);	/* should really be boolean */	switch (oper) {	  case LT:	    EiC_generate(&e2->Code, ltuint, &e2->Val, 0);	    break;	  case LE:	    EiC_generate(&e2->Code, leuint, &e2->Val, 0);	    break;	  case EQ:	    EiC_generate(&e2->Code, equint, &e2->Val, 0);	    break;	  case NE:	    EiC_generate(&e2->Code, neuint, &e2->Val, 0);	    break;	  case GT:	    EiC_generate(&e2->Code, gtuint, &e2->Val, 0);	    break;	  case GE:	    EiC_generate(&e2->Code, geuint, &e2->Val, 0);	    break;	}    }}static void checklong(unsigned obj, token_t * e1, token_t * e2){    int t;    if ((t=EiC_gettype(e1->Type)) != obj) {	if (!isconst(e1->Type)) {	    if (!e1->Pflag)		EiC_output(e1);	    if(sizeof(int) != sizeof(long))		switch (t) {		CASE_INT:EiC_generate(&e1->Code, int2long, &e1->Val, 0);		break;		CASE_UINT:EiC_generate(&e1->Code, uint2long, &e1->Val, 0);		break;		}	    EiC_exchtype(obj, e1->Type);	} else 	    EiC_castconst(e1, e2, 0);    }    if ((t=EiC_gettype(e2->Type)) != obj) {	if (!isconst(e2->Type)) {	    if (!e2->Pflag)		EiC_output(e2);	    if(sizeof(int) != sizeof(long))		switch (t) {		CASE_INT:EiC_generate(&e2->Code, int2long, &e1->Val, 0);		break;		CASE_UINT:EiC_generate(&e2->Code, uint2long, &e1->Val, 0);		break;		}	    EiC_exchtype(obj, e2->Type);	} else 	    EiC_castconst(e2, e1, 0);    }    if (!e2->Pflag)	EiC_output(e2);}void binhlong(unsigned oper, token_t * e1, token_t * e2){    checklong(t_long, e1, e2);        switch (oper) {      case '+':	EiC_generate(&e2->Code, addlong, &e2->Val, 0);	break;      case '-':	EiC_generate(&e2->Code, sublong, &e2->Val, 0);	break;      case '*':	EiC_generate(&e2->Code, multlong, &e2->Val, 0);	break;      case '/':	EiC_generate(&e2->Code, divlong, &e2->Val, 0);	break;      case '%':	EiC_generate(&e2->Code, modlong, &e2->Val, 0);	break;      case LSHT:	EiC_generate(&e2->Code, lshtlong, &e2->Val, 0);	break;      case RSHT:	EiC_generate(&e2->Code, rshtlong, &e2->Val, 0);	break;      case BOR:	EiC_generate(&e2->Code, borlong, &e2->Val, 0);	break;      case XOR:	EiC_generate(&e2->Code, xorlong, &e2->Val, 0);	break;      case AND:	EiC_generate(&e2->Code, andlong, &e2->Val, 0);	break;      default:	EiC_output(e1);	EiC_exchtype(t_int, e1->Type);	/* should really be boolean */	switch (oper) {	  case LT:	    EiC_generate(&e2->Code, ltlong, &e2->Val, 0);	    break;	  case LE:	    EiC_generate(&e2->Code, lelong, &e2->Val, 0);	    break;	  case EQ:	    EiC_generate(&e2->Code, eqlong, &e2->Val, 0);	    break;	  case NE:	    EiC_generate(&e2->Code, nelong, &e2->Val, 0);	    break;	  case GT:	    EiC_generate(&e2->Code, gtlong, &e2->Val, 0);	    break;	  case GE:	    EiC_generate(&e2->Code, gelong, &e2->Val, 0);	    break;	}	break;    }}void binhulong(unsigned oper, token_t * e1, token_t * e2){    checklong(t_ulong, e1, e2);    switch (oper) {      case '+':	EiC_generate(&e2->Code, addulong, &e2->Val, 0);	break;      case '-':	EiC_generate(&e2->Code, subulong, &e2->Val, 0);	break;      case '*':	EiC_generate(&e2->Code, multulong, &e2->Val, 0);	break;      case '/':	EiC_generate(&e2->Code, divulong, &e2->Val, 0);	break;      case '%':	EiC_generate(&e2->Code, modulong, &e2->Val, 0);	break;      case LSHT:	EiC_generate(&e2->Code, lshtulong, &e2->Val, 0);	break;      case RSHT:	EiC_generate(&e2->Code, rshtulong, &e2->Val, 0);	break;      case BOR:	EiC_generate(&e2->Code, borulong, &e2->Val, 0);	break;      case XOR:	EiC_generate(&e2->Code, xorulong, &e2->Val, 0);	break;      case AND:	EiC_generate(&e2->Code, andulong, &e2->Val, 0);	break;      default:	EiC_output(e1);	EiC_exchtype(t_int, e1->Type);	/* should really be boolean */	switch (oper) {	  case LT:	    EiC_generate(&e2->Code, ltulong, &e2->Val, 0);	    break;	  case LE:	    EiC_generate(&e2->Code, leulong, &e2->Val, 0);	    break;	  case EQ:	    EiC_generate(&e2->Code, equlong, &e2->Val, 0);	    break;	  case NE:	    EiC_generate(&e2->Code, neulong, &e2->Val, 0);	    break;	  case GT:	    EiC_generate(&e2->Code, gtulong, &e2->Val, 0);	    break;	  case GE:	    EiC_generate(&e2->Code, geulong, &e2->Val, 0);	    break;	}	break;    }}static void checkllong(unsigned obj, token_t * e1, token_t * e2){  int t;  if ((t=EiC_gettype(e1->Type)) != obj) {    if (!isconst(e1->Type)) {      if (!e1->Pflag)	EiC_output(e1);      if(t <= t_uint && sizeof(int) != sizeof(eic_llong)) {	switch (t) {	CASE_INT:EiC_generate(&e1->Code, int2llong, &e1->Val, 0);	break;	CASE_UINT:EiC_generate(&e1->Code, uint2llong, &e1->Val, 0);	}      } else if(sizeof(long) != sizeof(eic_llong)) {	switch (t) {	case t_long:EiC_generate(&e1->Code, long2llong, &e1->Val, 0);	  break;	case t_ulong:EiC_generate(&e1->Code, ulong2llong, &e1->Val, 0);	}      }      EiC_exchtype(obj, e1->Type);    } else       EiC_castconst(e1, e2, 0);  }  if ((t=EiC_gettype(e2->Type)) != obj) {    if (!isconst(e2->Type)) {      if (!e2->Pflag)	EiC_output(e2);      if(t <= t_uint && sizeof(int) != sizeof(eic_llong)) {	switch (t) {	CASE_INT:EiC_generate(&e2->Code, int2llong, &e1->Val, 0);	break;	CASE_UINT:EiC_generate(&e2->Code, uint2llong, &e1->Val, 0);	}      } else if(sizeof(long) != sizeof(eic_llong)) {	switch (t) {	case t_long:EiC_generate(&e2->Code, long2llong, &e1->Val, 0);	  break;	case t_ulong:EiC_generate(&e2->Code, ulong2llong, &e1->Val, 0);	}      }      EiC_exchtype(obj, e2->Type);    } else       EiC_castconst(e2, e1, 0);  }  if (!e2->Pflag)    EiC_output(e2);}void binhllong(unsigned oper, token_t * e1, token_t * e2){    checkllong(t_llong, e1, e2);        switch (oper) {      case '+':	EiC_generate(&e2->Code, addllong, &e2->Val, 0);	break;      case '-':	EiC_generate(&e2->Code, subllong, &e2->Val, 0);	break;      case '*':	EiC_generate(&e2->Code, multllong, &e2->Val, 0);	break;      case '/':	EiC_generate(&e2->Code, divllong, &e2->Val, 0);	break;      case '%':	EiC_generate(&e2->Code, modllong, &e2->Val, 0);	break;      case LSHT:	EiC_generate(&e2->Code, lshtllong, &e2->Val, 0);	break;      case RSHT:	EiC_generate(&e2->Code, rshtllong, &e2->Val, 0);	break;      case BOR:	EiC_generate(&e2->Code, borllong, &e2->Val, 0);	break;      case XOR:	EiC_generate(&e2->Code, xorllong, &e2->Val, 0);	break;      case AND:	EiC_generate(&e2->Code, andllong, &e2->Val, 0);	break;      default:	EiC_output(e1);	EiC_exchtype(t_int, e1->Type);	/* should really be boolean */	switch (oper) {	  case LT:	    EiC_generate(&e2->Code, ltllong, &e2->Val, 0);	    break;	  case LE:	    EiC_generate(&e2->Code, lellong, &e2->Val, 0);	    break;	  case EQ:	    EiC_generate(&e2->Code, eqllong, &e2->Val, 0);	    break;	  case NE:	    EiC_generate(&e2->Code, nellong, &e2->Val, 0);	    break;	  case GT:	    EiC_generate(&e2->Code, gtllong, &e2->Val, 0);	    break;	  case GE:	    EiC_generate(&e2->Code, gellong, &e2->Val, 0);	    break;	}	break;    }}void binhdouble(unsigned oper, token_t * e1, token_t * e2){    int t;    if ((t=EiC_gettype(e1->Type)) != t_double) {	if (!isconst(e1->Type)) {	    if (!e1->Pflag)		EiC_output(e1);	    switch (t) {	      CASE_INT:EiC_generate(&e1->Code, int2double, &e1->Val, 0);		break;	      CASE_UINT:EiC_generate(&e1->Code, uint2double, &e1->Val, 0);		break;	      CASE_LONG:EiC_generate(&e1->Code, long2double, &e1->Val, 0);		break;	      CASE_ULONG:EiC_generate(&e1->Code, ulong2double, &e1->Val, 0);		break;	    case t_llong: EiC_generate(&e1->Code, llong2double, &e1->Val, 0);		break;	    }	    EiC_exchtype(t_double, e1->Type);	} else 	    EiC_castconst(e1, e2, 0);    }    if ((t=EiC_gettype(e2->Type)) != t_double) {	if (!isconst(e2->Type)) {	    if (!e2->Pflag)		EiC_output(e2);	    switch (t) {	      CASE_INT:EiC_generate(&e2->Code, int2double, &e1->Val, 0);		break;	      CASE_UINT:EiC_generate(&e2->Code, uint2double, &e1->Val, 0);		break;	      CASE_LONG:EiC_generate(&e2->Code, long2double, &e1->Val, 0);		break;	      CASE_ULONG:EiC_generate(&e2->Code, ulong2double, &e1->Val, 0);		break;	      case t_llong:EiC_generate(&e2->Code, llong2double, &e1->Val, 0);		break;	    }	    EiC_exchtype(t_double, e2->Type);	} else	    EiC_castconst(e2, e1, 0);    }    if (!e2->Pflag)	EiC_output(e2);        switch (oper) {      case '+':	EiC_generate(&e2->Code, adddouble, &e2->Val, 0);	break;      case '-':	EiC_generate(&e2->Code, subdouble, &e2->Val, 0);	break;      case '*':	EiC_generate(&e2->Code, multdouble, &e2->Val, 0);	break;      case '/':	EiC_generate(&e2->Code, divdouble, &e2->Val, 0);	break;      default:	EiC_output(e1);	EiC_exchtype(t_int, e1->Type);	/* should really be boolean */	switch (oper) {	  case LT:	    EiC_generate(&e2->Code, ltdouble, &e2->Val, 0);	    break;	  case LE:	    EiC_generate(&e2->Code, ledouble, &e2->Val, 0);	    break;	  case EQ:	    EiC_generate(&e2->Code, eqdouble, &e2->Val, 0);	    break;	  case NE:	    EiC_generate(&e2->Code, nedouble, &e2->Val, 0);	    break;	  case GT:	    EiC_generate(&e2->Code, gtdouble, &e2->Val, 0);	    break;	  case GE:	    EiC_generate(&e2->Code, gedouble, &e2->Val, 0);	    break;	  default:EiC_error("illegal binary operation to `%c'", oper);	}    }}#define arrayLimit(type)    /* replaced by runtime checks *//*if(limit && (e2->Val.type >= limit || \				      e2->Val.type < 0))\                               EiC_error("Array bound violation");			       */#define ConstPval(y) { if(oper == '+')\			    e1->Val.p.p = (char*)e1->Val.p.p + e2->Val.y;\			else\			    e1->Val.p.p = (char*)e1->Val.p.p - e2->Val.y;\		    }void EiC_binhlval(unsigned oper, token_t * e1, token_t * e2){    unsigned limit = 0;    if (EiC_gettype(e1->Type) != t_pointer) {	if(EiC_gettype(e1->Type) != t_array) {	    EiC_binhlval(oper,e2,e1);	    EiC_swaptokens(e1,e2);	    return;	} else { /* convert array to pointer */	    limit = getNumElems(e1->Type);	    EiC_output(e1);	}    }    if(EiC_gettype(e2->Type) == t_array)	EiC_output(e2);           if (EiC_gettype(e2->Type) != t_pointer) {	if(oper == '+' || oper == '-') {	    int c = 0;	    VAL.ival = EiC_get_sizeof(nextType(e1->Type));	    if(!VAL.ival)		EiC_error("Illegal pointer operation");	    if(isconst(e1->Type) && isconst(e2->Type))		c = 1;	    if(isconst(e2->Type)) {		switch (EiC_gettype(e2->Type)) {		  CASE_INT:		    arrayLimit(ival);		    e2->Val.ival *= VAL.ival;		    if(c)			ConstPval(ival);		    break;		  CASE_UINT:		    arrayLimit(uival);		    e2->Val.uival *= VAL.ival;		    if(c)			ConstPval(uival);		    break;		  CASE_LONG:		    arrayLimit(lval);		    e2->Val.lval *= VAL.ival;		    if(c)			ConstPval(lval);		    break;		  CASE_ULONG:		    arrayLimit(ulval);		    e2->Val.ulval *= VAL.ival;		    if(c)			ConstPval(ulval);		    break;		  default:		    EiC_error("Illegal pointer operation");		}		VAL.ival = 1; 	    }	    if(!c) {		if(oper == '-')		    VAL.ival = -VAL.ival;		EiC_output(e2);		if(EiC_gettype(e2->Type) > t_uint && sizeof(int) != sizeof(long)) {		    token_t e3;		    EiC_inittoken(&e3);		    e3.Type = EiC_addtype(t_int,NULL);		    EiC_castvar(e2,&e3,0);		    EiC_freetype(e3.Type);		}		if(VAL.ival > 1 || VAL.ival < 0)		    EiC_generate(&e2->Code, ixa, &VAL, limit);		else		    EiC_generate(&e2->Code, addptr2int, &e2->Val, 0);	    }	    return;	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -