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

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

?? eccsaving.cpp

?? 編譯原理學習使用的代碼 內容有從詞法分析到中間代碼生成的代碼 并且含有注釋
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/****************************************************/
/* 文件 ECCsaving.cpp								*/
/*													*/
/* 說明 TINY編譯器中間代碼的公共表達式優化實現		*/
/****************************************************/

#include "globals.h"		/* 該頭文件定義全局類型和變量 */

#include "util.h"			/*該頭文件定義了一些實用函數*/

#include "Eccsaving.h"		/* 該頭文件聲明了公共表達式優化界面函數*/

/* 值編碼表 */
ValuNum     *valuNumT = NULL;
/* 可用表達式代碼表 */
UsableExpr  *usableExprT = NULL;
/* 臨時變量的等價表 */
TempEqua    *tempEquaT = NULL;

/*記錄值編碼*/
int  Vnumber= 0;


/**********函數聲明***************/

int		     NewVN();

CodeFile    *ECCsave();

void	     SaveInBlock(int i);

void	     EquaSubsti(CodeFile *code);

TempEqua    *FindTempEqua(ArgRecord *arg);

int		     Process(CodeFile  *code , int  i);

ValuNum     *SearchValuNum(ArgRecord  *arg);

bool         IsEqual(ArgRecord *arg1,ArgRecord  *arg2);

void	     AppendValuNum(ArgRecord *arg , int  Vcode);

CodeFile    *FindECC(CodeKind  codekind,int  op1Code, int  op2Code);

void	     AppendTempEqua(ArgRecord  *arg1,ArgRecord  *arg2);

MirrorCode  *GenMirror(int op1,int op2,int result);

void		 AppendUsExpr(CodeFile  *code,MirrorCode  *mirror);

void		 SubstiVcode(ArgRecord  *arg,int Vcode);

void		 DelUsExpr(ArgRecord  *arg);

/********************************************************/
/* 函數名  NewVN		  								*/
/* 功  能  產生一個新的值編碼							*/
/* 說  明  通過全局變量Vnumber加1,產生新的值編碼		*/
/********************************************************/
int  NewVN()
{  Vnumber++;  
   return (Vnumber);
}

/****************************************************/
/* 函數名  ECCsave									*/
/* 功  能  公共表達式優化主函數    					*/
/* 說  明  循環對各個基本塊進行公共表達式優化	    */
/****************************************************/
/*注:考慮將blocknum用作局部變量,全局變量封裝不好*/

CodeFile  *ECCsave()
{ 
	ValuNum  *freeVN = NULL;
	UsableExpr  *freeUE = NULL;
	TempEqua  *freeTE = NULL;
	/*調用劃分基本塊函數*/
	int  blocknum = DivBaseBlock() ;

    //PrintBaseBlock(blocknum);
	//getchar( );

    /*循環對每個基本塊進行公共表達式優化*/
	for (int i=0 ; i<blocknum ;i++)
	{  /*基本塊入口處置值編碼表,
		 可用表達式表,臨時變量等價表為空*/
	   valuNumT = NULL;
	   usableExprT = NULL;
	   tempEquaT = NULL;

	   /*基本塊的ECC節省*/
       SaveInBlock(i);

	   /*打印三個表*/
	   //printValuNum();
	   //printUsbleExpr();
	   //printTempEqua();

	   /*釋放此基本塊占用的表空間*/
		while (valuNumT!=NULL)
		{ freeVN = valuNumT ;
          valuNumT = valuNumT->next;
		  free(freeVN);
		}
		while (usableExprT!=NULL)
		{ freeUE = usableExprT;
		  usableExprT = usableExprT->next;
		  free(freeUE);
		}
        while(tempEquaT!=NULL)
		{ freeTE = tempEquaT;
		  tempEquaT = tempEquaT->next;
		  free(freeTE);
		}

	}
	/*返回優化后的中間代碼*/
	return(firstCode);

}

