亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? expr.c

?? 本程序集是Allen I. Holub所寫(xiě)的《Compiler Design in C》一書(shū)的附隨軟件
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
{
		switch (typ->type) {
			case bt_char:
					*node = makenode(en_cb,*node,0);
							break;
			case bt_unsignedchar:
					*node = makenode(en_cub,*node,0);
					break;
			case bt_enum:
			case bt_short:
	  			*node = makenode(en_cw,*node,0);
		  		break;
			case bt_unsignedshort:
  				*node = makenode(en_cuw,*node,0);
					break;
	  	case bt_long:
    			*node = makenode(en_cl,*node,0);
					break;
			case bt_unsigned:
					*node = makenode(en_cul,*node,0);
		  		break;
			case bt_float:
  				*node = makenode(en_cf,*node,0);
					break;
			case bt_double:
					*node = makenode(en_cd,*node,0);
					break;
			case bt_longdouble:
					*node = makenode(en_cld,*node,0);
					break;
			default:
					*node = makenode(en_cp,*node,0);
					break;
		}
	(*node)->cflags = typ->cflags;
}
TYP *gatherparms( ENODE **node)
/*
 * create a type tree and primary parameter list for a function
 *
 * At this point the parameter list is backwards from what codegen
 * needs!
 */
{
	ENODE *ep1 = 0,*ep2=0,**ep3 = &ep1;
	TABLE tbl;
	SYM **t = &tbl.head,*newt;
	TYP *tp;
	int ogc = goodcode;
	tbl.tail = tbl.head = 0;
	goodcode |= DF_FUNCPARMS;
	if (lastst == closepa) {
#ifdef CPLUSPLUS
		if (prm_cplusplus)
			tbl.head=tbl.tail=(SYM *)-1;
		else
#endif
			tbl.head=tbl.tail = 0;
	}
	else if (lastst == kw_void)
		tbl.head = tbl.tail = (SYM *)-1;
	else
	  while (lastst != closepa) {
			tp = exprnc(&ep2);
			if (!tp) {
				generror(ERR_EXPREXPECT,0,0);
				break;
			}
			ep2->cflags = tp->cflags;
			newt = xalloc(sizeof(SYM));
			newt->tp = tp;
			newt->next = 0;
			newt->name = 0;
			*t = newt;
			t = &newt->next;
			tbl.tail = newt;
			*ep3 = makenode(en_void,ep2,0);
			ep3 = &(*ep3)->v.p[1];
			if (lastst == comma)
				getsym();
		}
	needpunc(closepa,skm_closepa);
	tp = maketype(bt_func,0);
	tp->btp = &stdint;
	tp->lst = tbl;
	tp->bits = -1;
	tp->startbit = -1;
	tp->uflags = UF_DEFINED | UF_USED;
	goodcode = ogc;
	*node = ep1;
	return tp;
}
void checkparmconst(TYP *tp, TYP *tpi)
/*
 * Check the CONST flags for parameters
 */
{
	if (tpi->type != bt_pointer && tpi->type != bt_ref)
		return;
	while ((tp->type == bt_pointer || tp->type == bt_ref)&& !tp->val_flag && (!tpi || tpi->type == bt_pointer || tpi->type == bt_ref)) {
		if ((tp->cflags & DF_CONST) && (!tpi || !(tpi->cflags & DF_CONST)))
			generror(ERR_MODCONS,0,0);
		tp = tp->btp;
		tpi = tpi->btp;
	}
	if ((tp->cflags & DF_CONST) && (!tpi || !(tpi->cflags & DF_CONST)))
		generror(ERR_MODCONS,0,0);
}
void parmlist(ENODE **node, TYP *tpi, TYP *tp)
/*
 * take the primary type and node trees, the function argument expectations,
 * and check for type mismatch errors
 *
 * also reverse the primary node tree so the parms will be ready for
 * code generation
 */
{       ENODE    *ep1=0,*ep2=0,*ep3=*node;
				SYM *spi=tpi->lst.head,*sp=0;
				TYP *tp2;
				int matching = FALSE;
				if (tp)
					sp=tp->lst.head;
				if (tp && !sp)
					gensymerror(ERR_NOPROTO,tpi->sname);
				
					if (!prm_cplusplus && sp && sp != (SYM *)-1 && sp->tp->type != bt_ellipse)
							matching = TRUE;
					while (TRUE) {
							if (!spi || spi == (SYM *)-1){
								if (sp == (SYM *) -1)
									break;
								if (sp && sp->tp->type != bt_ellipse) 
									if (!sp->defalt) 
										genfuncerror(ERR_CALLLENSHORT,tpi->sname,0);
									else
										while (sp && sp != (SYM *)-1) {
											if (sp->tp->val_flag && (sp->tp->type == bt_struct || sp->tp->type == bt_union)) {
												ep1 = makenode(en_stackblock,sp->defalt,ep1);
												sp->defalt->size = sp->tp->size;
											}
											else
	    			    		   	ep1 = makenode(en_void,sp->defalt,ep1);
											sp = sp->next;
										}
								break;
							}
							else {
							ep2 = ep3->v.p[0];
							ep3 = ep3->v.p[1];
							if (matching) {
								if (!sp || sp == (SYM *)-1) {
									genfuncerror(ERR_CALLLENLONG,tpi->sname,0);
									break;
								}
								else {
									checkparmconst(spi->tp,sp->tp);
									if (!checktype(spi->tp,sp->tp))
								  	if (isscalar(sp->tp) && isscalar(spi->tp))
											promote_type(sp->tp,&ep2);
										else
											if (sp->tp->type == bt_pointer) {
												if (isintconst(ep2->nodetype)) {
													if (ep2->v.i != 0)
														generror(ERR_NONPORT,0,0);
												}
												else if (spi->tp->type != bt_pointer)
														genfuncerror(ERR_CALLMISMATCH,tpi->sname,sp->name);
						 					}
											else genfuncerror(ERR_CALLMISMATCH,tpi->sname,sp->name);
								}
							}
							}
							if (sp && sp->tp->type == bt_ref) {
								if (lvalue(ep2)) {
									while (castvalue(ep2))
										ep2 = ep2->v.p[0];
									ep2 = ep2->v.p[0];
								}
								else {
									ENODE *x;
									tp2 = sp->tp->btp;
									genfuncerror(ERR_TEMPUSED,tpi->sname,sp->name);
									ep2 = makenode(en_refassign,dummyvar(tp2->size,tp2),ep2);
								}
								}
							if (spi && spi != (SYM *) -1 && spi->tp->val_flag && (spi->tp->type == bt_struct || spi->tp->type == bt_union)) {
								ep1 = makenode(en_stackblock,ep2,ep1);
								ep2->size = sp->tp->size;
							}
							else
	        	   	ep1 = makenode(en_void,ep2,ep1);
							spi = spi->next;
 							if (sp && sp != (SYM *)-1) {
								sp = sp->next;
 								if (sp && sp->tp->type == bt_ellipse)
									matching = FALSE;
							}
					}
				if (tp)
					promote_type(tp->btp,&ep1);
				else
					promote_type(tpi->btp,&ep1);
				*node = ep1;
}

