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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? analyze.cpp

?? 編譯原理學(xué)習(xí)使用的代碼 內(nèi)容有從詞法分析到中間代碼生成的代碼 并且含有注釋
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/****************************************************/
/* 文件 analyze.cpp				  					*/
/* 說明 類PASCAL語言編譯器語義分析程序  			*/
/* 主題 編譯器結(jié)構(gòu):原理和實(shí)例						*/	
/****************************************************/

/***********  該文件所包含的頭文件  ****************/

#include "globals.h"	

#include "util.h"

#include "symbTable.h"		

#include "scanner.h"	

#include "parse.h"

#include "analyze.h"		

#include "string.h"

/*scope棧的層數(shù)*/
int Level=-1;

/*在同層的變量偏移*/
int Off;

/*主程序的noff偏移*/
int mainOff;


SymbTable * scope[SCOPESIZE];   /*scope棧*/

TypeIR * intPtr = NULL;			/*該指針一直指向整數(shù)類型的內(nèi)部表示*/

TypeIR * charPtr = NULL;		/*該指針一直指向字符類型的內(nèi)部表示*/
	
TypeIR * boolPtr = NULL;		/*該指針一直指向布爾類型的內(nèi)部表示*/

static TypeIR * arrayVar(TreeNode * t);
								/*該函數(shù)用于處理數(shù)組類型變量*/

static TypeIR * recordVar(TreeNode * t);
								/*該函數(shù)用于處理記錄類型變量*/

/***********************類型處理*****************************/



/*************************************************************/
/* 函數(shù)名  initialize                                        */
/* 功  能  該函數(shù)初始化整數(shù)類型,字符類型,布爾類型的內(nèi)部表示*/
/* 說  明  由于這三種類型均為基本類型,內(nèi)部表示固定。        */
/*************************************************************/
void initialize(void)
{
	intPtr = NewTy(intTy);

	charPtr = NewTy(charTy);

	boolPtr = NewTy(boolTy);

    /*scope棧的各層指針設(shè)為空*/
	for (int i=0;i<SCOPESIZE;i++)
		scope[i] = NULL;
}

/************************************************************/
/* 函數(shù)名  TypeProcess                                      */
/* 功  能  該函數(shù)用來完成類型分析的工作                     */
/* 說  明  處理語法樹的當(dāng)前結(jié)點(diǎn)類型。構(gòu)造出當(dāng)前類型的內(nèi)部表 */
/*         示,并將其地址返回給Ptr類型內(nèi)部表示的地址.       */
/************************************************************/
TypeIR  * TypeProcess(TreeNode * t,DecKind deckind)
{
	TypeIR  *  Ptr = NULL;
	switch (deckind)
	{
	case IdK:  
		Ptr = nameType(t);break;         /*類型為自定義標(biāo)識符*/
	case ArrayK:
		Ptr = arrayType(t);break;        /*類型為數(shù)組類型*/
	case RecordK:
		Ptr = recordType(t);break;       /*類型為記錄類型*/
	case IntegerK:
		Ptr = intPtr;break;              /*類型為整數(shù)類型*/
	case CharK:
		Ptr = charPtr;break;             /*類型為字符類型*/
	}
	return Ptr;
}


/************************************************************/
/* 函數(shù)名  nameType                                         */
/* 功  能  該函數(shù)用來在符號表中尋找已定義的類型名字         */
/* 說  明  調(diào)用尋找表項(xiàng)地址函數(shù)FindEntry,返回找到的表項(xiàng)地址*/
/*		   指針entry。如果present為FALSE,則發(fā)生無聲明錯(cuò)誤。*/
/*         如果符號表中的該標(biāo)識符的屬性信息不是類型,則非類 */
/*         型標(biāo)識符。該函數(shù)返回指針指向符號表中的該標(biāo)識符的 */
/*	       類型內(nèi)部表示。								    */
/************************************************************/
TypeIR * nameType(TreeNode * t)
{
	TypeIR * Ptr=NULL;
	SymbTable * entry = NULL;
	int present;


	/*類型標(biāo)識符也需要往前層查找*/
	present = FindEntry(t->attr.type_name,&entry);
								
	if(present == TRUE)
	{
		/*檢查該標(biāo)識符是否為類型標(biāo)識符*/
		if(entry->attrIR.kind != typeKind)
			ErrorPrompt(t->lineno,t->attr.type_name,"used before typed!\n");
		else
			Ptr = entry->attrIR.idtype;
	}
	else/*沒有找到該標(biāo)識符*/
	{
		ErrorPrompt(t->lineno,t->attr.type_name,"type name is not declared!\n");
	}
	return Ptr;
}