/****************************************************/
/* 函數名  SaveInBlock								*/
/* 功  能  基本塊優化函數	    					*/
/* 說  明										    */
/****************************************************/
void   SaveInBlock(int i)
{   
	int op1,op2,op3;
	/*可用的表達式代碼*/
	CodeFile  *substiCode = NULL;
	ValuNum  *Entry = NULL;
	
	/*指向基本塊第一條語句*/
	CodeFile *currentCode = baseBlock[i];
	CodeFile *formerCode = NULL;
	CodeFile *laterCode = NULL;

	/* 循環處理基本塊中的各條語句*/
	while ((currentCode!=baseBlock[i+1])&&(currentCode!=NULL))
	{
		/*進行等價替換*/
		EquaSubsti(currentCode);

		switch(currentCode->codeR.codekind)
		{ case  ADD:
		  case  SUB:
          case  MULT:
   	      case  DIV:
		  case  LTC:
		  case  EQC: 
		  case  AADD:
			   /*調用函數Process處理分量1,返回分量1的編碼*/
			   op1 = Process(currentCode ,1 );
			   /*調用函數Process處理分量2,返回分量2的編碼*/
			   op2 = Process(currentCode ,2 );

				/*查找可用表達式代碼表*/
				substiCode = FindECC(currentCode->codeR.codekind,op1,op2);
				/*若找到,當前代碼可節省*/
				if (substiCode!=NULL)
				{ 
                  /*向臨時變量等價表中添加一項*/
				  AppendTempEqua(currentCode->codeR.arg3,substiCode->codeR.arg3);
				  /*刪除當前代碼*/
				  formerCode = currentCode->former;
				  laterCode = currentCode->next;
				  if (formerCode!=NULL)
				  	  formerCode->next = laterCode;
				  if (laterCode!=NULL)
					  laterCode->former = formerCode; 
				  free(currentCode);
				  currentCode = formerCode;
				}				 
				else  /*沒找到,代碼不可節省*/
				{ 
				  /*為結果變量構造一個新的編碼,填入值編碼表*/
				  Vnumber++;
				  op3 = Vnumber;
				  AppendValuNum(currentCode->codeR.arg3,op3);
				  /*構造對應的映象碼*/
				  MirrorCode *mirror = GenMirror(op1,op2,op3);
				  /*當前代碼寫入可用表達式代碼表*/
				  AppendUsExpr(currentCode,mirror);
				}
				break;
		  case  ASSIG:
			    /*Process函數處理賦值右部,返回編碼*/
			    op1 = Process(currentCode ,1 );
				
				/*若是間接臨時變量,op1是地址碼;否則,是值碼*/
				op2 = op1;
				
				/*替換編碼表中賦值左部的值編碼*/
				SubstiVcode(currentCode->codeR.arg2, op2);

				/*刪除可用表達式代碼表中用到賦值左部值編碼的項*/
				DelUsExpr(currentCode->codeR.arg2);
				break;

		  default:  break;
		}
		/*處理下一條代碼*/
		currentCode = currentCode->next;
	}
}
/****************************************************/
/* 函數名  EquaSubsti								*/
/* 功  能  利用臨時變量等價表對當前代碼進行等價替換 */
/* 說  明  										    */
/****************************************************/
void  EquaSubsti(CodeFile *code)
{	
	TempEqua  *Entry = NULL ;
	if (code->codeR.arg1!=NULL)
		/*若操作數1是臨時變量,且存在于臨時變量等價表中,則替換*/
		if( code->codeR.arg1->form==AddrForm)
			if(code->codeR.arg1->Attr.addr.dataLevel == -1)
			{	Entry = FindTempEqua(code->codeR.arg1);
				if (Entry!=NULL)
					code->codeR.arg1 = Entry->arg2;
			}
    if (code->codeR.arg2!=NULL)
		/*若操作數2是臨時變量,且存在于臨時變量等價表中,則替換*/
		if( code->codeR.arg2->form==AddrForm)
			if(code->codeR.arg2->Attr.addr.dataLevel == -1)
			{	Entry = FindTempEqua(code->codeR.arg2);
				if (Entry!=NULL)
					code->codeR.arg2 = Entry->arg2;
			}
}

