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

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

?? analyze.cpp

?? 編譯原理學(xué)習(xí)使用的代碼 內(nèi)容有從詞法分析到中間代碼生成的代碼 并且含有注釋
?? CPP
?? 第 1 頁 / 共 3 頁
字號(hào):
	/*如果不是主程序,則記錄此時(shí)偏移,用于下面填寫過程信息表的noff信息*/ 
	else 
		savedOff = Off;
	
}

/************************************************************/
/* 函數(shù)名  procDec                                      */
/* 功  能  該函數(shù)處理過程聲明的語義分析                     */
/* 說  明  在當(dāng)前層符號(hào)表中填寫過程標(biāo)識(shí)符的屬性;在新層符號(hào) */
/*         表中填寫形參標(biāo)識(shí)符的屬性。						*/
/************************************************************/
void  procDecPart(TreeNode * t)
{
		TreeNode * p =t;
		SymbTable * entry = HeadProcess(t);   /*處理過程頭*/
		
		t = t->child[1];
		/*如果過程內(nèi)部存在聲明部分,則處理聲明部分*/	
		while (t!=NULL) 
		{
			switch ( t->nodekind ) 
			{ 
				case  TypeK:     TypeDecPart(t->child[0]);  break ;
				case  VarK :     VarDecPart(t->child[0]);   break ;

				/*如果聲明部分有函數(shù)聲明,則跳出循環(huán),先填寫noff和moff等信息,*
				 *再處理函數(shù)聲明的循環(huán)處理,否則無法保存noff和moff的值。      */
				case  ProcDecK:  break;
				default:
					ErrorPrompt(t->lineno,"","no this node kind in syntax tree!");
					break;
			}
			if(t->nodekind==ProcDecK)
				break;
			else
				t=t->sibling ;
		}
		entry->attrIR.More.ProcAttr.nOff = savedOff;
		entry->attrIR.More.ProcAttr.mOff = entry->attrIR.More.ProcAttr.nOff + entry->attrIR.More.ProcAttr.level+1;
		/*過程活動(dòng)記錄的長度等于nOff加上display表的長度*
		 *diplay表的長度等于過程所在層數(shù)加一           */

		/*處理程序的聲明部分*/
		while(t!=NULL)
		{
			procDecPart(t);
			t = t->sibling;
		}
		t = p;
		Body(t->child[2]);/*處理Block*/

		/*函數(shù)部分結(jié)束,刪除進(jìn)入形參時(shí),新建立的符號(hào)表*/
    	if ( Level!=-1)
	    	DestroyTable();/*結(jié)束當(dāng)前scope*/
}


/************************************************************/
/* 函數(shù)名  HeadProcess                                      */
/* 功  能  該函數(shù)處理函數(shù)頭的語義分析                       */
/* 說  明  在當(dāng)前層符號(hào)表中填寫函數(shù)標(biāo)識(shí)符的屬性;在新層符號(hào) */
/*         表中填寫形參標(biāo)識(shí)符的屬性。其中過程的大小和代碼都 */
/*         需以后回填。                                     */
/************************************************************/
SymbTable  *  HeadProcess(TreeNode * t)
{
	AttributeIR attrIr ;
	int present = FALSE;
	SymbTable  * entry = NULL;
		
	/*填屬性*/
	attrIr.kind = procKind;
	attrIr.idtype = NULL; 
    attrIr.More.ProcAttr.level = Level+1;	
	
	if(t!=NULL)
	{
		/*登記函數(shù)的符號(hào)表項(xiàng)*/		
		present = Enter(t->name[0],&attrIr,&entry);
		t->table[0] = entry;
		/*處理形參聲明表*/
	}
	entry->attrIR.More.ProcAttr.param = ParaDecList(t);

	return entry;
}

