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

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

?? prase.cpp

?? 內(nèi)含源代碼和編譯實驗報告
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
	m_Entoken=m_pScaner->getToken();
	CTreeNode *t=newStmtNode(ForK);
	CTreeNode *p=t;
	CTreeNode *p2;
	match(LLPAREN,"missing '(' after 'for'");
	p->m_pchild[0]=expression();
	if(p->m_pchild[0]) p->m_pchild[0]->m_pfather=p;
	p=p->m_pchild[0];
	p->m_pbrother=expression();
	p=p->m_pbrother;
	m_EnEndexp=ERPAREN;							//指示下一個表達式將以)結(jié)尾。
	p->m_pbrother=expression();
	match(LGPAREN,"missing '{' after 'for'");
	p2=t->m_pchild[1]=compound_stmt();
	if(p2) p2->m_pfather=t;
	while(p2 && p2->m_pbrother){
		p2=p2->m_pbrother;
		p2->m_pfather=t;
	}
	return t;
}

/***************************************************************
**文法:jump_stmt->goto ID;
****************************************************************/
CTreeNode *CPraser::jump_stmt(void){
	CTreeNode *t=newStmtNode(GotoK);
	m_Entoken=m_pScaner->getToken();
	strcpy(m_strIDname, m_pScaner->GettokenString());
	if(m_Entoken!=ID)
		throw CInvalid_type(AllGlobals.lineno,"goto an illegal destination");
	t->m_pchild[0]=newExpNode(IdK);
	if(t->m_pchild[0]) t->m_pchild[0]->m_pfather=t;
	m_Entoken=m_pScaner->getToken();
	match(SEMI,"missing ';'.");
	return t;
}
	
/*************************************************
**文法:break_stmt->break;
*************************************************/
CTreeNode *CPraser::break_stmt(void){
	CTreeNode *t=newStmtNode(BreakK);
	m_Entoken=m_pScaner->getToken();
	match(SEMI, "missing ';'");
	return t;
}
	
/*************************************************
**文法:continue_stmt->continue;
************************************************/
CTreeNode *CPraser::continue_stmt(void){
	CTreeNode *t=newStmtNode(ContinueK);
	m_Entoken=m_pScaner->getToken();
	match(SEMI,"missing ';'");
	return t;
}

/**********************************************
**文法:return_stmt->return;|return expression;
***********************************************/	
CTreeNode *CPraser::return_stmt(void){
	CTreeNode *t=newStmtNode(ReturnK);
	m_Entoken=m_pScaner->getToken();
	strcpy(m_strIDname, m_pScaner->GettokenString());
	if(m_Entoken==SEMI)	m_Entoken=m_pScaner->getToken();
	else{ 
		t->m_pchild[0]=expression(); 
		if(t->m_pchild[0]) t->m_pchild[0]->m_pfather=t;}
	return t;
}

