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

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

?? analyze.cpp

?? 內含源代碼和編譯實驗報告
?? CPP
字號:
/******************************************************************
** 文件名: analyze.cpp

** 描  述: 這是一個完整的語義分析器,實現C-語言的語義分析功能。基本的
**         流程是:先建立一個空符號表,再建一個語法分析器,語法分析器會
**         產生一棵對于源程序的語法樹,再把語法樹中的源程序中的函數名,
**         變量名及它們的作用域,所在行數等等信息存儲在符號表中,建立
**         完畢后,再對語法樹進行后序遍歷執行語言語義檢查,主要是表達式
**         類型匹配檢查,變量有效性檢查,函數及變量作用域檢查。函數返
**         類型正確性檢查,函數調用時的參數表檢查。
**             C-的所有符號都是有作用域的, 但goto語句突破了這個限制,
**         所以,必須為goto語句單獨執行第二遍語義分析。
******************************************************************/
#include "globals.h"
#include "ExternGla"
#include "scan.h"
#include "prase.h"
#include "symtab.h"
#include "analyze.h"

/*********************************************************
**靜態成員變量的聲明。
*******************************************************/
int Canalyzer::m_ilocation=1;				//記錄變量或函數名出現的順序(占的內存位置)
Csymboltab*	Canalyzer::m_Csymtab;			//符號表。
CTreeNode	*Canalyzer::m_syntaxTree;		//語法樹。
CPraser		*Canalyzer::m_pPraser;			//語法分析器。
int			Canalyzer::m_ilineno;
int			Canalyzer::m_ierror=0;

/********************************************
**構造函數,完成語義分析器的所有功能。
********************************************/
Canalyzer::Canalyzer(){
	try{
		m_Csymtab = new Csymboltab;
		CPraser *m_pPraser=new CPraser;
		m_syntaxTree=m_pPraser->m_program;
		cout<<"Building Symbol Table..."<<endl;
		buildSymtab(m_syntaxTree);				//根據語法樹建立完整的符號表。
		if(AllFlags.m_iTraceAnalyze){
			cout<<"\nSmybol table:\n\n";
			m_Csymtab->printSymtab();}
		cout<<"Checkint Types..."<<endl;
		typeCheck(m_syntaxTree);				//執行語義檢查。
		if(m_ierror==1) exit(0);				//有錯誤存在,代碼生成被阻止。
	}
	catch (bad_alloc){										//處理堆分配異常。
		cout<<"Can't be allocated in heap, the programme must be terminated."<<endl;
		exit(1);}
	catch (...){
		cout<<"Something error,the program was terminated.";
		exit(1);}
}

Canalyzer::~Canalyzer(){
	delete m_pPraser;
	delete m_Csymtab;
}

/*******************************************************
**先序遍歷語法樹完成符號表的創建(當preProc=insertNode,postProc=nullProc時)
**后序遍符號表完成語義分析。(當preProc=nullProc,postProc=checdNode時)
**********************************************************/
void Canalyzer::traverse(CTreeNode* t, void(* preProc)(CTreeNode *),
										void(* postProc)(CTreeNode *)){
	if(t!= NULL){
		preProc(t);
		for(int i=0;i<3;i++)
			traverse(t->m_pchild[i],preProc,postProc);
		postProc(t);
		traverse(t->m_pbrother,preProc,postProc);
	}
}

/**********************************************
**空函數,不執行任何功能,主要是為輔助traverse
************************************************/
void Canalyzer::nullProc(CTreeNode *t){
	return;
}