/************************************************************/
/* 函數(shù)名  ParaDecList                                      */
/* 功  能  該函數(shù)處理函數(shù)頭中的參數(shù)聲明的語義分析           */
/* 說  明  在新的符號(hào)表中登記所有形參的表項(xiàng),構(gòu)造形參表項(xiàng)的 */
/*         地址表,并有para指向其。                         */
/************************************************************/
ParamTable  * ParaDecList(TreeNode * t) 
{
	TreeNode * p = NULL;
	ParamTable  * Ptr1 = NULL; 
	ParamTable  * Ptr2 = NULL;
	ParamTable  * head = NULL;
	
	if(t!=NULL)
	{
		if(t->child[0]!=NULL)
			p = t->child[0];   	/*程序聲明節(jié)點(diǎn)的第一個(gè)兒子節(jié)點(diǎn)*/
	
		CreatTable();			/*進(jìn)入新的局部化區(qū)*/

		Off = 7;                /*子程序中的變量初始偏移設(shè)為8*/

		VarDecPart(p);			/*變量聲明部分*/

		SymbTable * Ptr0 = scope[Level];      		 
                                    
		while(Ptr0 != NULL)         /*只要不為空,就訪問其兄弟節(jié)點(diǎn)*/
		{
			/*構(gòu)造形參符號(hào)表,并使其連接至符號(hào)表的param項(xiàng)*/
			Ptr2 = NewParam();
			if(head == NULL)
				head = Ptr1 = Ptr2;
			//Ptr0->attrIR.More.VarAttr.isParam = true;
			Ptr2->entry = Ptr0;
			Ptr2->next = NULL;
			
			if(Ptr2 != Ptr1)          
			{
				Ptr1->next = Ptr2;
				Ptr1 = Ptr2;
			}
			Ptr0 = Ptr0->next;
		}
	}
	return head;   /*返回形參符號(hào)表的頭指針*/
}


/*******************執(zhí)行體部分的語義分析*********************/

/************************************************************/
/* 函數(shù)名  Body                                             */
/* 功  能  該函數(shù)處理執(zhí)行體部分的語義分析                   */
/* 說  明  TINY編譯系統(tǒng)的執(zhí)行體部分即為語句序列,故只需處理 */
/*         語句序列部分。                                   */
/************************************************************/
void Body(TreeNode * t)
{
	if (t->nodekind==StmLK)
	{
		TreeNode * p = t->child[0];
		while(p != NULL)
		{
			statement (p);  /*調(diào)用語句狀態(tài)處理函數(shù)*/
			p=p->sibling;   /*依次讀入語法樹語句序列的兄弟節(jié)點(diǎn)*/
		}
	}
}


/************************************************************/
/* 函數(shù)名  statement                                        */
/* 功  能  該函數(shù)處理語句狀態(tài)                               */
/* 說  明  根據(jù)語法樹節(jié)點(diǎn)中的kind項(xiàng)判斷應(yīng)該轉(zhuǎn)向處理哪個(gè)語句 */
/*         類型函數(shù)。                                       */
/************************************************************/	
void statement (TreeNode * t)
{
	switch(t->kind.stmt)
	{
		case IfK:			ifstatment(t); break;
		case WhileK:		whilestatement(t); break;
		case AssignK:		assignstatement(t); break;
		case ReadK:		    readstatement(t); break;
		case WriteK:		writestatement(t);break;
		case CallK:		    callstatement(t); break;
		case ReturnK:		returnstatement(t); break;
		default :
			ErrorPrompt(t->lineno,"","statement type error!\n");
			break;
	}
}

