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

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

?? loopopti.cpp

?? 學習編譯原理
?? CPP
字號:

/****************************************************/
/* 文件 loopOpti.cpp								*/
/*													*/
/* 說明 TINY編譯器中間代碼的循環不變式外提優化  	*/
/****************************************************/

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

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

#include "loopOpti.h"		/* 該頭文件聲明了循環不變式優化界面函數*/


/*變量定值表,用變量的arg結構表示變量*/
 ArgRecord  *varTable[100];
 int  TotalNum = 0;

/*循環信息棧*/
LoopStack  *loopTop = NULL;
bool  loopStackEmpty;


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

CodeFile * LoopOpti();

void      whileEntry(CodeFile *code);

void      whileEnd(CodeFile *code);

void      call(CodeFile  *code);

void	  LoopOutside(CodeFile  *entry);

int  	  SearchTable(ArgRecord  *arg , int  head);

void      DelItem(ArgRecord  *arg, int head);

void      AddTable(ArgRecord *arg);

void      printVarTable();


/****************************************************/
/* 函數名  LoopOpti									*/
/* 功  能  循環不變式優化主函數						*/
/* 說  明										    */
/****************************************************/
CodeFile  *LoopOpti()
{   
   /*初始化變量定值表*/
	for (int i=0;i<100;i++)
		varTable[i] = NULL;

	/*從第一條代碼開始優化過程*/
    CodeFile  *currentCode = firstCode;
	
    fprintf(listing,"\n>>Var  def  Table  after  each  code:\n");

	/*循環處理每條代碼,直到中間代碼結束*/
	while (currentCode!=NULL)
	{   
		switch(currentCode->codeR.codekind)
		{ /*算術和關系操作*/
		  case  AADD:
		  case  ADD:
		  case  SUB:
          case  MULT:
   	      case  DIV:
		  case  LTC:
		  case  EQC:	
			        /*將被定值的變量名填入變量定值表中*/
			  	    AddTable(currentCode->codeR.arg3);
					break;
		  /*賦值語句*/
	      case ASSIG:
			        /*將被定值的變量填入變量定值表中*/
			  	    AddTable(currentCode->codeR.arg2);
					break;
		  /*循環入口*/
		  case WHILESTART:
					whileEntry(currentCode);
					break;
		  /*循環出口*/
		  case ENDWHILE:  
					whileEnd(currentCode);
					break;
		  /*過程調用語句*/
		  case CALL:
			        call(currentCode);
			        break;

		  default : break;
        }
      /*調用函數輸出變量定值表,以現在處理完每條代碼后,
	    表的變化*/
      printVarTable();
	  /*令指針指向下一條代碼*/
	  currentCode = currentCode->next;

	 
	}
   return (firstCode);
}

/****************************************************/
/* 函數名  whileEntry								*/
/* 功  能  循環入口部分的處理函數					*/
/* 說  明										    */
/****************************************************/
void whileEntry(CodeFile *code)
{
	LoopInfo  *infoItem = (LoopInfo*)malloc(sizeof(LoopInfo));

	/*外提標志初始化為可以外提標志1*/
	infoItem->state = 1;
	/*此循環在變量定值表的入口*/
	infoItem->varDef = TotalNum;
	/*循環入口指針*/
	infoItem->whileEntry = code;
	/*循環出口此處不能確定*/
	//infoItem.whileEnd = NULL;
    /*循環信息表壓棧*/
    PushLoop(infoItem);

}

/****************************************************/
/* 函數名  call										*/
/* 功  能  遇到過程調用語句的特別處理				*/
/* 說  明  所有包含此調用語句的循環都不能做不變式   */
/*		   外提									    */
/****************************************************/
void  call(CodeFile  *code)
{ 
  /*所有打開著的循環均為不可外提狀態,是這些循環信息中的
    State取0*/
   LoopStack  *Item = loopTop;
  
   while (Item!=NULL)
   { Item->loopInfo->state = 0;
     Item = Item->under;
   }

}

/****************************************************/
/* 函數名  whileEnd									*/
/* 功  能  循環出口部分的處理函數					*/
/* 說  明										    */
/****************************************************/