/***********************************************
**向符號表中插入一個變量或函數名。
***********************************************/
void Canalyzer::insertNode(CTreeNode *t){
	switch(t->m_Ennodekind){
		case FuncK:
			if(m_Csymtab->st_lookup(t->m_strIDname,t->m_strScope)==-1)
				m_Csymtab->st_insert(t->m_strIDname, t->m_strScope, 
								t->m_EnTypevalue,t->m_ilineno, m_ilocation++);
			else{						//函數定義不可能兩次出現,否則為重定義。
				cout<<"Error in line "<<t->m_ilineno<<": function: '"
									<<t->m_strIDname<<"'"<<" : redefinition"<<endl;
				m_ierror=1;}
			break;
		case DeclK:
		case ParaK:
			if(m_Csymtab->st_lookup(t->m_strIDname,t->m_strScope)==-1)
				m_Csymtab->st_insert(t->m_strIDname, t->m_strScope, t->m_EnTypevalue,
											t->m_ilineno, m_ilocation++);
			else{	//同一變量的定義在同一作用域內也不能兩次出現,否則為重定義。
				cout<<"Error in line "<<t->m_ilineno<<": '"<<t->m_strIDname
												<<"'"<<" : redefinition"<<endl;
				m_ierror=1;}
			break;
		case ExpK:
			switch(t->kind.m_EnExpKind){
				case IdK:
					if(t->m_pfather->m_Ennodekind==StmtK && t->m_pfather
														->kind.m_EnStmtKind==GotoK)
							break;			//對goto的地址符號將在第二遍進行處理。
					if(m_Csymtab->st_lookup(t->m_strIDname,t->m_strScope)==-1
							&& m_Csymtab->st_lookup(t->m_strIDname,"Global")==-1){
						//表達式中的符號不可能在表中找不到,因為事前必須聲明。
						//但一個函數中的變量可能是局部的,也可能是全局的。
						cout<<"Error in line "<<t->m_ilineno<<":  '"
									<<t->m_strIDname<<"' : undeclared identifier"<<endl;
						m_ierror=1;}
					else{
						//如果是局部的,插入一個局部符號。
						if(m_Csymtab->st_lookup(t->m_strIDname,t->m_strScope)!=-1)
								m_Csymtab->st_insert(t->m_strIDname, t->m_strScope
												, t->m_EnTypevalue, t->m_ilineno, 0);
						else//否則為全局的。
								m_Csymtab->st_insert(t->m_strIDname, "Global"
										, t->m_EnTypevalue, t->m_ilineno, 0);}
					break;
				default:
					break;}
			break;
		case StmtK:
			switch(t->kind.m_EnStmtKind){
				case AddressK:		//符號地址。
					if(m_Csymtab->st_lookup(t->m_pchild[0]->m_strIDname,"Global")!=-1){
						cout<<"Error in line "<<t->m_ilineno<<":  '"
									<<t->m_pchild[0]->m_strIDname<<"': label redefined"<<endl;
						m_ierror=1;}
					else
						m_Csymtab->st_insert(t->m_pchild[0]->m_strIDname, "Global", 
									t->m_EnTypevalue,t->m_ilineno, m_ilocation++);
					break;
				default:
					break;}
			break;
		default:
			break;}
}

/************************************************
** 對符號表執行語義檢查。
*************************************************/
void Canalyzer::checkNode(CTreeNode *t){
	CTreeNode *p=t;						//為break,continue的檢查所專用。
	switch(t->m_Ennodekind){
		case ExpK:
			switch(t->kind.m_EnExpKind){
				case OpK://表達式中,表達式的類型由精度高的子表達式類型決定。
					if(t->m_pchild[1]==NULL){
						t->m_EnTypevalue=t->m_pchild[0]->m_EnTypevalue;
						break;}
					if(t->m_pchild[0]->m_EnTypevalue == VOID ||
											t->m_pchild[1]->m_EnTypevalue == VOID){
						cout<<"Error in line "<<t->m_ilineno<<
													": illegal use of type 'void'"<<endl;
						m_ierror=1;}
					else if(t->m_pchild[0]->m_EnTypevalue == FLOAT ||
										t->m_pchild[1]->m_EnTypevalue == FLOAT)
						t->m_EnTypevalue=FLOAT;
					else if(t->m_pchild[0]->m_EnTypevalue == INT ||
										t->m_pchild[1]->m_EnTypevalue == INT)
						t->m_EnTypevalue=INT;
					else t->m_EnTypevalue=CHAR;
					break;
				case IdK:		//變量的類型在符號表中可以找到。
					if((t->m_EnTypevalue=m_Csymtab->
								st_lookuptype(t->m_strIDname,t->m_strScope))==ERROR)
						t->m_EnTypevalue=m_Csymtab->st_lookuptype(t->m_strIDname,"Global");
					break;
				default:
					break;}
			break;
		case StmtK:
			switch(t->kind.m_EnStmtKind){
				case ReturnK:	//函數返回類型必須精確匹配。
					if(t->m_pchild[0]==NULL){ //return不帶參數,則函數返回類型必為void.
						if(m_Csymtab->st_lookuptype(t->m_strScope, "Global")!=VOID){
							cout<<"Error in line "<<t->m_ilineno<<": Function '"
								<<t->m_strScope<<"' must return a value."<<endl;
							m_ierror=1;}
					}
					break;
				case BreakK:
					//break語句的基本處理思想是沿著樹往雙親結點搜索,如果找不到for,或while
					//語句,則說明該break句子位置不對,continue相同處理。
					while(p->m_pfather!=NULL && (p->m_pfather->m_Ennodekind!=StmtK ||
								(p->m_pfather->kind.m_EnStmtKind!=ForK 
												&& p->m_pfather->kind.m_EnStmtKind!=WhileK)))
						p=p->m_pfather; 
					if(p->m_pfather==NULL){
						cout<<"Error in line "<<t->m_ilineno<<": illegal break"<<endl;
						m_ierror=1;}
					break;
				case ContinueK:    //同continue語句。
					while(p->m_pfather!=NULL && (p->m_pfather->m_Ennodekind!=StmtK ||
								(p->m_pfather->kind.m_EnStmtKind!=ForK 
												&& p->m_pfather->kind.m_EnStmtKind!=WhileK)))
						p=p->m_pfather; 
					if(p->m_pfather==NULL){
						cout<<"Error in line "<<t->m_ilineno<<": illegal continue."<<endl;
						m_ierror=1;}
					break;
				default:
					break;}
			break;
		default:
			break;}
}