/************************************************************/
/* 函數(shù)名  Expr                                             */
/* 功  能  該函數(shù)處理表達(dá)式的分析                           */
/* 說  明  表達(dá)式語義分析的重點(diǎn)是檢查運(yùn)算分量的類型相容性, */
/*         求表達(dá)式的類型。其中參數(shù)Ekind用來表示實(shí)參是變參  */
/*         還是值參。    	                                */
/************************************************************/
TypeIR * Expr(TreeNode * t,AccessKind  *  Ekind)
{
	int present = FALSE;
	SymbTable * entry = NULL;

	TypeIR * Eptr0 = NULL;
	TypeIR * Eptr1 = NULL;
	TypeIR * Eptr = NULL;
	if(t!=NULL)
    switch(t->kind.exp)
	{
		case ConstK:
			Eptr = TypeProcess (t,IntegerK);
		    Eptr->kind = intTy;
			if(Ekind!=NULL)
				(*Ekind ) = dir;   /*直接變量*/ 
			break;
		case VariK:
		    /*Var = id的情形*/
			if(t->child[0]==NULL)
			{	
				/*在符號(hào)表中查找此標(biāo)識(shí)符*/
				present = FindEntry(t->name[0],&entry);				
				t->table[0] = entry;

				if(present!=FALSE)
				{   /*id不是變量*/
					if (FindAttr(entry).kind!=varKind)
					{
					 ErrorPrompt(t->lineno,t->name[0],"is not variable error!\n");				
					 Eptr = NULL;
					}
					else
					{
						Eptr = entry->attrIR.idtype;	
						if (Ekind!=NULL)
							(*Ekind) = indir;  /*間接變量*/
						
					}
				} 
				else /*標(biāo)識(shí)符無聲明*/
				{
					ErrorPrompt(t->lineno,t->name[0],"is not declarations!\n");
				}
				
			}
		    else/*Var = Var0[E]的情形*/
			{	if(t->attr.ExpAttr.varkind==ArrayMembV)
					Eptr = arrayVar(t);	
				else /*Var = Var0.id的情形*/
					if(t->attr.ExpAttr.varkind==FieldMembV)
						Eptr = recordVar(t);
			}
			break;
		case OpK:
			/*遞歸調(diào)用兒子節(jié)點(diǎn)*/
			Eptr0 = Expr(t->child[0],NULL);
			if(Eptr0==NULL)
				return NULL;
			Eptr1 = Expr(t->child[1],NULL);
			if(Eptr1==NULL)
				return NULL;
							
			/*類型判別*/
			present = Compat(Eptr0,Eptr1);
			if ( present != FALSE )
			{
				switch(t->attr.ExpAttr.op)
				{
					case LT:
					case EQ:
						Eptr = boolPtr;
						break;  /*條件表達(dá)式*/
					case PLUS:
					case MINUS:
					case TIMES:
					case OVER:
						Eptr = intPtr;
						break;  /*算數(shù)表達(dá)式*/
				}
				if(Ekind !=NULL)
					(*Ekind) = dir; /*直接變量*/
			}
			else 
				ErrorPrompt(t->lineno,"","operator is not compat!\n");
			break;
	}
	return Eptr;
}			


/************************************************************/
/* 函數(shù)名  arrayVar                                         */
/* 功  能  該函數(shù)處理數(shù)組變量的下標(biāo)分析                     */
/* 說  明  檢查var := var0[E]中var0是不是數(shù)組類型變量,E是不*/
/*         是和數(shù)組的下標(biāo)變量類型匹配。                     */
/************************************************************/
TypeIR * arrayVar(TreeNode * t)
{
	int present = FALSE;
	SymbTable * entry = NULL;

	TypeIR * Eptr0 = NULL;
	TypeIR * Eptr1 = NULL;
	TypeIR * Eptr = NULL;
	
	
	/*在符號(hào)表中查找此標(biāo)識(shí)符*/

	present = FindEntry(t->name[0],&entry);				
	t->table[0] = entry;	
	/*找到*/
	if(present!=FALSE)
	{
		/*Var0不是變量*/
		if (FindAttr(entry).kind!=varKind)
		{
			ErrorPrompt(t->lineno,t->name[0],"is not variable error!\n");				
			Eptr = NULL;
		}
		else/*Var0不是數(shù)組類型變量*/
			if(FindAttr(entry).idtype!=NULL)
				if(FindAttr(entry).idtype->kind!=arrayTy)
				{
					ErrorPrompt(t->lineno,t->name[0],"is not array variable error !\n");
					Eptr = NULL;
				}
				else
				{	
					/*檢查E的類型是否與下標(biāo)類型相符*/
					Eptr0 = entry->attrIR.idtype->More.ArrayAttr.indexTy;
					if(Eptr0==NULL)
						return NULL;
					Eptr1 = Expr(t->child[0],NULL);//intPtr;
					if(Eptr1==NULL)
						return NULL;
					present = Compat(Eptr0,Eptr1);
					if(present!=TRUE)
					{
						ErrorPrompt(t->lineno,"","type is not matched with the array member error !\n");
						Eptr = NULL;
					}
					else
						Eptr = entry->attrIR.idtype->More.ArrayAttr.elemTy;
				}
	}
	else/*標(biāo)識(shí)符無聲明*/
		ErrorPrompt(t->lineno,t->name[0],"is not declarations!\n");
	return Eptr;
}