/************************************************************/
/* 函數(shù)名  arrayType                                        */
/* 功  能  該函數(shù)處理數(shù)組類型的內(nèi)部表示                     */
/* 說  明  類型為數(shù)組類型時(shí),需要檢查下標(biāo)是否合法。         */
/************************************************************/
TypeIR  * arrayType(TreeNode * t)
{
	TypeIR  * Ptr0 = NULL;
	TypeIR  * Ptr1 = NULL;
	TypeIR  * Ptr = NULL;

    /*檢查數(shù)組上界是否小于下界*/
	if ((t->attr.ArrayAttr.low)>( t->attr.ArrayAttr.up))
	{
		ErrorPrompt(t->lineno,"","array subscript error!\n");
		Error = TRUE;
	}
	else
	{
		Ptr0 = TypeProcess(t,IntegerK);			
								/*調(diào)用類型分析函數(shù),處理下標(biāo)類型*/
		Ptr1 = TypeProcess(t,t->attr.ArrayAttr.childtype);
								/*調(diào)用類型分析函數(shù),處理元素類型*/
		Ptr = NewTy(arrayTy);    
								/*指向一新創(chuàng)建的類型信息表*/
		Ptr->size = ((t->attr.ArrayAttr.up)-(t->attr.ArrayAttr.low)+1)*(Ptr1->size);
								/*計(jì)算本類型長度*/

		/*填寫其他信息*/
		Ptr->More.ArrayAttr.indexTy = Ptr0;
		Ptr->More.ArrayAttr.elemTy = Ptr1;
		Ptr->More.ArrayAttr.low = t->attr.ArrayAttr.low;
		Ptr->More.ArrayAttr.up = t->attr.ArrayAttr.up;
	}
	return Ptr;				
}


/************************************************************/
/* 函數(shù)名  recordType                                       */
/* 功  能  該函數(shù)處理記錄類型的內(nèi)部表示                     */
/* 說  明  類型為記錄類型時(shí),是由記錄體組成的。其內(nèi)部節(jié)點(diǎn)需 */
/*		   要包括3個(gè)信息:一是空間大小size;二是類型種類標(biāo)志 */
/*		   recordTy;三是體部分的節(jié)點(diǎn)地址body。記錄類型中的  */
/*		   域名都是標(biāo)識符的定義性出現(xiàn),因此需要記錄其屬性。 */
/************************************************************/	
TypeIR * recordType(TreeNode * t)
{
	TypeIR  * Ptr=NewTy(recordTy);  /*新建記錄類型的節(jié)點(diǎn)*/
	
	t = t->child[0];                /*從語法數(shù)的兒子節(jié)點(diǎn)讀取域信息*/


    fieldChain  *  Ptr2 = NULL;
	fieldChain  *  Ptr1 = NULL;

	fieldChain  *  body = NULL;

	while (t != NULL)				/*循環(huán)處理*/
	{
		/*填寫ptr2指向的內(nèi)容節(jié)點(diǎn)*
		 *此處循環(huán)是處理此種情況int a,b; */
		for(int i=0 ; i < t->idnum ; i++)
		{     
			/*申請新的域類型單元結(jié)構(gòu)Ptr2*/  
	        Ptr2 = NewBody();            
			if(body == NULL)
				body = Ptr1 = Ptr2;
			
			/*填寫Ptr2的各個(gè)成員內(nèi)容*/
			strcpy(Ptr2->id,t->name[i]);
			Ptr2->UnitType = TypeProcess(t,t->kind.dec);
			
			Ptr2->Next = NULL;			 
	    
			/*如果Ptr1!=Ptr2,那么將指針后移*/
			if(Ptr2 != Ptr1)          
			{
				/*計(jì)算新申請的單元off*/
				Ptr2->off = (Ptr1->off) + (Ptr1->UnitType->size);
				Ptr1->Next = Ptr2;
				Ptr1 = Ptr2;
			}
		}
		/*處理完同類型的變量后,取語法樹的兄弟節(jié)點(diǎn)*/
		t = t->sibling;
	}
	
	/*處理記錄類型內(nèi)部結(jié)構(gòu)*/
	
	/*取Ptr2的off為最后整個(gè)記錄的size*/
	Ptr->size = Ptr2->off + (Ptr2->UnitType->size);
	/*將域鏈鏈入記錄類型的body部分*/   
    Ptr->More.body = body;   

	return Ptr;
}



