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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? codegen.c

?? 一個C語言的編譯器
?? C
?? 第 1 頁 / 共 2 頁
字號:

void gorei(void) //對">="進行翻譯的函數
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tCMP\tAX , BX\n");
	fprintf(inter_code,"\tJGE\tLabel%d\n",label_num);
	fprintf(inter_code,"\tMOV\tAX , 0\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"\tJMP\tLabel%d\n",label_num+1);
	fprintf(inter_code,"Label%d:",label_num);
	fprintf(inter_code,"\tMOV\tAX , 1\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"Label%d:",label_num+1);
	label_num += 2;
}

void lorei(void) //對"<="進行翻譯的函數
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tCMP\tAX , BX\n");
	fprintf(inter_code,"\tJLE\tLabel%d\n",label_num);
	fprintf(inter_code,"\tMOV\tAX , 0\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"\tJMP\tLabel%d\n",label_num+1);
	fprintf(inter_code,"Label%d:",label_num);
	fprintf(inter_code,"\tMOV\tAX , 1\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"Label%d:",label_num+1);
	label_num += 2;
}

void neqi(void)  //對"!="進行翻譯的函數  
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tCMP\tAX , BX\n");
	fprintf(inter_code,"\tJNE\tLabel%d\n",label_num);
	fprintf(inter_code,"\tMOV\tAX , 0\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"\tJMP\tLabel%d\n",label_num+1);
	fprintf(inter_code,"Label%d:",label_num);
	fprintf(inter_code,"\tMOV\tAX , 1\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"Label%d:",label_num+1);
	label_num += 2;
}
//-----------------------------------------------------------------------------------邏輯運算(&&,||,!)
void andi(void)  //對"$$"進行翻譯的函數
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tAND\tAX , BX\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
}

void ori(void)  //對"||"進行翻譯的函數 
{
	fprintf(inter_code,"\tPOP\tBX\n");
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tOR\tAX , BX\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
}

void noti(void)   //對"!"進行翻譯的函數
{
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tCMP\tAX , 0\n");
	fprintf(inter_code,"\tJNE\tLabel%d\n",label_num);
	fprintf(inter_code,"\tMOV\tAX , 1\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"\tJMP\tLabel%d\n",label_num+1);
	fprintf(inter_code,"Label%d:",label_num);
	fprintf(inter_code,"\tMOV\tAX , 0\n");
	fprintf(inter_code,"\tPUSH\tAX\n");
	fprintf(inter_code,"Label%d:",label_num+1);
	label_num += 2;
}
//------------------------------------------------------------------------------關于語句翻譯的函數
//----------------涉及"IF;WHILE;FOR"進行翻譯的函數
void ujp(char *label)
{
	fprintf(inter_code,"\tJMP\t%s\n",label);
}

void fjp(char*label)  
{
	fprintf(inter_code,"\tPOP\tAX\n");
	fprintf(inter_code,"\tCMP\tAX , 0\n");
	fprintf(inter_code,"\tJE\t%s\n",label);
}

void lab(char *label)
{
	fprintf(inter_code,"%s :\n",label);
}
//-----------------------------------------------
void call(char *name) //對"函數調用"進行翻譯的函數
{
    fprintf(inter_code,"\tCALL\t%s\n",name);
}
void input(char *name)  //對"輸入語句"進行翻譯的函數
{
	fprintf(inter_code,"\tMOV\tAH , 01H\n");
	fprintf(inter_code,"\tINT\t21H\n");
	fprintf(inter_code,"\tSUB\tAL , 30H\n");
	fprintf(inter_code,"\tMOV\tBH , AL\n");
	fprintf(inter_code,"\tMOV\tAH , 01H\n");
	fprintf(inter_code,"\tINT\t21H\n");
	fprintf(inter_code,"\tSUB\tAL , 30H\n");
	fprintf(inter_code,"\tMOV\tBL , AL\n");
    fprintf(inter_code,"\tMOV\tDL , ';'\n");
    fprintf(inter_code,"\tMOV\tAH , 02H\n");
    fprintf(inter_code,"\tINT\t21H\n");
	fprintf(inter_code,"\tMOV\tAL , BH\n");
    fprintf(inter_code,"\tMOV\tBH , 10\n");
	fprintf(inter_code,"\tMUL\tBH\n");
    fprintf(inter_code,"\tMOV\tBH , 0\n");
    fprintf(inter_code,"\tADD\tBX , AX\n");
	fprintf(inter_code,"\tMOV\t%s , BX\n",name);
    fprintf(inter_code,"\tMOV\tDL , 0DH\n");
	fprintf(inter_code,"\tMOV\tAH , 02H\n");
	fprintf(inter_code,"\tINT\t21H\n");
	fprintf(inter_code,"\tMOV\tDL , 0AH\n");
	fprintf(inter_code,"\tMOV\tAH , 02H\n");
	fprintf(inter_code,"\tINT\t21H\n");
}
void output(char *name)  //對"輸出語句"進行翻譯的函數
{
    fprintf(inter_code,"\tMOV\tBX , %s\n",name);
	fprintf(inter_code,"\tCALL\tWRITE\n");
	fprintf(inter_code,"\tMOV\tDL , 0DH\n");
	fprintf(inter_code,"\tINT\t21H\n");
	fprintf(inter_code,"\tMOV\tDL , 0AH\n");
	fprintf(inter_code,"\tINT\t21H\n");
}
//----------------------------------------------------------------對樹節點進行遍歷并進行翻譯(CODE段)
void CodeGen_TreeNode(TreeNode * node)    
{
	TreeNode * temp;
	int count;
	while (node != NULL) 
	{
	switch(node ->nodekind){
	case Dec:
		switch(node-> kind.dec){
		case FunDefK:
			Fun = node;
			count = 0;
			temp = node-> child[0];
			while(temp)
			{
				count ++;
				temp = temp-> sibling;
			}
			ent(node ->attr.name, count, (node -> type != Void)? TRUE:FALSE);
			temp = node -> child[0];	//參數
			if(temp)
				CodeGen_TreeNode(temp);
			if(count)
            {
				fprintf(inter_code,"\tMOV\t%s , AX\n",node -> child[0]->attr.name);
			    fprintf(inter_code,"\tPUSH\tAX\n");
	            fprintf(inter_code,"\tPUSH\tBX\n");
	            fprintf(inter_code,"\tPUSH\tCX\n");
			}
			CodeGen_TreeNode(node ->child[1]);	//復合結構體
			if(node -> type == Void)
				ret(FALSE,node ->attr.name);
			else
				ret(TRUE,node ->attr.name);
			leave(node ->attr.name);
			break;
		case CompK:
			pTable = node ->attr.table;
			temp = node ->child[0];
			if(temp)	// Dec
				CodeGen_TreeNode(temp);
			temp = node ->child[1];
			if(temp)	//stmt
				CodeGen_TreeNode(temp);
			compound_exit();
			break;
		case ParamK:
			break;
		default:
			break;
		}
		break;
//------------------------------------------------------------------------------------------------
	case Stmt:
		switch(node ->kind.stmt){
		case IfK:
			temp = node ->child[0];
			GenLabel(pTable ->lab1);
			GenLabel(pTable ->lab2);
			if(temp ->kind.exp == NumK)	//說明已經是0或1
			{
				if(temp -> attr.val.i == 0)
					ujp(pTable ->lab1);
			}
			else 
			{
				CodeGen_TreeNode(temp);
				fjp(pTable ->lab1);
			}
			pTable = node ->child[1] ->attr.table;
			if(node ->child[1])
				CodeGen_TreeNode(node ->child[1]);
			
			if(node ->child[2]) 
				ujp(pTable ->lab2);
			lab(pTable ->lab1);
			if(node ->child[2]) 
			{
				pTable = node ->child[2] ->attr.table;
				CodeGen_TreeNode(node ->child[2]);
				lab(pTable ->lab2);
			}
			break;
		case WhileK:
			GenLabel(pTable ->lab1);
			GenLabel(pTable ->lab2);
			lab(pTable ->lab1);
			temp = node ->child[0];
			if(temp ->kind.exp == NumK)	//說明已經是0或1
			{
				if(temp ->attr.val.i == 0)
					ujp(pTable ->lab2);
			}
			else
			{
				CodeGen_TreeNode(temp);
				fjp(pTable ->lab2);
			}
			if(node -> child[1])
				CodeGen_TreeNode(node -> child[1]);
			ujp(pTable ->lab1);
			lab(pTable ->lab2);
			break;
		case ForK:
            CodeGen_TreeNode(node -> child[0]);
			GenLabel(pTable ->lab1);
			GenLabel(pTable ->lab2);
			lab(pTable ->lab1);
			temp = node ->child[1];
			if(temp ->kind.exp == NumK)	//說明已經是0或1
			{
				if(temp ->attr.val.i == 0)
					ujp(pTable ->lab2);
			}
			else
			{
				CodeGen_TreeNode(temp);
				fjp(pTable ->lab2);
			}
			if(node -> child[2])
				CodeGen_TreeNode(node -> child[2]);
			CodeGen_TreeNode(node -> child[3]);
			ujp(pTable ->lab1);
			lab(pTable ->lab2);
			break;
		case CallK:
			temp = node ->child[0];
			fprintf(inter_code,"\tMOV\tAX , %s\n",node ->child[0] ->attr.name);
			call(node -> attr.name);
			fprintf(inter_code,"\tPUSH\tDX\n");
			break;
		case ReturnK:
			temp = node -> child[0];
			if(temp)
			{
				CodeGen_TreeNode(temp);
			}
			else ret(FALSE,pTable ->funEntry ->name);
			break;
		case AssignK:
			temp = node -> child[0];
			CodeGen_TreeNode(node -> child[1]);
			if(temp -> child[0])  //數組
			{
				ixa_elem_size(temp -> attr.name,temp ->child[0] ->attr.val.i);
			}
			else stn(node -> child[0] ->attr.name);
			break;
		case InputK:
			input(node->attr.name);
			break;
		case OutputK:
            output(node->attr.name);
		default:
			break;
		}
		break;
//---------------------------------------------------------------------------------------------------------
	case Exp:
		switch(node -> kind.exp){                       
		case OpK:
			if(node -> child[0])
				CodeGen_TreeNode(node -> child[0]);
			if(node -> child[1])
				CodeGen_TreeNode(node -> child[1]);
			switch(node -> attr.op) {
			//算術運算
			case PLUS:	adi();		break;
			case SUB:	subi();		break;
			case MUT:	multi();	break;
			case DIV:	divi();		break;
			case MOD:   modi();     break;
			case INC:   inci();
						stn(node -> child[0] -> attr.name);
						break;
			case DEC:   deci();     
				        stn(node -> child[0] -> attr.name);
						break;
			case B_XOR:   b_xori();     break;
			case B_LEFT:  b_lefti();    break;
			case B_RIGHT: b_righti();   break;
			case B_NOT:   b_noti();   
				          stn(node -> child[0] -> attr.name);
						  break;
			case B_AND:   b_andi();     break;
			case B_OR:    b_ori();      break;
			//關系運算
			case EQ:	equi();		break;
			case NEQ:	neqi();		break;
			case LE:	lorei();	break;
			case GE:	gorei();	break;
			case LT:	less();		break;
			case GT:	greater();	break;
			//邏輯運算
			case AND:	andi();		break;
			case OR:	ori();		break;
			case NOT:   noti();     break;
			default:	yyerror("Unknown Operator!");
						break;
			}
			break;
		case NumK:
			ldc(node -> attr.val.i);
			break;
		case IdK:
			lod(node -> attr.name);
			break;
		case CharK:
			ldd(node -> attr.val.i);
			break;
		default:
			break;
		}
		break;
	default:
		break;
	}
    node=node->sibling;
	}
}
//-------------------------------------------------------------------------------DATA段的數據定義形式
void DataSegment(TreeNode * node)
{

	TreeNode * temp;
	int count;
	while (node != NULL) 
	{
	switch(node ->nodekind)
	{
	case Dec:
		switch(node-> kind.dec){
		case FunDefK:
			Fun = node;
			count = 0;
			temp = node -> child[0];	//參數
			if(temp)
				DataSegment(temp);
			DataSegment(node ->child[1]);	//復合結構體
			break;
		case VarK:
			temp = node -> child[0];
			while(temp)
			{
				if(temp -> nodekind == Stmt)	// 定義并且賦值
						VarDec_ini(temp ->child[0] ->attr.name, temp->child[1]->attr.val.i);
				else
				{
					if(temp ->child[0] == NULL)  //定義但未賦值
						VarDec(temp ->attr.name);	
					else                         //定義數組
						ArrDec(temp ->attr.name, temp ->child[0] ->attr.val.i);
				}
				temp = temp ->sibling;
			}
			break;
		case ParamK:
			if(node->type==Integer)
			{
		       fprintf(inter_code,"%s\tdw\t",node->attr.name);
               fprintf(inter_code,"?\t\n");
			}
 	        if(node->type==Char)
			{
		       fprintf(inter_code,"%s\tdb\t",node->attr.name);
               fprintf(inter_code,"?\t\n");
			}	
			break;
		case CompK:
			pTable = node ->attr.table;
			temp = node ->child[0];
			if(temp)	//聲明部分
				DataSegment(temp);
			temp = node ->child[1];
			if(temp)	//語句部分(語句中可能定義一些變量)
				DataSegment(temp);
			compound_exit();
			break;
		}
		break;
	case Stmt:
		switch(node ->kind.stmt)
		{
		case IfK:
			temp = node ->child[0];
			if(temp ->kind.exp != NumK)	
				DataSegment(temp);
			pTable = node ->child[1] ->attr.table;
			if(node ->child[1])
				DataSegment(node ->child[1]);
			if(node ->child[2]) 
			{
				pTable = node ->child[2] ->attr.table;
				DataSegment(node ->child[2]);
			}
			break;
		case WhileK:
			temp = node ->child[0];
			if(temp ->kind.exp != NumK)	//說明已經是0或1
				DataSegment(temp);
			if(node -> child[1])
				DataSegment(node -> child[1]);
			break;
		case ForK:
            DataSegment(node -> child[0]);
			temp = node ->child[1];
			if(temp ->kind.exp != NumK)	//說明已經是0或1
				DataSegment(temp);
			if(node -> child[2])
				DataSegment(node -> child[2]);
			DataSegment(node -> child[3]);
			break;
		}
	}
    node=node->sibling;
	}
}
//---------------------------------------------------------------------------------------------------

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩国产欧美在线播放| 99精品视频中文字幕| 欧美国产精品一区二区三区| 成人h动漫精品一区二区| 亚洲高清免费观看 | 99精品欧美一区二区蜜桃免费| 久久精品人人做人人爽97| 99riav一区二区三区| 激情综合五月婷婷| 一区二区三区色| 久久精品日韩一区二区三区| 日本高清无吗v一区| 国产999精品久久久久久| 另类的小说在线视频另类成人小视频在线 | 欧美国产日本韩| 精品成a人在线观看| 在线观看亚洲精品| 91碰在线视频| 成人动漫一区二区在线| 国产精品系列在线观看| 久久69国产一区二区蜜臀| 丝袜美腿亚洲综合| 日韩在线一区二区三区| 一区二区三区在线播| 亚洲色图制服丝袜| 中文字幕中文字幕一区二区| 欧美国产国产综合| 国产精品进线69影院| 国产精品久久久99| 亚洲自拍都市欧美小说| 亚洲成av人片一区二区梦乃 | 午夜精品久久久久久久蜜桃app| 亚洲视频香蕉人妖| 天堂资源在线中文精品| 亚洲一区二区五区| 蜜桃视频在线观看一区| 国产精品自产自拍| 一本一道久久a久久精品综合蜜臀| 97久久超碰国产精品| 欧美日韩和欧美的一区二区| 在线不卡免费av| 久久伊99综合婷婷久久伊| 亚洲人成亚洲人成在线观看图片 | 亚洲免费av高清| 日本亚洲一区二区| 大桥未久av一区二区三区中文| 成人网页在线观看| av一区二区三区在线| 日本精品一级二级| 久久久午夜电影| 午夜精品久久久久久不卡8050| 国产精品99精品久久免费| 粉嫩aⅴ一区二区三区四区五区| 国产精品传媒在线| 免费在线视频一区| 欧美色视频在线观看| 777久久久精品| 国产精品久久久久久久裸模| 久久电影网站中文字幕| 波多野结衣亚洲一区| 欧美最新大片在线看| 综合久久久久久| 成人手机在线视频| 欧美一级理论片| 亚洲乱码国产乱码精品精98午夜 | 色婷婷综合久久久中文字幕| 欧美久久久影院| 玉米视频成人免费看| 国产91富婆露脸刺激对白| 欧美中文字幕亚洲一区二区va在线 | 精品国产电影一区二区| 青青青伊人色综合久久| 99精品偷自拍| 亚洲日本韩国一区| aa级大片欧美| 亚洲欧洲国产专区| 欧美日韩日日夜夜| 天天综合日日夜夜精品| 精品婷婷伊人一区三区三| 亚洲成人动漫av| 精品国产露脸精彩对白| 久久九九影视网| 粉嫩高潮美女一区二区三区| 国产在线播精品第三| 日本电影亚洲天堂一区| 丰满少妇久久久久久久| 国产伦精一区二区三区| 久久99精品久久久久久国产越南 | 蜜臀久久久久久久| 性做久久久久久免费观看| 五月天一区二区| 琪琪久久久久日韩精品| 日韩高清不卡一区| 国产福利精品导航| 91同城在线观看| 欧美一二三区精品| 欧美激情中文不卡| 综合亚洲深深色噜噜狠狠网站| 一区二区三区视频在线观看 | 欧美日韩视频一区二区| 久久久亚洲综合| 亚洲欧美一区二区久久| 亚洲免费观看高清完整版在线观看熊| 亚洲黄色小说网站| 青草av.久久免费一区| 国产成人99久久亚洲综合精品| 色综合天天视频在线观看| 欧美日韩一区二区电影| 久久女同互慰一区二区三区| 亚洲精品欧美专区| 国产一区二区三区四| 欧日韩精品视频| 欧美国产激情二区三区| 毛片av中文字幕一区二区| 欧美男人的天堂一二区| 亚洲午夜久久久久久久久久久| 国产一区二区三区在线看麻豆| 欧洲国产伦久久久久久久| 国产精品久久综合| 国产凹凸在线观看一区二区| 91官网在线免费观看| 亚洲视频资源在线| www.欧美亚洲| 中文字幕成人在线观看| 国产综合色视频| 欧美一二三区在线观看| 亚洲三级免费观看| 一区二区在线免费| 成人黄色免费短视频| 亚洲精品一区二区三区影院| 亚洲国产毛片aaaaa无费看| 国产精品亚洲人在线观看| 欧美少妇一区二区| 国产欧美日韩在线视频| 国产中文字幕精品| 久久亚洲一级片| 国产精品一区一区三区| 日韩美女视频一区二区在线观看| 亚洲精品国久久99热| 波多野结衣亚洲| 一区二区三区国产豹纹内裤在线| 国内精品伊人久久久久影院对白| 精品国产伦理网| 国产在线麻豆精品观看| 欧美卡1卡2卡| 国产做a爰片久久毛片| 精品少妇一区二区三区免费观看 | 美腿丝袜在线亚洲一区| 日韩一区二区三区免费观看| 免费一级片91| 欧美精品一区二区三区高清aⅴ| 91首页免费视频| 麻豆成人综合网| 一片黄亚洲嫩模| 亚洲精品一区二区三区99| eeuss鲁片一区二区三区| 日韩高清电影一区| 国产三级一区二区三区| 91丨九色porny丨蝌蚪| 日韩高清一区在线| 国产精品久久一级| 日韩精品中文字幕一区二区三区| 9人人澡人人爽人人精品| 久久精品国产精品亚洲综合| 中文欧美字幕免费| 国产偷v国产偷v亚洲高清| 宅男在线国产精品| 91国偷自产一区二区三区观看 | 日韩一级在线观看| 国产91在线|亚洲| 国产精品一二二区| 亚洲高清在线视频| 亚洲制服丝袜在线| 日韩毛片视频在线看| 国产精品日日摸夜夜摸av| 国产午夜一区二区三区| 久久久美女毛片| 亚洲欧洲三级电影| 国产午夜精品福利| 精品免费日韩av| 26uuu亚洲婷婷狠狠天堂| 欧美电影影音先锋| 日韩一区二区视频| 精品国产百合女同互慰| 精品国产伦一区二区三区观看体验| 精品少妇一区二区三区视频免付费| 97超碰欧美中文字幕| 欧美午夜视频网站| 欧美另类变人与禽xxxxx| 欧美变态tickling挠脚心| 精品国产百合女同互慰| 亚洲天堂2014| 国产原创一区二区三区| 国产精品一区免费在线观看| 欧美日韩免费高清一区色橹橹| 精品日韩欧美一区二区| 2023国产精华国产精品| 亚洲精品视频在线| 一区二区视频在线看| 日韩国产精品久久久久久亚洲|