int floatrecurse(ENODE *node)
/*
 * Go through a node and see if it will be promoted to type FLOAT
 */
{
	if (!node)
		return 0;
	switch (node->nodetype) {
								case en_rcon:
								case en_lrcon:
								case en_fcon:
								case en_doubleref:
								case en_longdoubleref:
								case en_floatref:
								case en_cld:
								case en_cd:
								case en_cf:
												return 1;
                case en_labcon: case en_trapcall: 
                case en_nacon:  case en_autocon:  case en_autoreg: case en_nalabcon:
                case en_l_ref:  case en_tempref: case en_napccon: case en_absacon:
								case en_cl: case en_regref:
                case en_ul_ref:
								case en_cul:
								case en_cp:
                case en_icon:
								case en_lcon: case en_iucon: case en_lucon: case en_ccon:
								case en_bits:
                case en_ub_ref:
								case en_cub:
                case en_b_ref:
								case en_cb:
                case en_uw_ref:
								case en_cuw:
                case en_cw:
                case en_w_ref:
                case en_eq:     case en_ne:
                case en_lt:     case en_le:
                case en_gt:     case en_ge:
								case en_ugt: case en_uge: case en_ult: case en_ule:
                        return 0;
								case en_fcall: case en_pfcall:
								case en_fcallb: case en_pfcallb:
								case en_callblock:
												return(floatrecurse(node->v.p[1]));
                case en_not:    case en_compl:
                case en_uminus: 
                case en_ainc:   case en_adec:
								case en_moveblock: case en_stackblock:
                        return floatrecurse(node->v.p[0]);
								case en_refassign: case en_assign:
                case en_add:    case en_sub:
								case en_umul:		case en_udiv:	case en_umod: case en_pmul:
                case en_mul:    case en_div:
                case en_mod:    case en_and:
                case en_or:     case en_xor:
								case en_asalsh: case en_asarsh: case en_alsh: case en_arsh:
                case en_lsh:    case en_rsh:
                case en_land:   case en_lor:
                case en_asadd:  case en_assub:
                case en_asmul:  case en_asdiv:
                case en_asmod:  case en_asand:
								case en_asumod: case en_asudiv: case en_asumul:
                case en_asor:   case en_aslsh: case en_asxor:
                case en_asrsh:
                        return(floatrecurse(node->v.p[0]) || floatrecurse(node->v.p[1]));
                case en_void:   case en_cond:
                        return floatrecurse(node->v.p[1]);
	}
	return(0);
}
void floatcheck(ENODE *node)
/*
 * Error if node will be promoted to type float
 */
{
	if (floatrecurse(node))
		generror(ERR_INVFLOAT,0,0);
}
int     castbegin(int st)
/*
 *      return 1 if st in set of [ kw_char, kw_short, kw_long, kw_int,
 *      kw_float, kw_double, kw_struct, kw_union, kw_float, or is typedef ]
 */
{      
	SYM *sp;
	switch(st) {
		case kw_void:
		case kw_char: case kw_short: case kw_int: case kw_long:
		case kw_float: case kw_double:	
		case kw_struct:	case kw_union: case kw_signed:
		case kw_unsigned:	case kw_volatile:	case kw_const:
			return 1;
		default:
			if (st != id)
				return 0;
	} 
	nm = lastid;
	sp = gsearch(lastid);
	if (!sp)
		sp = search(lastid,&lsyms);
	if (sp && sp->storage_class == sc_type)
		return 1 ;
	return 0;
}