/************************************************************/



/*********************聲明的語義分析*************************/

/************************************************************/
/* 函數(shù)名  TypeDecPart                                      */
/* 功  能  該函數(shù)處理類型聲明的語義分析                     */
/* 說  明  遇到類型T時(shí),構(gòu)造其內(nèi)部節(jié)點(diǎn)TPtr;對于"idname=T"構(gòu)*/
/*		   造符號表項(xiàng);檢查本層類型聲明中是否有重復(fù)定義錯(cuò)誤.*/
/************************************************************/
void TypeDecPart(TreeNode * t)
{
	int present = FALSE;

	AttributeIR  attrIr;

	SymbTable * entry = NULL;
	
	/*添屬性作為參數(shù)*/
	attrIr.kind = typeKind; 
		
	/*遍歷語法樹的兄弟節(jié)點(diǎn)*/
	while (t!=NULL)   
	{
		/*調(diào)用記錄屬性函數(shù),返回是否重復(fù)聲明錯(cuò)和入口地址*/
		present = Enter(t->name[0],&attrIr,&entry);	
	
		if (present!=FALSE)
		{
			ErrorPrompt(t->lineno,t->name[0],"is repetation declared!\n");
			entry = NULL;
		}
		else 
			entry->attrIR.idtype = TypeProcess(t,t->kind.dec);
		t = t->sibling;
	}
}


/************************************************************/
/* 函數(shù)名  VarDecPart                                       */
/* 功  能  該函數(shù)處理變量聲明的語義分析                     */
/* 說  明  調(diào)用變量處理分析函數(shù)                             */
/************************************************************/
void VarDecPart(TreeNode * t)
{
	 varDecList(t);
}