/**************************************************
**文法:expression->var=expression|logic1_expression
***************************************************/
CTreeNode *CPraser::expression(void){
	CTreeNode *t=logic1_expression();
	CTreeNode *p=t;
	if(m_Entoken==ASSIGH){
		if(t->m_pchild[0]!=NULL || t->m_EnTypevalue!=ID)//賦值語句左邊不能是個復雜表達式。
			throw CInvalid_type(AllGlobals.lineno,"expression error.");
		p=newExpNode(OpK);				//建立賦值結(jié)點。
		p->m_pchild[0]=t;
		if(p->m_pchild[0]) p->m_pchild[0]->m_pfather=p;
		READSYMBOL
		t=expression();
		p->m_pchild[1]=t;
		if(p->m_pchild[1]) p->m_pchild[1]->m_pfather=p;
	}
	else{
		if(m_EnEndexp==ERPAREN){
			m_EnEndexp=ESEMI;							//恢復表達式以分號結(jié)束的缺省狀態(tài)。
			if(m_Entoken!=RLPAREN)						//表達式結(jié)束處,只能是).
				throw CInvalid_type(AllGlobals.lineno,"missing ')' after expression");}
		else if(m_EnEndexp==ECOMMA){	//對于表達式由逗號結(jié)束的情況,可能讀到逗號(后沒有結(jié)
			if(m_Entoken==COMMA){}		//束,繼續(xù),可能讀到右括號,則通知調(diào)用函數(shù)。
			else if(m_Entoken==RLPAREN) m_EnEndexp=ERPAREN;
			else throw CInvalid_type(AllGlobals.lineno,"missing ',' after expression");
			return p;}
		else{
			if(m_Entoken!=SEMI)			//表達式結(jié)尾處不能出現(xiàn)三種情況以外的情況。
				throw CInvalid_type(AllGlobals.lineno,"missing ';' after expression");}
		//表達式處理完畢,則取消向前多讀一個記號的狀態(tài)(這由最初的設計缺陷造成)
		m_Entoken=m_Enforexp;
		strcpy(m_strIDname, m_pScaner->GettokenString());
		m_Enforexp=ERROR;
	}
	return p;
}

/***************************************************************
**文法:logic1_expression->logic1_expression || logic2_expression()|logic2_expression
****************************************************************/
CTreeNode *CPraser::logic1_expression(void){
	CTreeNode *t=logic2_expression();
	CTreeNode *p=t;
	while(m_Entoken==OR){
		CTreeNode *p=newExpNode(OpK);
		p->m_pchild[0]=t;
		if(p->m_pchild[0]) p->m_pchild[0]->m_pfather=p;
		t=p;
		READSYMBOL
		p->m_pchild[1]=logic2_expression();
		if(p->m_pchild[1]) p->m_pchild[1]->m_pfather=p;
	}
	return t;
}

/******************************************************************
**文法: logic2_expression-> logic2_expression && simple_expression | simple_expression
*********************************************************************/
CTreeNode *CPraser::logic2_expression(void){
	CTreeNode *t=simple_expression();
	while(m_Entoken==AND){
		CTreeNode *p=newExpNode(OpK);
		p->m_pchild[0]=t;
		if(p->m_pchild[0]) p->m_pchild[0]->m_pfather=p;
		t=p;
		READSYMBOL
		p->m_pchild[1]=simple_expression();
		if(p->m_pchild[1]) p->m_pchild[1]->m_pfather=p;
	}
	return t;
}

/***************************************************************
**文法:simple_expression->add_expression relop add_expression|add_expression
**      relop-> <=|>=|>|<|==;
******************************************************************/
CTreeNode *CPraser::simple_expression(void){
	CTreeNode *t=add_expression();
	CTreeNode *p=t;
	while(m_Entoken>=EQ && m_Entoken<=NGT){
		p=newExpNode(OpK);
		p->m_pchild[0]=t;
		if(p->m_pchild[0]) p->m_pchild[0]->m_pfather=p;
		t=p;
		READSYMBOL
		p->m_pchild[1]=add_expression();
		if(p->m_pchild[1]) p->m_pchild[1]->m_pfather=p;
	}
	return t;
}

/******************************************************************
** 文法:  add_expression -> add_expression addop term | term
**         addop-> +|-
*****************************************************************/
CTreeNode *CPraser::add_expression(void){
	CTreeNode *t=term();
	while(m_Entoken==PLUS || m_Entoken==MINUS){
		CTreeNode *p=newExpNode(OpK);
		p->m_pchild[0]=t;
		if(p->m_pchild[0]) p->m_pchild[0]->m_pfather=p;
		t=p;
		READSYMBOL
		p->m_pchild[1]=term();
		if(p->m_pchild[1]) p->m_pchild[1]->m_pfather=p;
	}
	return t;
}

