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

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

?? midcode.cpp

?? 學習編譯原理
?? CPP
?? 第 1 頁 / 共 2 頁
字號:

/****************************************************/
/* 文件 midcode.cpp									*/
/* 說明 TINY編譯器中間代碼生成實現					*/
/****************************************************/

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

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

#include "symbTable.h"

#include "midcode.h"	/* 該頭文件聲明了中間代碼生成文件的界面函數*/


/*臨時變量編號,全局變量,每個過程開始都對TempOffset進行
  初始化,注:所以,不同過程中,可能有編號相同的臨時變量,但是
  由于他們互不相干,所以不會有問題;而且優化部分是對基本塊進行優化,
  每個基本塊最大是一個過程,也不會有問題*/
int  TempOffset ;

/*標號值,全局變量*/
int  Label = 0;

/*指向第一條中間代碼*/
CodeFile  *firstCode = NULL ;

/*指向當前最后一條中間代碼*/
CodeFile  *lastCode = NULL ;

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

CodeFile  *GenMidCode(TreeNode *t);

void	   GenProcDec(TreeNode *t);

void	   GenBody(TreeNode  *t);

void	   GenStatement(TreeNode *t);

void       GenAssignS(TreeNode *t);

ArgRecord *GenVar(TreeNode *t);

ArgRecord *GenArray(ArgRecord *V1arg,TreeNode *t,int low ,int size); 

ArgRecord *GenField(ArgRecord *V1arg,TreeNode *t ,fieldChain *head );		  
 		  
ArgRecord *GenExpr(TreeNode *t);

void	   GenCallS(TreeNode *t );

void	   GenReadS (TreeNode *t );

void	   GenWriteS(TreeNode *t );

void	   GenIfS(TreeNode  *t );

void	   GenWhileS(TreeNode *t);


/********************************************************/
/* 函數名  GenMidCode 	  								*/
/* 功  能  中間代碼生成主函數							*/
/* 說  明  若有過程聲明,調用過程聲明的代碼聲明函數;   */
/*         調用程序體的代碼生成函數						*/
/********************************************************/
CodeFile * GenMidCode(TreeNode *t)
{  
  /*若有過程聲明,調用相應函數,產生過程聲明的中間代碼*/
  TreeNode *t1=t->child[1];
  while (t1!=NULL)
  { if (t1->nodekind==ProcDecK)
       GenProcDec(t1);
    t1=t1->sibling; 
  }
  
  /*display表相對于sp的偏移*/

  ArgRecord *Noff = ARGValue(StoreNoff);

  /*生成主程序入口聲明代碼*/
  CodeFile  *code = GenCode(MENTRY,NULL,NULL,Noff);

  /*初始化臨時變量的開始編號,為臨時變量區的第一個地址*/
  TempOffset = StoreNoff + 1;

  /*調用語句序列的代碼生成函數*/
  GenBody(t->child[2]);

  /*回填主程序的AR的大小到主程序入口中間代碼*/
  int size = TempOffset;
  ArgRecord  *sizeArg = ARGValue(size);
  code->codeR.arg2= sizeArg;

  return (firstCode) ;
}