void whileEnd(CodeFile *code)
{
  /*循環信息棧的棧頂*/
  LoopStack  *Item = loopTop;

  /*可以外提*/
  if (Item->loopInfo->state == 1)
  {   
	  /*填寫循環出口位置指針*/
	  loopTop->loopInfo->whileEnd = code;
	  /*找到循環入口*/
      CodeFile  *entry  = loopTop->loopInfo->whileEntry;
      /*循環外提處理部分*/
      LoopOutside(entry );
  }

  /*彈循環信息棧,此層循環處理結束*/
  PopLoop();

}


/****************************************************/
/* 函數名  LoopOutside								*/
/* 功  能  循環外提處理函數							*/
/* 說  明										    */
/****************************************************/
void   LoopOutside(CodeFile  *entry)
{
   /*外提的位置,為循環入口位置*/
   CodeFile  *place = entry;
   /*當前處理代碼,注:跳過循環開始標號語句*/
   CodeFile  *code =  entry->next;
   
   /*取循環信息棧頂指針*/
   LoopStack *Item = loopTop;
   /*取得本層循環的出口位置*/
   CodeFile  *end = Item->loopInfo->whileEnd;
   /*取得本層循環的變量信息表*/
   int  head = Item->loopInfo->varDef;

   int  present1, present2;

   /*用于跳過內層循環*/
   int  Level = 0;

   /*循環檢查每條代碼是否可以外提,直到此層循環結束*/
	while (code != end )
	{   
		switch(code->codeR.codekind)
		{ 
		  case  WHILESTART:
				Level++;	break;
		  case  ENDWHILE:
			    Level--;	break;
		  case  ADD:
		  case  SUB:
          case  MULT:
		  case  AADD:
			   /*跳過內層循環*/
			   if (Level==0)
				{
				 present1 = SearchTable(code->codeR.arg1,head);
				 present2 = SearchTable(code->codeR.arg2,head);
				 /*兩個分量都不在變量定值標號中,可以外提*/
				 if ((present1<0)&&(present2<0))
				 {  /*操作結果也是不變量,故若在表中,從表中刪除*/
					
					DelItem(code->codeR.arg3, head);
					/*外提*/
					/*在當前位置,刪除此代碼*/
					CodeFile *formerCode = code->former;
					CodeFile *nextCode = code->next;
					formerCode->next = nextCode;
					nextCode->former = formerCode;

					/*將代碼加入到應外提的位置*/
					CodeFile *fplace = place->former;
					fplace->next  = code;
					code->former = fplace;
  			    	code->next = place;
					place->former = code;

					/*回到當前位置處,準備處理下一條語句*/
					code = formerCode;					
				 }
				 else
					/*否則,將變量定值加入當前變量定值表中*/ 
					AddTable(code->codeR.arg3);
				}
			   break;
          default :  break;
		}

		/*檢查下一條語句*/
		code = code->next;
	}

}


/****************************************************/
/* 函數名  SearchTable								*/
/* 功  能  循環變量定值表查找函數					*/
/* 說  明  參數head指明了本層循環的變量定值在表中的 */
/*		   起始位置,arg表示要查找的變量,返回變量   */
/*		   在表中的位置,若不存在返回值為-1		*/
/****************************************************/
int	SearchTable(ArgRecord  *arg , int  head)
{
	/*初始化為負數,不再表中*/
	int  present = -1 ;

	if (arg->form ==AddrForm)
	{   
		int  level = arg->Attr.addr.dataLevel;
	    int  off = arg->Attr.addr.dataOff;
		/*注:臨時變量和源變量都可以通過比較層數和偏移看是否存在
		      于表中*/
		for (int i = head; i<TotalNum; i++)
			if ((varTable[i]->Attr.addr.dataLevel == level)
				&&(varTable[i]->Attr.addr.dataOff == off))
			{	present = i;
				break;
			}
    }   
	return(present);
}

/****************************************************/
/* 函數名  DelItem									*/
/* 功  能  刪除變量定值表中此項						*/
/* 說  明										    */
/****************************************************/
void  DelItem(ArgRecord  *arg, int head)
{
   /*調用函數查找變量定值表*/
   int present = SearchTable(arg , head);
   /*若在表中,則刪除*/
   if (present!=-1)
   {   for (int i=present;i<TotalNum ; i++)
           varTable[i] =varTable[i+1];
       TotalNum--;
   }
}