/************************************************************/
/* 函數(shù)名  varDecList                                       */
/* 功  能  該函數(shù)處理變量聲明的語義分析                     */
/* 說  明  當(dāng)遇到變量表識符id時(shí),把id登記到符號表中;檢查重 */
/*         復(fù)性定義;遇到類型時(shí),構(gòu)造其內(nèi)部表示。           */
/************************************************************/
void  varDecList(TreeNode * t)
{
	AttributeIR  attrIr;
	int present = FALSE;

	SymbTable * entry = NULL;
	
	while(t!=NULL)	/*循環(huán)過程*/
	{
		attrIr.kind = varKind;
		for(int i=0;i<(t->idnum);i++)
		{
			attrIr.idtype = TypeProcess(t,t->kind.dec);
			
			/*判斷識值參還是變參acess(dir,indir)*/	
			if(t->attr.ProcAttr.paramt == varparamType)
			{
				attrIr.More.VarAttr.access = indir;
				attrIr.More.VarAttr.level = Level;
				/*計(jì)算形參的偏移*/
				
				attrIr.More.VarAttr.off = Off;
				Off = Off+1;
			}/*如果是變參,則偏移加1*/

			else
			{
				attrIr.More.VarAttr.access = dir;
				attrIr.More.VarAttr.level = Level;
				/*計(jì)算值參的偏移*/
				if(attrIr.idtype!=NULL)
				
				{
					attrIr.More.VarAttr.off = Off;
					Off = Off + (attrIr.idtype->size);
				}
			}/*其他情況均為值參,偏移加變量類型的size*/
			
			/*登記該變量的屬性及名字,并返回其類型內(nèi)部指針*/
			present = Enter(t->name[i],&attrIr,&entry);	
			if(present!=FALSE)
			{
				ErrorPrompt(t->lineno,t->name[i]," is defined repetation!\n");
			}
			else
				t->table[i] = entry;

		}
		if(t!=NULL)
			t = t->sibling;
	}
	
	/*如果是主程序,則記錄此時(shí)偏移,用于目標(biāo)代碼生成時(shí)的displayOff*/
	if(Level==0)
	{
		mainOff = Off;
		/*存儲主程序AR的display表的偏移到全局變量*/
		StoreNoff = Off;
	}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一色屋精品亚洲香蕉网站| 日精品一区二区三区| 日韩中文字幕区一区有砖一区 | 成人性生交大片| 在线一区二区三区四区五区| 国产午夜精品久久久久久久| 亚洲一二三专区| 国产+成+人+亚洲欧洲自线| 5858s免费视频成人| 一区二区三区国产豹纹内裤在线| 国产精品一区二区不卡| 日韩情涩欧美日韩视频| 亚洲一区二区三区四区在线免费观看| 国产成人精品免费视频网站| 日韩欧美国产综合| 日本亚洲电影天堂| 欧美日韩国产高清一区二区三区| 亚洲日本成人在线观看| www.欧美亚洲| 中文字幕一区二区三区在线不卡 | 欧美视频精品在线| 一区二区三区在线观看网站| 99精品视频免费在线观看| 中国色在线观看另类| 国产高清亚洲一区| 国产亚洲精品免费| 国产美女娇喘av呻吟久久| 精品国产自在久精品国产| 青娱乐精品在线视频| 欧美一区二区三区色| 日本不卡一区二区三区| 91精品国产一区二区三区蜜臀 | 欧美tickling网站挠脚心| 青青草97国产精品免费观看无弹窗版| 欧美日韩免费电影| 日韩av电影免费观看高清完整版 | 一区二区三区四区在线| 91久久线看在观草草青青| 亚洲一区二区欧美| 欧美精品免费视频| 美国三级日本三级久久99| 日韩欧美国产不卡| 国内精品在线播放| 欧美国产一区在线| 91理论电影在线观看| 亚洲黄色片在线观看| 欧美老肥妇做.爰bbww视频| 首页国产欧美日韩丝袜| 91麻豆精品国产无毒不卡在线观看| 婷婷综合五月天| 精品播放一区二区| 成人精品电影在线观看| 亚洲色图在线播放| 欧美久久久久中文字幕| 国精产品一区一区三区mba视频| 国产欧美一区二区精品忘忧草 | 成人激情开心网| 亚洲主播在线观看| 日韩精品一区二区三区蜜臀| 成人免费视频一区二区| 亚洲高清免费在线| 久久综合久久综合久久综合| 99在线热播精品免费| 亚洲成人免费观看| 久久久不卡网国产精品一区| 色噜噜狠狠成人中文综合| 欧美aⅴ一区二区三区视频| 国产精品视频在线看| 欧美乱妇一区二区三区不卡视频| 国产精品18久久久久| 一区二区三区中文字幕精品精品 | 播五月开心婷婷综合| 午夜精品福利一区二区三区蜜桃| 久久综合成人精品亚洲另类欧美 | 国产精品一区二区黑丝| 亚洲国产成人91porn| 日本一区二区三区国色天香 | 另类欧美日韩国产在线| 中文字幕一区在线观看| 日韩一区二区三区视频| 色综合网色综合| 国产精品一色哟哟哟| 亚洲sss视频在线视频| 国产情人综合久久777777| 欧美高清精品3d| 99久久99久久精品免费观看| 韩国三级在线一区| 日日夜夜精品视频免费| 亚洲精品写真福利| 国产欧美日韩综合| 精品日韩欧美在线| 欧美日产国产精品| 欧美最猛黑人xxxxx猛交| 成人免费视频一区| 国产精品一级黄| 狠狠狠色丁香婷婷综合激情| 青青草91视频| 丝袜亚洲另类丝袜在线| 一区二区三区蜜桃网| 亚洲欧美在线观看| 国产精品免费视频观看| 久久久电影一区二区三区| 欧美成人精品1314www| 制服丝袜在线91| 欧美蜜桃一区二区三区| 欧美日韩视频在线第一区| 欧美主播一区二区三区| 色视频成人在线观看免| 91福利社在线观看| 欧美在线观看视频在线| 欧美视频在线观看一区| 欧美性xxxxxxxx| 精品视频在线视频| 欧美日韩1区2区| 欧美一区二区精品在线| 日韩一区二区在线看片| 精品国产免费视频| 精品久久一区二区| 久久综合精品国产一区二区三区| 精品国产电影一区二区| 欧美精品一区二区三区视频 | 精品少妇一区二区三区日产乱码 | 91免费版pro下载短视频| eeuss鲁片一区二区三区在线观看| 成人美女在线视频| 色综合视频在线观看| 91黄色免费观看| 欧美日韩高清一区二区三区| 欧美日本视频在线| 日韩免费看的电影| 欧美国产亚洲另类动漫| ...中文天堂在线一区| 一区二区高清在线| 麻豆一区二区三区| 国产91精品久久久久久久网曝门| av亚洲精华国产精华精| 在线精品视频一区二区| 日韩小视频在线观看专区| 国产视频一区在线观看| 亚洲男人都懂的| 日本电影亚洲天堂一区| 欧美日本精品一区二区三区| 91麻豆精品国产91久久久使用方法 | 一区二区三区中文在线| 婷婷综合五月天| 国产精品99久久久久久宅男| 91丨porny丨户外露出| 这里只有精品电影| 久久精品免费在线观看| 一区二区三区在线视频免费| 久久精品国产亚洲一区二区三区 | 在线免费观看日本欧美| 日韩精品一区二区三区视频播放 | 日韩成人免费电影| 偷拍自拍另类欧美| 高清免费成人av| 欧美久久一区二区| 亚洲国产精品二十页| 亚洲国产精品一区二区尤物区| 国产在线国偷精品产拍免费yy| 色综合久久久久综合99| 精品va天堂亚洲国产| 亚洲小少妇裸体bbw| 国产91丝袜在线播放| 在线播放中文字幕一区| 中文字幕一区二区三区不卡在线 | 美女一区二区三区| 日本精品免费观看高清观看| 久久久亚洲国产美女国产盗摄| 亚洲成人av资源| 色综合久久久久综合| 国产日本亚洲高清| 久久99国产精品麻豆| 在线一区二区三区| 国产精品私房写真福利视频| 久久成人av少妇免费| 欧美日韩成人激情| 亚洲一线二线三线视频| a4yy欧美一区二区三区| 国产免费久久精品| 精品在线一区二区三区| 在线观看91av| 亚洲123区在线观看| 欧美亚一区二区| 亚洲综合丁香婷婷六月香| 91小视频在线观看| 国产精品嫩草99a| 丰满亚洲少妇av| 久久精品视频免费| 国产1区2区3区精品美女| 久久精品一区八戒影视| 国产电影一区二区三区| 欧美精品一区二| 国产一区二区三区在线观看免费| 日韩精品一区二区三区四区视频| 蜜臀久久久99精品久久久久久| 欧美一区二区精美| 欧美本精品男人aⅴ天堂| 在线观看国产一区二区| 中文字幕一区av|