/****************************************************/
/* 函數名  GenProcDec								*/
/* 功  能  過程聲明中間代碼生成函數					*/
/* 說  明  生成過程入口中間代碼,生成過程體的中間   */
/*		   代碼,生成過程出口的中間代碼				*/	
/****************************************************/
void GenProcDec(TreeNode *t)
{
  
  /*得到過程的入口標號*/
  int ProcEntry = NewLabel( );
  
  /*過程名在符號表中的地址*/
  SymbTable  *Entry = t->table[0];
  /*過程入口標號,回填入節點中*/
  Entry->attrIR.More.ProcAttr.codeEntry = ProcEntry;

  /*過程的display表的偏移量*/
  int noff = Entry->attrIR.More.ProcAttr.nOff;
 
  /*得到過程的層數及其ARG結構*/
  int procLevel = Entry->attrIR.More.ProcAttr.level;
  ArgRecord *levelArg = ARGValue(procLevel);

  
  /*若過程內部仍有過程聲明,調用相應函數,產生過程聲明的中間代碼*/
  TreeNode *t1=t->child[1];
  while (t1!=NULL)
  { if (t1->nodekind==ProcDecK)
       GenProcDec(t1);
    t1=t1->sibling; 
  }

  /*產生過程入口中間代碼*/ 
  ArgRecord  *arg1=ARGLabel(ProcEntry);
  CodeFile *code = GenCode(PENTRY,arg1,NULL,levelArg);
  
  /*初始化臨時變量的開始編號,為過程臨時變量區的第一個地址*/
  TempOffset =  noff + procLevel+1;

  /*調用語句序列的代碼生成函數處理過程體*/
  GenBody(t->child[2]);

  /*得到過程的AR的大小,回填入過程入口中間代碼*/
  int size = TempOffset;
  ArgRecord *sizeArg = ARGValue(size);
  code->codeR.arg2 = sizeArg;

  /*產生過程出口中間代碼*/
  GenCode(ENDPROC,NULL,NULL,NULL);
}

/****************************************************/
/* 函數名  GenBody									*/
/* 功  能  語句序列中間代碼生成函數					*/
/* 說  明  用于處理過程體或者程序體,				*/
/*		   循環處理各個語句							*/	
/****************************************************/
void GenBody(TreeNode  *t)
{  
   TreeNode *t1 = t;
	/*令指針指向第一條語句*/
	if (t1->nodekind==StmLK)
		t1=t1->child[0];

   while (t1!=NULL)
   { /*調用語句處理函數*/
	   GenStatement(t1);
      t1= t1->sibling;
   }
}


/****************************************************/
/* 函數名  GenStatement								*/
/* 功  能  語句處理函數	        					*/
/* 說  明  根據語句的具體類型,分別調用相應的		*/
/*		   語句處理函數								*/
/****************************************************/
void  GenStatement(TreeNode  *t) 
{  
	switch(t->kind.stmt)
	{ case  AssignK :   GenAssignS(t);  break;
	  case  CallK:      GenCallS(t);    break;
	  case  ReadK:      GenReadS(t);    break;
      case  WriteK:     GenWriteS(t);	break;
	  case  IfK :       GenIfS (t);	    break;
	  case  WhileK:  	GenWhileS(t);	break;	
	  case 	ReturnK:    /*直接生成中間代碼*/  	
		                GenCode(RETURNC,NULL,NULL,NULL);
						break;
	  default : break;
    }
}

/****************************************************/
/* 函數名  GenAssignS								*/
/* 功  能  賦值語句處理函數        					*/
/* 說  明  處理左部變量,處理右部表達式,生成       */
/*         賦值語句中間代碼 						*/
/****************************************************/
void  GenAssignS(TreeNode *t)
{   /*調用賦值左部變量的處理函數*/
	ArgRecord *Larg = GenVar(t->child[0]);
    /*調用賦值右部表達式的處理函數*/
	ArgRecord *Rarg = GenExpr(t->child[1]);
    /*生成賦值語句中間代碼*/
    GenCode(ASSIG,Rarg,Larg,NULL);
}