/****************************************************/
/* 函數名  Process									*/
/* 功  能  處理操作分量,并返回對應的編碼			*/
/* 說  明  若首次出現,則分配新編碼,填入編碼表中, */
/*	       返回值取這個新的編碼;否則,根據是否間接 */
/*	       變量,返回相應的值編碼或地址碼			*/	
/****************************************************/
int  Process(CodeFile  *code , int  i)
{
	ArgRecord  *arg;
	ValuNum  *Entry = NULL ;
	CodeKind  codekind = code->codeR.codekind;
	int  opC ;
	if (i==1)
			arg = code->codeR.arg1;
	else    arg = code->codeR.arg2;
	/*若操作數首次出現,則填入編碼表*/
	Entry = SearchValuNum(arg);
	if( Entry==NULL)
	{ Vnumber++;
	  opC = Vnumber; /*op1記錄操作數1的值編碼*/
	  AppendValuNum(arg,opC);
	}
	else 
	{  
		/*間接臨時變量*/
	   if (Entry->access == indir)
			/*用間接臨時變量的地址碼*/
			if((codekind == AADD)||(codekind == ASSIG))
					/*取地址碼*/
					opC= Entry->codeInfo.twoCode.addrcode;
			else   /*否則,取值碼*/
					opC = Entry->codeInfo.twoCode.valuecode;
		/*非間接臨時變量*/
		else    opC = Entry->codeInfo.valueCode;
	}

	return (opC);
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久一二三国产| 精品精品国产高清一毛片一天堂| 亚洲综合免费观看高清在线观看| 国产精品区一区二区三区 | 亚洲情趣在线观看| 国产欧美精品一区aⅴ影院| 久久久久久日产精品| 国产女主播在线一区二区| 91女人视频在线观看| 久久se精品一区二区| 久久er99热精品一区二区| 久久国产视频网| 国产成人精品亚洲午夜麻豆| 成人免费看视频| 色综合久久久久综合体| 在线精品视频免费观看| 欧美一区二区三区日韩视频| 懂色av一区二区三区蜜臀| 玉米视频成人免费看| 亚洲成人av电影| 免费成人你懂的| 国产91富婆露脸刺激对白| 波多野结衣精品在线| 精品国产乱码久久久久久老虎| 一区2区3区在线看| 亚洲人xxxx| 亚洲成人动漫精品| av不卡在线观看| 欧美在线一二三四区| 亚洲丝袜另类动漫二区| 日日骚欧美日韩| 色老头久久综合| 不卡的av在线播放| 亚洲激情一二三区| 六月丁香婷婷久久| 成人美女视频在线观看| 在线视频国产一区| 国产午夜久久久久| 精品一区二区三区影院在线午夜| 国产乱理伦片在线观看夜一区| 精品少妇一区二区三区在线播放| 美女在线视频一区| 欧美精品一二三| 欧美午夜宅男影院| **性色生活片久久毛片| 国产精品996| 亚洲男人的天堂在线观看| 国产**成人网毛片九色 | 久久久精品免费免费| 欧美一区二区三区四区五区 | 国产精品资源站在线| 久久久久久夜精品精品免费| 国产成人精品免费| 欧美激情一区二区三区不卡 | 国产成人综合在线播放| 26uuu久久天堂性欧美| 国产在线一区二区综合免费视频| 91色视频在线| 国产女同性恋一区二区| 欧美三级韩国三级日本三斤| 韩国一区二区三区| 亚洲精品国产高清久久伦理二区| 色琪琪一区二区三区亚洲区| 玉米视频成人免费看| 亚洲天堂2014| 欧美午夜精品久久久久久孕妇| 视频一区二区三区在线| 欧美国产一区在线| 欧美高清精品3d| 成人午夜视频在线观看| 国产欧美中文在线| 成av人片一区二区| 麻豆极品一区二区三区| 成人免费小视频| 欧美一区二区三区播放老司机| 成人免费视频一区二区| 黑人精品欧美一区二区蜜桃 | 欧美成人性福生活免费看| 成人福利视频网站| 蜜桃久久久久久久| 亚洲va韩国va欧美va| 国产免费观看久久| 成人免费黄色在线| 国产一区在线观看视频| 天天综合日日夜夜精品| 午夜伦理一区二区| 日韩在线观看一区二区| 一区二区三区欧美日| 亚洲一区二区高清| 日韩高清在线不卡| 成人小视频免费在线观看| 亚洲男人天堂av网| 亚洲天堂免费看| 亚洲激情图片小说视频| 亚洲精品水蜜桃| 日韩福利视频导航| 久色婷婷小香蕉久久| 国产盗摄视频一区二区三区| av不卡免费电影| 美国精品在线观看| 国产一区二区三区av电影| 日本成人在线视频网站| 麻豆视频一区二区| av网站免费线看精品| 欧美日韩卡一卡二| 国产亚洲自拍一区| 亚洲一区二区三区激情| 久久精品理论片| 色av成人天堂桃色av| 久久久国产午夜精品| 99久久久精品| 国产一区在线看| 色八戒一区二区三区| 久久久久久影视| 在线观看亚洲一区| 亚洲情趣在线观看| 亚洲精品免费电影| wwwwxxxxx欧美| 亚洲成人自拍一区| 国产91丝袜在线18| 久久先锋影音av鲁色资源| 国产精品丝袜一区| 日韩二区三区四区| 欧美午夜电影网| 天涯成人国产亚洲精品一区av| 欧美综合一区二区| 天天操天天干天天综合网| 91精品国产aⅴ一区二区| 日本午夜精品一区二区三区电影| 日韩一区二区精品葵司在线| 亚洲.国产.中文慕字在线| 91精品国产美女浴室洗澡无遮挡| 奇米色一区二区三区四区| 欧美日韩免费电影| 精品一区二区三区在线视频| 国产精品丝袜一区| 欧美视频日韩视频| 国产成人精品一区二| 亚洲国产视频直播| 久久欧美一区二区| 亚洲图片一区二区| 国内精品视频一区二区三区八戒| 国产欧美精品一区二区色综合朱莉 | 欧美一级艳片视频免费观看| 国产成人精品亚洲午夜麻豆| 亚洲蜜臀av乱码久久精品蜜桃| 国产精品自拍一区| 五月天激情小说综合| 最新热久久免费视频| 久久久99免费| 日韩女优毛片在线| 日韩精品一区二区三区在线观看| 91丝袜高跟美女视频| 国产99久久久久久免费看农村| 视频在线观看一区二区三区| 中文无字幕一区二区三区| 欧美在线一区二区| 麻豆91免费观看| 五月天婷婷综合| 日韩av一区二区在线影视| 国产精品免费视频一区| 国产精品一区二区无线| 丁香婷婷深情五月亚洲| 久久亚洲二区三区| 成人黄页在线观看| 亚洲精品欧美激情| 久久久久久9999| 欧美日韩精品二区第二页| 国产麻豆精品久久一二三| 国产精品全国免费观看高清 | 91精品在线免费观看| 日韩精品中文字幕一区| 午夜电影一区二区三区| 国产精品77777| 中文一区一区三区高中清不卡| 国产激情精品久久久第一区二区| 91.com视频| 麻豆精品一区二区av白丝在线| 在线电影欧美成精品| 激情综合色播激情啊| 中文一区二区在线观看| 2020国产精品| 欧美日韩一区二区在线观看视频| 成人av动漫在线| 国产精品夜夜嗨| 日韩美女视频一区二区| 亚洲人妖av一区二区| 国内成+人亚洲+欧美+综合在线| av一本久道久久综合久久鬼色| 欧美欧美欧美欧美| 亚洲欧洲日韩女同| 国产69精品久久99不卡| 日韩欧美二区三区| 国产精品色婷婷| 成年人午夜久久久| 日本一区免费视频| 久久99久久99精品免视看婷婷| 欧美一区二区精品在线| 亚洲一区中文日韩| 美女诱惑一区二区|