/****************************************************************
** 文法:term->logic3_expression mulop term|logic3_expression
**             mulop-> *|/
*****************************************************************/
CTreeNode *CPraser::term(void){
	CTreeNode *t=logic3_expression();
	while(m_Entoken==TIMES || m_Entoken==OVER){
		CTreeNode *p=newExpNode(OpK);
		p->m_pchild[0]=t;
		if(p->m_pchild[0]) p->m_pchild[0]->m_pfather=p;
		t=p;
		READSYMBOL
		p->m_pchild[1]=logic3_expression();
		if(p->m_pchild[1]) p->m_pchild[1]->m_pfather=p;
	}
	return t;
}

/***************************************************************
**文法: logic3_expression->!logic3_expression|factor
***************************************************************/
CTreeNode *CPraser::logic3_expression(void){
	CTreeNode *t=NULL, *p=NULL;
	if(m_Entoken==NOT){
		p=newExpNode(OpK);
		READSYMBOL
		t=factor();
		p->m_pchild[0]=t;
		if(p->m_pchild[0]) p->m_pchild[0]->m_pfather=p;
	}
	else{
		p=factor();}
	return p;
}

/*******************************************************************
**文法: factor->(expression)|ID|NUM
*******************************************************************/
CTreeNode *CPraser::factor(void){
	CTreeNode *t=NULL;
	char *p=NULL;int i=0;
	switch(m_Entoken){
		case NUM:
			p=m_strIDname;				//對數(shù)字進行有效性檢查(不可出現(xiàn)兩個小數(shù)點)
			while(*p!='\0'){
				if(*p=='.') i++;
				p++;}
			if(i>1)	throw CInvalid_type(AllGlobals.lineno,"Invalid numeric");
			t=newExpNode(ConstK);
			break;
		case ID:
			if(m_Enforexp==LLPAREN)		t=call_func();
			else	t=newExpNode(IdK);
			break;
		case CCHAR:
			t=newExpNode(ConstK);
			break;
		case LLPAREN:
			READSYMBOL
			m_EnEndexp=ERPAREN;		//指示下一個表達式將以)結(jié)束。
			t=expression();
			m_Enforexp=m_pScaner->getToken();
			return t;
		default:
			throw CInvalid_type(AllGlobals.lineno,"expression error.");
			break;
	}
	if(m_Enforexp!=ERROR){	//m_Enforexp不為ERROR,說明它保留著下一個記號,不必從文件中讀取了。
		READSYMBOL}
	else{
		m_Entoken=m_pScaner->getToken();
		strcpy(m_strIDname, m_pScaner->GettokenString());
		m_Enforexp=m_pScaner->getToken();
	}//由于設計上的缺陷,在表達式處理時,掃描器始終保持向前多讀一個記號,而其他部分則不具備
	 //這個功能,所以必須在這兩者之間轉(zhuǎn)換。
	return t;
}

/****************************************
**建一個新的函數(shù)結(jié)點或聲明結(jié)點。
*****************************************/
CTreeNode *CPraser::newNode(NodeKind pa_kind){
	CTreeNode *t=new CTreeNode;
	t->m_pchild[0]=NULL;
	t->m_pchild[1]=NULL;
	t->m_pchild[2]=NULL;
	t->m_pfather=NULL;
	t->m_pbrother=NULL;
	t->m_Ennodekind=pa_kind;
	t->m_EnTypevalue=m_Enfirst;
	strcpy(t->m_strIDname, m_strIDname);
	strcpy(t->m_strScope, m_strScope);
	t->m_ilineno=AllGlobals.lineno;
	return t;
}

/**************************************************
**建一個語句體結(jié)點。
****************************************************/
CTreeNode *CPraser::newStmtNode(StmtKind pa_subkind){
	CTreeNode *t= new CTreeNode;
	t->m_pchild[0]=NULL;
	t->m_pchild[1]=NULL;
	t->m_pchild[2]=NULL;
	t->m_pfather=NULL;
	t->m_pbrother=NULL;
	t->m_Ennodekind=StmtK;
	strcpy(t->m_strScope, m_strScope);
	t->kind.m_EnStmtKind=pa_subkind;
	t->m_ilineno=AllGlobals.lineno;
	return t;
}