/****************************************************/
/* 函數名  GenVar									*/
/* 功  能  變量處理	函數        					*/
/* 說  明										    */
/****************************************************/
ArgRecord *GenVar(TreeNode *t)
{ 
    int low ,size;
	fieldChain  *head = NULL ;

    /*生成變量名的ARG結構, Entry為標識符在符號表中的地址*/
 	SymbTable  *Entry = t->table[0];
	ArgRecord  *V1arg = ARGAddr(t->name[0],
		                        Entry->attrIR.More.VarAttr.level,
		                        Entry->attrIR.More.VarAttr.off,
								Entry->attrIR.More.VarAttr.access);
    
	/*返回的ARG結構*/
	ArgRecord * Varg = NULL;
    switch(t->attr.ExpAttr.varkind)
	{ /*標識符變量情形*/
	  case IdV: 	Varg = V1arg; break;
	  /*數組成員變量情形*/
	  case ArrayMembV:
		  /*構造數組下屆和數組大小的ARG結構*/
	       low = Entry->attrIR.idtype->More.ArrayAttr.low;
	       size = Entry->attrIR.idtype->More.ArrayAttr.elemTy->size;
		   Varg = GenArray(V1arg, t , low, size);
		   break;
	  /*域變量情形*/    
	  case FieldMembV:
		 	head = Entry->attrIR.idtype->More.body;
			Varg = GenField(V1arg,t ,head);
			break;
	  default : break;
	}
  return (Varg);
}
/****************************************************/
/* 函數名  GenArray									*/
/* 功  能  數組成員變量處理函數    					*/
/* 說  明  由函數GenVar或函數GenField調用		    */
/****************************************************/
      	  