/************************************************************/
/* 函數(shù)名  recordVar                                        */
/* 功  能  該函數(shù)處理記錄變量中域的分析                     */
/* 說  明  檢查var:=var0.id中的var0是不是記錄類型變量,id是 */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩在线免费视频| 肉肉av福利一精品导航| 99在线精品免费| 亚洲天堂精品视频| 8v天堂国产在线一区二区| 麻豆精品视频在线观看免费| 国产亚洲短视频| 成人国产精品视频| 亚洲国产精品久久久久秋霞影院| 在线观看国产日韩| 加勒比av一区二区| 欧美韩日一区二区三区| 在线视频一区二区三区| 激情另类小说区图片区视频区| 国产欧美日韩三级| 欧美日韩精品一区二区三区四区 | 看电视剧不卡顿的网站| 国产午夜精品一区二区三区四区| 成人丝袜视频网| 午夜精品视频一区| 欧美理论片在线| 波多野结衣中文字幕一区二区三区| 午夜电影网亚洲视频| 国产日韩一级二级三级| 欧美午夜一区二区三区| 国产一区视频网站| 日韩激情中文字幕| 久久久久久影视| 91麻豆精品国产91久久久久久久久 | 精品欧美乱码久久久久久 | 久久精品网站免费观看| 欧美日韩国产在线观看| 欧美日韩电影一区| 国产在线麻豆精品观看| 午夜不卡av在线| 18涩涩午夜精品.www| 91精品国产综合久久久久久| 色综合中文综合网| 欧美国产日韩在线观看| 欧美性生活影院| 成人av在线资源网站| 麻豆91小视频| 日本中文一区二区三区| 亚洲精选视频免费看| 日本一区二区成人在线| 精品久久久久香蕉网| 成人免费视频免费观看| 玖玖九九国产精品| 日本不卡不码高清免费观看| 一区二区三区国产精华| 日韩欧美综合在线| 欧美另类一区二区三区| 在线观看欧美黄色| 91日韩一区二区三区| 国产凹凸在线观看一区二区 | 日本不卡的三区四区五区| 亚洲国产婷婷综合在线精品| 一区二区三区免费在线观看| 26uuu另类欧美| 精品福利视频一区二区三区| 精品国产一区二区在线观看| 国产很黄免费观看久久| 捆绑变态av一区二区三区| 日韩电影在线免费观看| 一区二区三区四区蜜桃| 国产精品麻豆欧美日韩ww| 国产精品国产自产拍高清av | 国产+成+人+亚洲欧洲自线| 国产呦精品一区二区三区网站| 久久99最新地址| 青青青伊人色综合久久| 蜜臀av一区二区在线免费观看| 蜜臀久久99精品久久久久久9 | 热久久久久久久| 九九视频精品免费| 国产成人av电影在线| 国产一区二区三区久久悠悠色av| 韩国女主播成人在线| 男人操女人的视频在线观看欧美| 麻豆久久久久久久| 国产91精品一区二区麻豆网站| 99久久精品国产精品久久| 色哟哟日韩精品| 欧洲人成人精品| 91麻豆精品国产自产在线| 欧美日韩久久久一区| 欧美xxxxx牲另类人与| 久久众筹精品私拍模特| 国产精品天天摸av网| 国产欧美日韩中文久久| 亚洲丝袜制服诱惑| 人妖欧美一区二区| 激情综合色综合久久综合| 国产精品一二一区| 91精品福利视频| 日韩你懂的在线观看| 亚洲美女精品一区| 国产精品一区免费在线观看| 欧美三级中文字幕在线观看| 中文字幕高清一区| 久国产精品韩国三级视频| 在线观看视频91| 国产欧美日韩综合精品一区二区| 日韩成人精品在线观看| 99久久精品国产网站| 精品国产sm最大网站免费看| 亚洲一区二区欧美日韩| 国产99久久久久久免费看农村| 欧美日本不卡视频| 亚洲欧美偷拍卡通变态| 国产一区二区三区四区五区入口| 欧美精品一二三| 亚洲欧美日韩久久| 国产999精品久久| 日韩欧美三级在线| 日韩激情视频在线观看| 色狠狠一区二区| 国产欧美一区二区精品婷婷| 久久精品99国产精品日本| 67194成人在线观看| 亚洲一区在线观看网站| 成人18精品视频| 中文字幕国产一区二区| 国产成人综合亚洲网站| 久久这里都是精品| 美国av一区二区| 日韩午夜av电影| 亚洲18色成人| 欧美日韩久久一区| 亚洲一二三四久久| 欧美在线观看视频一区二区三区| 亚洲欧美自拍偷拍| 色综合天天性综合| 亚洲成人精品影院| 欧美亚洲国产一卡| 亚洲国产精品久久久久秋霞影院| 欧美亚洲一区二区三区四区| 亚洲同性gay激情无套| 99精品久久99久久久久| 国产精品美女久久久久aⅴ| 国产成人精品免费| 欧美国产一区视频在线观看| 成人黄色大片在线观看| 国产精品久久久久久久久搜平片 | 久久草av在线| 精品久久久三级丝袜| 狠狠色丁香婷综合久久| 久久香蕉国产线看观看99| 国产自产v一区二区三区c| 久久久久久久久久久久电影| 成人性生交大片免费| 亚洲人成在线观看一区二区| 91成人免费电影| 丝袜a∨在线一区二区三区不卡| 欧美日韩国产影片| 免费在线观看日韩欧美| 欧美成人国产一区二区| 国产乱码精品一区二区三区av | 久久久久久久综合| 成人久久久精品乱码一区二区三区| 国产精品久久综合| 日本久久电影网| 美女一区二区三区| 国产欧美一区二区三区鸳鸯浴| av一本久道久久综合久久鬼色| 亚洲影院理伦片| 精品欧美久久久| 99在线精品免费| 日韩高清不卡在线| 国产欧美一区二区精品性色| 91麻豆免费看片| 美腿丝袜在线亚洲一区| 欧美高清在线一区二区| 欧美综合一区二区三区| 狠狠色丁香婷婷综合久久片| 最新国产精品久久精品| 欧美精品三级在线观看| 国产精品一二三四五| 亚洲综合免费观看高清完整版| 91精品久久久久久久99蜜桃| 国产不卡一区视频| 亚洲成人在线网站| 国产色产综合色产在线视频| 色哟哟欧美精品| 蜜桃av一区二区| 亚洲欧美精品午睡沙发| 欧美成人艳星乳罩| 色综合中文字幕国产| 蜜桃av噜噜一区| 亚洲六月丁香色婷婷综合久久 | 精品国产91亚洲一区二区三区婷婷| 91在线精品一区二区| 蜜臀va亚洲va欧美va天堂| 1区2区3区欧美| 精品1区2区在线观看| 欧美日韩精品欧美日韩精品一| 激情五月激情综合网| 性做久久久久久久免费看| 国产精品麻豆99久久久久久| 日韩手机在线导航|