/*************************************************
** 因為goto語句是突破作用域范圍的限制的,所以必須
** 為它單獨執行一遍語義檢查。
*************************************************/
void Canalyzer::checkgoto(CTreeNode *t){
	switch(t->m_Ennodekind){
		case StmtK:
			switch(t->kind.m_EnStmtKind){
				case GotoK:
					if(m_Csymtab->st_lookup(t->m_pchild[0]->m_strIDname)==-1){
						cout<<"Error in line "<<t->m_ilineno<<": '"<<t->m_pchild[0]->
													m_strIDname<<"'"<<" was undefined."<<endl;
						m_ierror=1;}
					else
						m_Csymtab->st_insert(t->m_pchild[0]->m_strIDname, 
									t->m_EnTypevalue,t->m_ilineno, 0);
					break;
				default:
					break;}
			break;
		default:
			break;}
}

/********************************************************
**先序遍歷語法樹構造符號表,并打印出符號表。
********************************************************/
void Canalyzer::buildSymtab(CTreeNode* syntaxTree){
	traverse(syntaxTree, insertNode,nullProc);
}

/******************************************************
**后序遍歷語法樹,結合符號表執行語義分析。
**  在第二遍語義檢查結束時,確定main函數的存在。
******************************************************/
void Canalyzer::typeCheck(CTreeNode* syntaxTree){
	traverse(syntaxTree,nullProc,checkNode);
	traverse(syntaxTree,nullProc,checkgoto);		//執行第二遍語義分析,為goto匹配符號地址。
	if(m_Csymtab->st_lookup("main","Global")==-1){	//語義分析結束,確定一下main函數是否存在。
		cout<<"unresolved external symbol main"<<endl;
		m_ierror=1;}
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲图片欧美一区| 99国产精品久久| www.久久精品| 91精品国产综合久久福利软件| 久久久久久久久久久电影| 亚洲精品亚洲人成人网在线播放| 看片网站欧美日韩| 色一情一伦一子一伦一区| 久久美女艺术照精彩视频福利播放| 亚洲一区中文日韩| 粉嫩aⅴ一区二区三区四区 | 偷拍日韩校园综合在线| 国产精品99久| 91精品国产综合久久久蜜臀图片| 自拍偷在线精品自拍偷无码专区 | 久久亚洲一区二区三区明星换脸| 亚洲成人资源网| 成人国产精品视频| 久久精品男人天堂av| 蜜臀久久久久久久| 欧美体内she精高潮| 亚洲国产精品精华液2区45| 国产一区二区三区四区五区美女| 91精品欧美久久久久久动漫 | 最新不卡av在线| 国产高清在线观看免费不卡| 日韩一区二区三区在线观看| 丝袜a∨在线一区二区三区不卡| 欧美写真视频网站| 一级日本不卡的影视| 99精品在线观看视频| 国产亚洲精品7777| 国产白丝精品91爽爽久久| 国产亚洲精品精华液| 国产乱子伦视频一区二区三区| 欧美成人性福生活免费看| 日韩av中文字幕一区二区三区| 欧美高清视频不卡网| 2021久久国产精品不只是精品| 国产伦精品一区二区三区免费| 精品国产一区a| 国产精品亚洲人在线观看| www精品美女久久久tv| 国产美女精品人人做人人爽| 久久久久久9999| 9色porny自拍视频一区二区| 国产精品国产三级国产aⅴ入口| 91亚洲国产成人精品一区二区三| 《视频一区视频二区| 欧美视频第二页| 日本视频一区二区| 久久久久久久久久久久久夜| 成人黄色国产精品网站大全在线免费观看 | 日本乱人伦aⅴ精品| 一区二区三区四区不卡在线| 欧美放荡的少妇| 美女一区二区视频| 欧美极品少妇xxxxⅹ高跟鞋| av在线不卡观看免费观看| 亚洲综合色区另类av| 91精品国产综合久久久蜜臀粉嫩| 国产美女一区二区| 亚洲欧美日韩国产综合在线| 欧美精品九九99久久| 国产高清不卡二三区| 亚洲乱码国产乱码精品精98午夜| 宅男噜噜噜66一区二区66| 国产在线播放一区二区三区| 一区二区三区中文字幕在线观看| 91精品国产综合久久久久久| proumb性欧美在线观看| 天天色图综合网| 国产精品视频看| 欧美日韩亚洲综合在线| 福利一区二区在线| 亚洲小说欧美激情另类| 2017欧美狠狠色| 91福利国产成人精品照片| 狠狠色2019综合网| 亚洲精品视频一区二区| 久久先锋影音av| 欧美色区777第一页| 国产iv一区二区三区| 日韩国产欧美视频| 国产精品每日更新| 欧美精品一区二区三区蜜臀| 在线观看国产精品网站| 国产成人三级在线观看| 日本不卡不码高清免费观看| 亚洲人成网站色在线观看| 久久久国产精华| 91精品国产综合久久精品| 一本大道久久a久久综合| 国产福利一区二区三区视频在线 | 国产精品久久久久毛片软件| 欧美xxxx在线观看| 欧洲一区在线观看| 东方aⅴ免费观看久久av| 麻豆一区二区三区| 亚洲成av人在线观看| 亚洲精品视频在线看| 国产午夜久久久久| 精品久久免费看| 91精品午夜视频| 欧洲精品一区二区三区在线观看| 丁香另类激情小说| 国产麻豆一精品一av一免费| 美女一区二区视频| 蜜臀91精品一区二区三区 | 日本一区二区三区dvd视频在线| 91精品国产综合久久精品图片 | 精品女同一区二区| 91精品国产麻豆| 69久久夜色精品国产69蝌蚪网| 欧美三级在线视频| 色先锋资源久久综合| 91在线观看视频| 色视频成人在线观看免| 色欧美日韩亚洲| 欧美日韩高清一区二区不卡| 欧美午夜精品久久久| 欧美日韩激情在线| 欧美精品123区| 欧美草草影院在线视频| 欧美精品一区二区三区很污很色的| 日韩欧美色电影| 26uuu亚洲综合色| 国产精品丝袜一区| 1024国产精品| 亚洲一区二区三区四区在线免费观看| 亚洲理论在线观看| 天天综合日日夜夜精品| 热久久免费视频| 精品一区二区影视| 高清不卡在线观看| 在线观看免费一区| 欧美日韩一级片在线观看| 日韩一卡二卡三卡四卡| 久久免费的精品国产v∧| 亚洲国产精品av| 亚洲精品五月天| 美国一区二区三区在线播放| 国产精品资源在线| 91在线丨porny丨国产| 欧美日精品一区视频| 日韩欧美的一区二区| 日本一区二区视频在线| 亚洲成人动漫精品| 国内成人免费视频| 色综合欧美在线视频区| 欧美一区二区三区四区高清| 国产精品丝袜黑色高跟| 亚洲国产精品一区二区www| 久久99精品久久久| av综合在线播放| 日韩亚洲欧美一区二区三区| 国产精品女上位| 三级亚洲高清视频| 粉嫩13p一区二区三区| 欧美久久久久免费| 国产女同互慰高潮91漫画| 亚洲成av人片一区二区| 高潮精品一区videoshd| 91精品国产综合久久久久久| ㊣最新国产の精品bt伙计久久| 免费看欧美美女黄的网站| 成人av资源在线观看| 日韩三级高清在线| 亚洲欧美激情一区二区| 国模娜娜一区二区三区| 在线免费视频一区二区| 中文字幕电影一区| 麻豆精品国产91久久久久久| 在线亚洲一区二区| 国产亚洲欧美一区在线观看| 日韩中文字幕1| 色一情一乱一乱一91av| 国产日韩精品视频一区| 久久99精品久久只有精品| 欧美日本乱大交xxxxx| 最新高清无码专区| 国产99久久久国产精品潘金 | 精品无人码麻豆乱码1区2区 | 石原莉奈一区二区三区在线观看| 91小视频免费观看| 久久综合久久综合九色| 日本vs亚洲vs韩国一区三区| 欧美视频一区二区三区在线观看| 国产精品二三区| 国产91精品精华液一区二区三区| 精品国产成人在线影院 | 欧美日本免费一区二区三区| 亚洲欧美偷拍卡通变态| 成人一区在线观看| 国产亚洲欧美日韩日本| 国产一区在线视频| 久久久久国产精品厨房| 国产精品自在在线| 久久久不卡网国产精品一区| 国产一区不卡在线|