/***************************************************
**建一個表達式結(jié)點。
***************************************************/
CTreeNode *CPraser::newExpNode(ExpKind pa_subkind){
	CTreeNode *t= new CTreeNode;
	t->m_pchild[0]=NULL;
	t->m_pchild[1]=NULL;
	t->m_pchild[2]=NULL;
	t->m_pfather=NULL;
	t->m_pbrother=NULL;
	t->m_Ennodekind=ExpK;
	t->kind.m_EnExpKind=pa_subkind;
	t->m_EnTypevalue=m_Entoken;
	strcpy(t->m_strIDname, m_strIDname);
	strcpy(t->m_strScope, m_strScope);
	t->m_ilineno=AllGlobals.lineno;
	return t;
}

/*************************************************
**匹配掉程序中的特殊記號,如:{ (等。
*************************************************/
void CPraser::match(TokenType pa_expcted,string pa_errorifno){
	TokenType token=m_Entoken;
	m_Entoken=m_pScaner->getToken();
	strcpy(m_strIDname, m_pScaner->GettokenString());
	if(token!=pa_expcted)
		throw CInvalid_type(AllGlobals.lineno,pa_errorifno);
	return;
}

/************************************************
**打印出語法樹。
***********************************************/
void CPraser::PrintTree(CTreeNode *pa_Ctree){
	int i;
	m_indentno+=4;				//用于控制縮進格式。
	while(pa_Ctree!=NULL){
		for(i=0;i<m_indentno;i++)  cout<<" ";
		if(pa_Ctree->m_Ennodekind==StmtK){
			switch(pa_Ctree->kind.m_EnStmtKind){
				case IfK:		cout<<"if"<<endl;			break;
				case WhileK:	cout<<"while"<<endl;		break;
				case ForK:		cout<<"for"<<endl;			break;
				case GotoK:		cout<<"goto"<<endl;			break;
				case BreakK:	cout<<"break"<<endl;		break;
				case ContinueK:	cout<<"continue"<<endl;		break;
				case ReturnK:	cout<<"return"<<endl;		break;
				case AddressK:  cout<<"Address"<<endl;		break;
				case CallK:		cout<<"FuncCall"<<endl;		break;
				case WritebK:	cout<<"writechar"<<endl;	break;
				case WritedK:	cout<<"writeint"<<endl;	break;
				default:
					cout<<"Unknown ExpNode kind"<<endl;
					break;}
		}
		else if(pa_Ctree->m_Ennodekind==ExpK){
			switch(pa_Ctree->kind.m_EnExpKind){
				case OpK:
					cout<<"Op: ";
					m_pScaner->printToken(pa_Ctree->m_EnTypevalue,"\0");
					break;
				case ConstK:
					cout<<"const: "<<pa_Ctree->m_strIDname<<endl;
					break;
				case IdK:
					cout<<"ID: "<<pa_Ctree->m_strIDname<<endl;
					break;
				default:
					cout<<"Unknown ExpNode kind"<<endl;
					break;}
		}
		else if(pa_Ctree->m_Ennodekind==FuncK){
			cout<<"Function: ";
			for(i=8;i<12;i++){
				if(m_pScaner->m_ReservedWords[i].m_Enwords==pa_Ctree->m_EnTypevalue){
					cout<<m_pScaner->m_ReservedWords[i].m_chwords<<" ";
					break;}
			}
			cout<<pa_Ctree->m_strIDname<<endl;}
		else if(pa_Ctree->m_Ennodekind==ParaK){
			cout<<"parameters: ";
			for(i=8;i<12;i++){
				if(m_pScaner->m_ReservedWords[i].m_Enwords==pa_Ctree->m_EnTypevalue){
					cout<<m_pScaner->m_ReservedWords[i].m_chwords<<" ";
					break;}
			}
			cout<<pa_Ctree->m_strIDname<<endl;}
		else if(pa_Ctree->m_Ennodekind==DeclK){
			cout<<"declaration: ";
			for(i=8;i<12;i++){
				if(m_pScaner->m_ReservedWords[i].m_Enwords==pa_Ctree->m_EnTypevalue){
					cout<<m_pScaner->m_ReservedWords[i].m_chwords<<" ";
					break;}
			}
			cout<<pa_Ctree->m_strIDname<<endl;}
		else
			cout<<"Unknown ExpNode kind"<<endl;
		for(i=0;i<3;i++)
			PrintTree(pa_Ctree->m_pchild[i]);
		pa_Ctree=pa_Ctree->m_pbrother;
	}
	m_indentno-=4;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91综合一区在线观看| 国产91精品在线观看| 久久欧美一区二区| 欧美日韩一区二区三区免费看| 精品一区二区三区视频| 亚洲午夜日本在线观看| 亚洲欧洲国产日本综合| 精品国产亚洲在线| 欧美精品丝袜久久久中文字幕| 成人国产精品免费| 精品一区二区三区欧美| 日韩精品福利网| 亚洲一区二区三区四区在线观看| 欧美国产激情一区二区三区蜜月| 日韩一二三区不卡| 欧美在线免费观看亚洲| 91亚洲精品乱码久久久久久蜜桃| 韩国v欧美v日本v亚洲v| 日韩高清国产一区在线| 亚洲亚洲精品在线观看| 亚洲精品日韩一| 国产精品毛片大码女人| 欧美经典三级视频一区二区三区| 精品国产制服丝袜高跟| 精品国产精品网麻豆系列| 91精品国产色综合久久ai换脸 | 日韩精品一区在线观看| 欧美亚洲国产一区在线观看网站| 99re热这里只有精品免费视频| 国产精品 日产精品 欧美精品| 美女mm1313爽爽久久久蜜臀| 秋霞电影网一区二区| 免费高清在线一区| 老司机精品视频在线| 久久99国产精品免费| 免费欧美高清视频| 九色综合狠狠综合久久| 经典三级一区二区| 国产精品99久久久| 懂色中文一区二区在线播放| 成人h动漫精品一区二| 成人动漫在线一区| 一本久久精品一区二区 | 精品久久五月天| 久久嫩草精品久久久精品一| 国产亚洲成aⅴ人片在线观看| 国产亚洲精品超碰| 亚洲视频一区在线| 亚洲国产美女搞黄色| 日日欢夜夜爽一区| 久久精品国产澳门| 国产成人精品aa毛片| 成人动漫av在线| 色天使色偷偷av一区二区| 欧美性生活大片视频| 欧美一区二区国产| 国产欧美一区二区三区鸳鸯浴| 国产精品第一页第二页第三页| 亚洲综合网站在线观看| 日本91福利区| 粉嫩13p一区二区三区| 在线亚洲高清视频| 日韩欧美一级精品久久| 国产精品丝袜91| 亚洲电影在线播放| 韩国女主播成人在线观看| 不卡的av电影在线观看| 欧美久久久久免费| 久久久久久久久久久久电影| 一区二区三区免费看视频| 免费在线成人网| 99久久精品免费精品国产| 欧美精品九九99久久| 国产偷国产偷精品高清尤物| 亚洲一区日韩精品中文字幕| 国产一区二区中文字幕| 在线观看av一区| 精品国产乱码久久久久久久久| 亚洲欧美成人一区二区三区| 琪琪久久久久日韩精品| 97久久超碰国产精品电影| 91超碰这里只有精品国产| 日本一二三四高清不卡| 亚洲国产裸拍裸体视频在线观看乱了| 激情六月婷婷久久| 在线观看一区二区视频| 久久久久久久精| 日日夜夜免费精品| 91尤物视频在线观看| 精品国产免费一区二区三区四区 | 麻豆国产欧美日韩综合精品二区 | 麻豆成人久久精品二区三区小说| 成人听书哪个软件好| 欧美一级高清片在线观看| 日韩美女啊v在线免费观看| 精品一区二区三区免费视频| 欧美色老头old∨ideo| 中日韩av电影| 久久成人久久鬼色| 欧美喷潮久久久xxxxx| 亚洲人成人一区二区在线观看| 国产一区美女在线| 欧美一级精品在线| 亚洲成av人片在www色猫咪| 99久久精品免费观看| 国产欧美一区二区精品性| 久久激情综合网| 91.com在线观看| 亚洲成人动漫在线观看| 91免费版在线| 国产精品乱码久久久久久| 国产精品影视在线| 久久综合网色—综合色88| 美女在线一区二区| 欧美一区二区福利在线| 亚洲bt欧美bt精品| 欧美午夜电影一区| 亚洲最新在线观看| 欧美性受xxxx黑人xyx| 成人免费在线视频| 成人99免费视频| 17c精品麻豆一区二区免费| 国产精品一区二区久久精品爱涩 | 成人一级视频在线观看| 精品国产一区a| 国产一区二区在线电影| 精品动漫一区二区三区在线观看| 久久精品久久久精品美女| 日韩精品一区国产麻豆| 久久精品国产亚洲5555| 日韩欧美综合一区| 久久精品国产第一区二区三区| 日韩欧美色电影| 国内精品伊人久久久久av影院 | 国产精品无码永久免费888| 国产精品一色哟哟哟| 国产亚洲精品福利| 国产成人综合精品三级| 欧美激情综合网| 成人av电影在线| 亚洲图片欧美激情| 欧洲av在线精品| 日本一不卡视频| 精品久久久三级丝袜| 国产传媒欧美日韩成人| 国产精品二三区| 欧美日韩一区成人| 七七婷婷婷婷精品国产| 久久久精品影视| 91视视频在线观看入口直接观看www| 亚洲四区在线观看| 欧美日韩国产在线播放网站| 麻豆精品国产91久久久久久| 久久久九九九九| 色香蕉成人二区免费| 日韩制服丝袜av| 欧美r级电影在线观看| 国产91在线看| 亚洲一区影音先锋| 精品国产不卡一区二区三区| 99久久er热在这里只有精品66| 亚洲午夜精品17c| 精品裸体舞一区二区三区| 成人91在线观看| 日韩综合一区二区| 国产精品午夜免费| 欧美老肥妇做.爰bbww| 国产精品一区二区视频| 亚洲乱码国产乱码精品精可以看| 欧美久久久影院| 成人午夜免费视频| 午夜久久久影院| 久久香蕉国产线看观看99| 色拍拍在线精品视频8848| 精品中文av资源站在线观看| 亚洲欧美欧美一区二区三区| 日韩精品一区二区在线观看| 色又黄又爽网站www久久| 全国精品久久少妇| 中文字幕一区二区三区不卡| 欧美一区二区三区四区视频 | 精品久久久久久最新网址| www.在线成人| 九九热在线视频观看这里只有精品| 亚洲欧洲精品一区二区精品久久久| 欧美一区二区三区在线电影| 色综合久久中文字幕综合网| 国产一区美女在线| 日韩电影一区二区三区四区| 91美女在线看| 国产在线日韩欧美| 亚洲成人www| 国产精品护士白丝一区av| 日韩视频一区二区| 色婷婷av一区二区三区之一色屋| 国产又粗又猛又爽又黄91精品| 午夜精品久久久久久久99水蜜桃| 中文字幕在线一区免费| 欧美mv和日韩mv国产网站| 欧美日韩国产精品自在自线|