/****************************************************/
/* 函數名  AddTable									*/
/* 功  能  將被定值的變量填入變量定值表				*/
/* 說  明										    */
/****************************************************/
void  AddTable(ArgRecord  *arg)
{  
   /*若不在循環中,則從頭查表,以免表中重復填入相同的變量*/
   int head = 0;
   /*若在循環中,則只要在當前循環層沒有重復定義即可*/
   if (loopTop!=NULL)
	    head = loopTop->loopInfo->varDef;

   int  present = SearchTable(arg , head);
   /*表中沒有,則添加*/
   if  (present==-1)
       varTable[TotalNum++] = arg;


}

/****************************************************/
/* 函數名  printVarTable							*/
/* 功  能  輸出變量定值表							*/
/* 說  明										    */
/****************************************************/
void  printVarTable()
{  
	  fprintf(listing,">>");
	  /*輸出變量定值表*/
	  for (int i=0;i<TotalNum;i++)
	  {
		if (varTable[i]!=NULL)
		{	  if (varTable[i]->Attr.addr.dataLevel== -1)
				{ fprintf(listing, "temp");
				  fprintf(listing,"%d",varTable[i]->Attr.addr.dataOff);
		          fprintf(listing," ");
				}
			   else 
			      fprintf(listing, "%s  ",varTable[i]->Attr.addr.name);
		}
	  }
	  fprintf(listing,"\n");
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区三区观看| 中文字幕一区二区三中文字幕| 久久午夜色播影院免费高清| 中文文精品字幕一区二区| 亚洲色图在线播放| 麻豆成人免费电影| 99久久伊人精品| 精品捆绑美女sm三区| 亚洲综合小说图片| 国产一区二区成人久久免费影院| 日本伦理一区二区| 国产日韩视频一区二区三区| 一区二区三区免费看视频| 国产精品一区一区三区| 欧美二区乱c少妇| 亚洲综合色视频| 国产成人小视频| 日韩免费在线观看| 亚洲成年人影院| 91在线高清观看| 亚洲国产精品t66y| 国产成人免费在线| 欧美顶级少妇做爰| 亚洲一区二三区| 91精品办公室少妇高潮对白| 国产精品成人午夜| 国产精一品亚洲二区在线视频| 欧美一区二区日韩| 亚洲成人动漫在线免费观看| 懂色中文一区二区在线播放| 久久久亚洲精华液精华液精华液| 午夜欧美一区二区三区在线播放| 99re这里只有精品6| 国产精品理论片在线观看| 国产成人精品免费| 国产精品拍天天在线| 国产精品一二三在| 国产亚洲一区字幕| 国产福利不卡视频| 国产精品狼人久久影院观看方式| 粉嫩aⅴ一区二区三区四区| 国产精品麻豆网站| 99re这里只有精品视频首页| 亚洲精品国产视频| 欧美日韩免费视频| 久久精品国产第一区二区三区| 日韩西西人体444www| 精品在线视频一区| 国产精品人成在线观看免费| av在线播放一区二区三区| 亚洲精品高清视频在线观看| 欧美人狂配大交3d怪物一区 | 在线视频一区二区免费| 洋洋成人永久网站入口| 538在线一区二区精品国产| 麻豆精品一区二区av白丝在线| 久久欧美中文字幕| 97久久超碰国产精品电影| 一区二区三区四区亚洲| 91.xcao| 国产美女久久久久| 亚洲激情自拍偷拍| 日韩精品一区二区三区中文不卡 | 精品奇米国产一区二区三区| 国产一区二区免费看| 亚洲天天做日日做天天谢日日欢| 在线看不卡av| 黑人精品欧美一区二区蜜桃| 国产精品视频yy9299一区| 在线免费观看成人短视频| 男女男精品视频网| 亚洲色图一区二区| 精品国产电影一区二区| 91丨九色porny丨蝌蚪| 蜜臀久久99精品久久久画质超高清 | 一区二区三国产精华液| 精品少妇一区二区三区在线播放 | 国产精品美日韩| 欧美日韩五月天| 成人精品视频一区二区三区尤物| 亚洲午夜久久久| 国产精品色婷婷| 日韩精品一区二区在线| 在线一区二区三区做爰视频网站| 精品无人码麻豆乱码1区2区 | 欧美中文字幕亚洲一区二区va在线 | 99精品视频一区| 日本色综合中文字幕| 一区二区视频在线看| 久久伊99综合婷婷久久伊| 欧美日韩一区高清| 91蝌蚪porny| 国产成人h网站| 精品一区二区三区香蕉蜜桃 | 欧美韩国日本综合| 91麻豆精品国产91久久久久久| 一本久久a久久免费精品不卡| 国产一区二区三区美女| 日本91福利区| 亚洲成在人线免费| 亚洲在线视频网站| 亚洲精品视频免费观看| 亚洲欧洲精品一区二区三区不卡| 2017欧美狠狠色| 欧美精品一区二区在线播放| 欧美一区二区三区公司| 欧美日韩成人一区| 欧美人伦禁忌dvd放荡欲情| 在线观看国产91| 在线视频欧美精品| 欧美性感一类影片在线播放| 色天使久久综合网天天| 色老头久久综合| 在线亚洲精品福利网址导航| 91国产丝袜在线播放| 色哟哟日韩精品| 日本道免费精品一区二区三区| 99riav一区二区三区| 97精品国产露脸对白| 色综合久久九月婷婷色综合| 91在线观看下载| 色老汉av一区二区三区| 欧美在线综合视频| 欧美日韩国产高清一区二区三区| 欧美日本精品一区二区三区| 欧美一区二区三区视频在线| 欧美一二三区在线| 久久麻豆一区二区| 中文字幕亚洲成人| 一区二区三区欧美亚洲| 亚洲国产精品久久人人爱| 日韩极品在线观看| 久久精品99国产精品日本| 国模套图日韩精品一区二区| 国产成人av一区二区三区在线| av福利精品导航| 欧美日韩精品一区视频| 日韩免费视频线观看| 国产清纯白嫩初高生在线观看91 | 韩国三级在线一区| 国产成人小视频| 日本韩国一区二区三区视频| 欧美精品日日鲁夜夜添| 日韩欧美在线网站| 国产精品午夜在线| 五月婷婷激情综合网| 精品在线播放午夜| 色综合久久综合网欧美综合网 | 91视频免费看| 欧美高清性hdvideosex| 精品国产91洋老外米糕| 国产精品灌醉下药二区| 日本特黄久久久高潮| 成人v精品蜜桃久久一区| 欧美美女网站色| 欧美激情综合网| 日本在线观看不卡视频| av电影天堂一区二区在线 | 麻豆精品国产91久久久久久| 国产成人免费视频网站| 欧美日本乱大交xxxxx| 中文字幕 久热精品 视频在线 | 亚洲精品国产无套在线观| 看电视剧不卡顿的网站| 99热国产精品| 久久先锋资源网| 视频一区国产视频| 91视频www| 国产欧美日韩综合| 免费在线一区观看| 在线免费精品视频| 国产精品视频免费看| 久久 天天综合| 欧美日韩一区在线观看| 亚洲欧洲国产专区| 国产一区二区三区四区五区入口| 欧美色综合天天久久综合精品| 国产精品污www在线观看| 老司机免费视频一区二区三区| 欧美性受极品xxxx喷水| 日韩一区欧美一区| 粉嫩久久99精品久久久久久夜| 欧美成人伊人久久综合网| 亚洲成av人片观看| 色婷婷综合久久久中文字幕| 国产精品欧美久久久久无广告| 国产曰批免费观看久久久| 日韩色视频在线观看| 天天亚洲美女在线视频| 精品视频1区2区| 亚洲国产一区二区在线播放| 色综合天天综合色综合av| 中文字幕在线播放不卡一区| 高清国产午夜精品久久久久久| 精品国产乱子伦一区| 久草这里只有精品视频| 亚洲精品在线免费播放| 激情综合色丁香一区二区| 亚洲精品一区二区三区蜜桃下载| 久久精品国产亚洲a|