int tostring()
{
	short string[2048];
	int st = lastst;
	string[0] = 0;
	while (lastst == st) {
		if (st == lsconst) {
			if (pstrlen(string) +pstrlen(laststr) > 2040)
				generror(ERR_STRINGTOOBIG,0,0);
			else
				pstrcat(string,laststr);
		}
		else {
			if (strlen(string) +strlen(laststr) > 4090)
				generror(ERR_STRINGTOOBIG,0,0);
			else
				strcat(string,laststr);
		}
		getsym();
	}
	return(stringlit(string,st == lsconst));
}
TYP     *primary(ENODE **node)
/*
 *      primary will parse a primary expression and set the node pointer
 *      returning the type of the expression parsed. primary expressions
 *      are any of:
 *                      id
 *                      constant
 *                      string
 *                      ( expression )
 *                      primary++
 *                      primary--
 *                      primary[ expression ]
 *                      primary.id
 *                      primary->id
 *                      primary( parameter list )
 *											(* expression)( parameter list )
 *                      (typecast)primary
 *                      (typecast)(unary)
 */
{       ENODE    *pnode, *qnode, *rnode;
        SYM             *sp=0;
        TYP             *tptr,*tp1,*tp2;
				int flag = 0;
				int gcode,gdf;
				int isstring = FALSE;
        switch( lastst ) {
/* This trap thing should be in stmt.c */
						case kw__trap:    
									getsym();
									if (needpunc(openpa,0)) {
										long num = intexpr(0);
										if (num > 15 || num < 0)
											generror(ERR_INVTRAP,0,0);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美情侣在线播放| 国产精品久久久久影视| 久久久久国产精品麻豆ai换脸| 91精品国产91久久综合桃花| 欧美伦理视频网站| 日韩精品一区二区三区swag| 亚洲精品一区二区三区福利| 久久久91精品国产一区二区三区| 国产欧美日韩在线| 亚洲欧美另类在线| 丝袜亚洲精品中文字幕一区| 日本成人在线不卡视频| 成年人午夜久久久| 欧美日韩精品二区第二页| 欧美精品一区二区三区四区| 天天综合网天天综合色| 亚洲精品高清视频在线观看| 日本成人中文字幕| 本田岬高潮一区二区三区| 日本麻豆一区二区三区视频| 欧美卡1卡2卡| 国产精品传媒视频| 韩国av一区二区| 色婷婷综合久久久久中文| 91精品在线一区二区| 亚洲欧美在线视频观看| 久久精品国内一区二区三区| 99精品偷自拍| 国产亚洲精品福利| 久久99精品久久久久久动态图| 91一区二区三区在线观看| 久久久久成人黄色影片| 日韩激情视频在线观看| 色婷婷香蕉在线一区二区| 久久久精品日韩欧美| 国产麻豆精品视频| 精品欧美一区二区三区精品久久| 午夜久久久影院| 欧美男男青年gay1069videost| 亚洲欧洲在线观看av| 国产成人午夜电影网| 免费的国产精品| 国产91丝袜在线观看| 日韩欧美一区中文| 蜜臀精品一区二区三区在线观看 | 国产在线播放一区三区四| 欧美综合视频在线观看| 亚洲欧美日韩一区二区三区在线观看| 成人午夜免费视频| 亚洲视频一二三| 欧美日韩精品系列| 亚洲成人动漫精品| 精品福利一区二区三区免费视频| 麻豆久久久久久久| 欧美一区二区三区系列电影| 免费观看日韩av| 中国色在线观看另类| 日本韩国视频一区二区| 日韩和的一区二区| 国产欧美一区二区三区鸳鸯浴 | 亚洲婷婷综合久久一本伊一区 | 亚洲丝袜另类动漫二区| 欧美日韩国产一二三| 国产成人在线免费观看| 亚洲一区二区黄色| 久久久久久免费毛片精品| 91精品福利视频| 国产在线不卡视频| 日韩高清一区二区| 亚洲欧美一区二区三区久本道91 | 天堂影院一区二区| 欧美激情一区二区三区不卡 | 久久99久久99精品免视看婷婷| 日本一区二区三区久久久久久久久不| 欧美日韩国产首页在线观看| 粉嫩aⅴ一区二区三区四区五区| 日本美女一区二区三区视频| 国产精品国产三级国产aⅴ入口 | 91毛片在线观看| 成人免费视频一区二区| 国产一区二区免费看| 日日噜噜夜夜狠狠视频欧美人| 中文成人综合网| 国产欧美日韩在线视频| 国产亚洲欧美在线| 久久在线免费观看| 91精品国产色综合久久| 欧美剧情片在线观看| 欧美图片一区二区三区| 在线看国产日韩| 欧美日本在线播放| 欧美亚洲日本一区| 欧美色综合网站| 69久久99精品久久久久婷婷| 欧美一级二级三级蜜桃| 精品国产凹凸成av人网站| 国产午夜精品在线观看| 国产精品福利一区二区| 夜色激情一区二区| 麻豆精品一区二区综合av| 国产福利91精品| 亚洲sss视频在线视频| 亚洲综合免费观看高清完整版在线 | 国产天堂亚洲国产碰碰| 日本一区二区三区四区在线视频| 亚洲欧美色图小说| 丝袜美腿高跟呻吟高潮一区| 韩国精品久久久| 色综合天天综合色综合av | 日本伊人色综合网| 成人黄色在线看| 欧美电影免费观看高清完整版在| 久久久综合网站| 日韩中文字幕亚洲一区二区va在线| 伦理电影国产精品| 在线观看亚洲精品视频| 久久蜜臀中文字幕| 午夜国产不卡在线观看视频| 国产一区二区日韩精品| 欧美日韩高清一区二区| 亚洲三级在线播放| 国产**成人网毛片九色| 日韩欧美中文字幕一区| 亚洲欧美日韩在线不卡| 成人午夜短视频| 国产喷白浆一区二区三区| 久久国产精品99久久久久久老狼| 欧美日韩一区二区三区视频| 亚洲精品视频在线看| 国产精品白丝jk黑袜喷水| 欧美裸体一区二区三区| 香蕉成人伊视频在线观看| 色婷婷综合五月| 亚洲影院理伦片| 欧美一区日本一区韩国一区| 一区二区三区日韩在线观看| 色先锋久久av资源部| 亚洲成人自拍偷拍| 欧美日韩另类一区| 日本美女一区二区三区| 久久久久九九视频| 91在线小视频| 亚洲一区二区欧美日韩 | 午夜欧美一区二区三区在线播放| 欧美日韩国产成人在线免费| 亚洲一区二区三区在线看 | 亚洲欧洲日韩女同| 一本色道久久综合亚洲aⅴ蜜桃| 一区二区三区四区乱视频| 欧美一区二区三区免费观看视频 | 亚洲欧洲日韩av| 91精品免费在线| 国产91精品一区二区麻豆亚洲| 国产精品久久久久影院亚瑟| 欧美日韩在线播放三区四区| 久草这里只有精品视频| 亚洲国产wwwccc36天堂| 亚洲国产精品v| 欧美一区二区三区电影| 日本国产一区二区| 国产成人在线色| 另类欧美日韩国产在线| 亚洲欧美一区二区三区极速播放| 欧美精品一区二区三区蜜桃视频 | 天天射综合影视| 亚洲图片激情小说| 国产人妖乱国产精品人妖| 宅男在线国产精品| 欧美视频一区二区三区四区| 成人中文字幕电影| 国产乱子轮精品视频| 久久丁香综合五月国产三级网站| 午夜激情久久久| 亚洲国产综合视频在线观看| 精品福利一二区| 91久久精品一区二区二区| av在线播放一区二区三区| 国产一区二区精品久久| 亚洲国产日韩一级| 午夜精品影院在线观看| 日本午夜精品一区二区三区电影| 亚洲成va人在线观看| 免费成人av在线| 国产一区二区网址| 国产suv精品一区二区6| av一二三不卡影片| 在线观看成人小视频| 在线观看一区二区精品视频| 91精品久久久久久蜜臀| 精品日产卡一卡二卡麻豆| 国产欧美精品国产国产专区| 国产精品福利av| 日韩精品三区四区| 国产.精品.日韩.另类.中文.在线.播放| 国产美女精品在线| 欧美午夜在线观看| 欧美va亚洲va在线观看蝴蝶网| 国产精品嫩草影院com| 亚洲成人动漫在线免费观看| 国产成人综合亚洲91猫咪|