ArgRecord  *GenArray(ArgRecord *V1arg,TreeNode *t,int low ,int size)  		  
{   /*處理下標表達式*/
	ArgRecord *Earg= GenExpr(t->child[0]);

	ArgRecord  *lowArg = ARGValue(low);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av在线播放网址| 久久99精品国产.久久久久久| 精品国产区一区| 91精品国产91久久综合桃花 | 欧美一二三四区在线| 欧美久久一二区| 日韩欧美的一区| 久久久国产精品麻豆| 国产女人18毛片水真多成人如厕 | 欧美一区二区免费| 欧美美女一区二区在线观看| 91精品午夜视频| 91精品国产综合久久精品 | 欧美国产日本视频| 中文字幕一区二区三区蜜月| 亚洲最色的网站| 天堂一区二区在线| 狠狠色丁香婷婷综合| 国产不卡视频一区| 91免费精品国自产拍在线不卡| 欧洲精品在线观看| 精品国产成人系列| 亚洲欧美综合色| 日韩一区精品字幕| 成人性视频网站| 欧美性三三影院| 欧美精品一区二区在线观看| 中文字幕在线播放不卡一区| 视频一区欧美精品| 国产精品99久久久久久久vr| 在线精品视频免费播放| 欧美成人精品3d动漫h| 国产精品传媒在线| 蜜臀av性久久久久蜜臀aⅴ | 日韩影院精彩在线| 国产99一区视频免费| 欧美在线影院一区二区| 精品国产三级电影在线观看| 亚洲另类在线制服丝袜| 国内精品久久久久影院薰衣草| av影院午夜一区| 日韩精品中文字幕一区二区三区| 亚洲欧美日韩在线不卡| 久草精品在线观看| 在线观看欧美日本| 国产精品网站在线播放| 免费一区二区视频| 欧美一a一片一级一片| 欧美国产丝袜视频| 经典三级在线一区| 777午夜精品免费视频| 亚洲你懂的在线视频| 国产一区二区三区综合| 制服丝袜中文字幕亚洲| 亚洲另类在线一区| 99热99精品| 国产欧美日韩激情| 国产在线视视频有精品| 91精品免费在线| 亚洲午夜久久久| 91精品91久久久中77777| 成人免费在线观看入口| 国产成人精品午夜视频免费 | 欧美高清在线视频| 国产精品亚洲专一区二区三区| 制服视频三区第一页精品| 亚洲一区二区三区在线| 色欧美片视频在线观看在线视频| 国产精品国产三级国产有无不卡 | 国产精品午夜电影| 国产一区二区网址| 国产性做久久久久久| 久久 天天综合| 久久一区二区三区四区| 国产一区二区三区高清播放| 精品成人佐山爱一区二区| 日韩二区在线观看| 欧美一级黄色片| 男女男精品视频网| 精品成人一区二区| 成人性生交大片免费| 国产欧美日韩综合精品一区二区| 国产.精品.日韩.另类.中文.在线.播放| 久久综合色播五月| 成人免费视频免费观看| 国产精品久久久久婷婷二区次| 99视频一区二区| 一区二区三区四区不卡在线 | 国产一区亚洲一区| 国产精品嫩草影院com| 91网站在线播放| 亚洲自拍偷拍图区| 日韩网站在线看片你懂的| 麻豆精品视频在线| 日本一二三四高清不卡| 色欧美日韩亚洲| 美女在线一区二区| 国产欧美日韩亚州综合 | 盗摄精品av一区二区三区| 国产精品国产馆在线真实露脸| 欧日韩精品视频| 加勒比av一区二区| 亚洲精品成人在线| 日韩欧美国产系列| 99久久99久久精品免费看蜜桃| 亚洲电影一区二区三区| 久久婷婷成人综合色| 在线观看一区二区视频| 奇米影视在线99精品| 国产精品美女一区二区三区 | 91蜜桃传媒精品久久久一区二区| 亚洲丶国产丶欧美一区二区三区| 精品国产免费人成电影在线观看四季| 成人妖精视频yjsp地址| 污片在线观看一区二区| 中文字幕精品三区| 欧美一区二视频| 成人动漫一区二区在线| 日韩精品电影在线| 亚洲欧洲精品一区二区精品久久久| 欧美一区二区二区| 一本色道久久综合亚洲aⅴ蜜桃| 久久国产精品一区二区| 亚洲一区二区三区在线播放| 中文在线资源观看网站视频免费不卡| 欧美日韩国产另类不卡| 99久久精品免费看国产免费软件| 麻豆精品精品国产自在97香蕉| 亚洲综合色在线| 成人欧美一区二区三区| 久久一夜天堂av一区二区三区| 欧美三级日韩三级国产三级| av一区二区久久| 成人午夜电影网站| 国产一区二区三区在线观看免费 | 色老头久久综合| 国产精品一级二级三级| 久久精品国产一区二区三区免费看| 一区二区在线观看视频在线观看| 久久精品这里都是精品| 精品日韩在线一区| 69p69国产精品| 欧美高清www午色夜在线视频| 日本久久一区二区三区| www.日韩精品| caoporm超碰国产精品| 风间由美中文字幕在线看视频国产欧美| 日本v片在线高清不卡在线观看| 亚洲无线码一区二区三区| 亚洲影院免费观看| 艳妇臀荡乳欲伦亚洲一区| 一区二区三区日韩精品| 亚洲免费在线看| 亚洲综合一区二区精品导航| 亚洲一区二区三区四区在线观看| 亚洲欧美国产77777| 亚洲同性同志一二三专区| 亚洲人被黑人高潮完整版| 一区二区三区日韩精品视频| 一区二区三区av电影| 亚洲成人自拍网| 视频一区在线视频| 韩国一区二区在线观看| 成人在线视频首页| 波多野结衣中文一区| 91久久精品一区二区三区| 欧美久久婷婷综合色| 精品国产乱码91久久久久久网站| www国产精品av| 国产精品久久久久精k8| 亚洲综合另类小说| 另类的小说在线视频另类成人小视频在线| 久久精品噜噜噜成人88aⅴ| 国产999精品久久久久久 | 亚洲不卡在线观看| 男人的j进女人的j一区| 国产激情91久久精品导航| 91尤物视频在线观看| 91精品婷婷国产综合久久性色| 久久久综合网站| 亚洲一区在线观看网站| 国内成人精品2018免费看| 99在线精品视频| 欧美一区二区三区视频在线| 国产欧美日韩精品在线| 亚洲午夜电影在线观看| 激情久久五月天| 在线观看91视频| 国产亚洲欧美日韩日本| 亚洲一区二区3| 国产黄色91视频| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 亚洲色图丝袜美腿| 麻豆精品一二三| 色婷婷久久久亚洲一区二区三区| 精品国产一区二区三区不卡| 一区二区视频免费在线观看| 国产一区二区美女诱惑| 欧美高清视频一二三区| 亚洲欧美日韩国产一区二区三区|