www.pudn.com > 4rd.rar > function.h


#include  
#include "stack2.h" 
#include "queue.h" 
#include  
 
int lookup(char lexeme[]) 
{ 
	int i; 
	i=total; 
	while(strcmp(lexeme,table[i].name)&&(i>0)) 
		i--; 
	return i; 
} 
 
int insert(char lexeme[]) 
{ 
	int i; 
	i=lookup(lexeme); 
	if(i==0) 
	{ 
		total++; 
		strcpy(table[total].name,lexeme);	//将lexeme的内容复制到table[total].name里 
		return total; 
	} 
	else 
		return i; 
} 
 
void getidentifer() 
{ 
	char lexeme[17];	//标识符缓冲区 
	int i; 
	i=0; 
	while(isalpha(buffer[position])||isdigit(buffer[position]))//(Is_letter(buffer[position])||Is_number(buffer[position])) 
	{ 
		if(i<16) 
		{ 
			lexeme[i]=buffer[position]; 
			i++; 
		} 
		position++; 
	} 
	lexeme[i]='\0'; 
	position--;		//让position指回当前字符 
	identry=insert(lexeme); 
} 
 
bool Is_operator(char temp) 
{ 
	for(int i=0;i<6;i++) 
	{ 
		if(temp==operators[i]) 
			return true; 
	} 
	return false; 
} 
 
double num_analy()		//数字的识别,多位整数,小数 
{ 
	double radix,decval; 
	numval=0.0; 
	do { 
		decval=buffer[position]-'0';		//整数部分 
		numval=numval*10+decval; 
		position=position+1; 
	}while(isdigit(buffer[position])); 
	if (buffer[position]=='.'){				//小数部分 
		position=position+1; 
		radix=0.1; 
		while(isdigit(buffer[position])) 
		{ 
			decval=radix*(buffer[position]-'0'); 
			numval=numval+decval; 
			radix=radix*0.1; 
			position=position+1; 
		} 
	}//endif 
	position=position-1;		//gettoken()首先position=position+1; 
	return numval; 
} 
 
void error() 
{ 
	isok=false; 
	if(f_error==true) 
	{ 
		CString str; 
		str.Format("位置%d输入错误!",position-1); 
		AfxMessageBox(str); 
		buffer[position]='#'; 
		f_error=false; 
	} 
	 
} 
 
node* expr(); 
node* term(); 
node* factor(); 
node *extr(); 
///////////////////////////lookahead有关说明////////////////////////// 
//	1:+		2:-		3:*		4:/		5:(		6:) 
//	7:标识符		8:数字	9:整除DIV		10:求模MOD 
//	11:+=	12:-=	13:*=	14:/= 
////////////////////////////////////////////////////////////////////// 
 
void gettoken()		//语法树生成时用 
{ 
	while(buffer[position]==' ') 
		position++; 
	if(Is_operator(buffer[position])) 
	{ 
		switch(buffer[position]){ 
		case '+': 
			lookahead=1; 
			position++; 
			while(buffer[position]==' ') 
				position++; 
			if(buffer[position]=='=') 
			{ 
				lookahead=11; 
				position++; 
			} 
			break; 
		case '-': 
			lookahead=2; 
			position++; 
			while(buffer[position]==' ') 
				position++; 
			if(buffer[position]=='=') 
			{ 
				lookahead=12; 
				position++; 
			} 
			break; 
		case '*': 
			lookahead=3; 
			position++; 
			while(buffer[position]==' ') 
				position++; 
			if(buffer[position]=='=') 
			{ 
				lookahead=13; 
				position++; 
			} 
			break; 
		case '/': 
			lookahead=4; 
			position++; 
			while(buffer[position]==' ') 
				position++; 
			if(buffer[position]=='=') 
			{ 
				lookahead=14; 
				position++; 
			} 
			break; 
/*		case '\\': 
			lookahead=9; 
			position++; 
			break; 
		case '%': 
			lookahead=10; 
			position++; 
			break; 
*/ 
		case '(': 
			lookahead=5; 
			position++; 
			break; 
		case ')': 
			lookahead=6; 
			position++; 
			break; 
		} 
	} 
	else 
		if(buffer[position]=='D'&&buffer[position+1]=='I'&&buffer[position+2]=='V')//整除DIV 
		{ 
			position=position+3; 
			lookahead=9;	//整除DIV 
		} 
		else 
			if(buffer[position]=='M'&&buffer[position+1]=='O'&&buffer[position+2]=='D') 
			{ 
				position=position+3; 
				lookahead=10;	//求余MOD 
			} 
			else 
				if(isalpha(buffer[position]))//(Is_letter(buffer[position])) 
				{ 
					getidentifer(); 
					lookahead=7; 
					position++;		///////////////////// 
				} 
				else 
					if(isdigit(buffer[position]))//(Is_number(buffer[position])) 
					{ 
						num_analy(); 
						lookahead=8; 
						position++;		///////////////// 
					} 
					else 
						if(buffer[position]=='#') 
							lookahead=0; 
} 
 
node* mknode(double tokencode) 
{ 
	node *p; 
	p=new node; 
	if(tokencode==1||tokencode==2||tokencode==3||tokencode==4||tokencode==9||tokencode==10 
		||tokencode==11||tokencode==12||tokencode==13||tokencode==14) 
	{ 
		p->code=tokencode;			//+,-,*,/ 
		p->left=NULL; 
		p->right=NULL; 
	} 
	else 
		if(tokencode==7) 
		{ 
			p->code=7;		//标识符 
			p->entry=identry; 
			p->left=NULL;		////////////// 
			p->right=NULL;		///////////// 
		} 
		else 
			if(tokencode==8) 
			{ 
				p->code=8;	//数字 
				p->value=numval; 
				p->left=NULL;		////////////// 
				p->right=NULL;		///////////// 
			} 
			else 
				error(); 
	p->No=number; 
	number++; 
	q.EnQueue(p); 
	return p; 
} 
 
node* factor() 
{ 
	node *pf; 
	if(lookahead==5) 
	{ 
		gettoken(); 
		pf=extr(); 
		if(lookahead==6) 
			gettoken(); 
		else 
			error(); 
	} 
	else 
		if(lookahead==7||lookahead==8) 
		{ 
			pf=mknode(lookahead); 
			gettoken(); 
		} 
		else 
			error(); 
	return pf; 
} 
 
node* term() 
{ 
	double multoper; 
	node *pt,*ptl,*ptr; 
	ptl=factor(); 
	while(lookahead==3||lookahead==4||lookahead==9||lookahead==10) 
	{ 
		multoper=lookahead; 
		gettoken(); 
		ptr=factor(); 
		pt=mknode(multoper); 
		pt->left=ptl; 
		pt->right=ptr; 
		ptl=pt; 
	} 
	return ptl; 
} 
 
node* expr() 
{ 
	double addoper; 
	node *pe,*pel,*per; 
	pel=term(); 
	while(lookahead==1||lookahead==2) 
	{ 
		addoper=lookahead; 
		gettoken(); 
		per=term(); 
		pe=mknode(addoper); 
		pe->left=pel; 
		pe->right=per; 
		pel=pe; 
	} 
	return pel; 
} 
 
node *extr() 
{ 
	double addoper; 
	node *pe,*pel,*per; 
	pel=expr(); 
	while(lookahead==11||lookahead==12||lookahead==13||lookahead==14) 
	{ 
		addoper=lookahead; 
		gettoken(); 
		per=expr(); 
		pe=mknode(addoper); 
		pe->left=pel; 
		pe->right=per; 
		pel=pe; 
	} 
	return pel; 
} 
 
void ZuoBiao(node *ptr,node *parent,int row)	//计算各个结点的坐标 
{ 
	if(ptr!=NULL) 
	{ 
		xy *p=new xy; 
		if(parent->left==ptr)	//左孩子 
		{ 
			p->x=Pos[parent->No]->x-200+row*40; 
			p->y=Pos[parent->No]->y+100; 
			Pos[ptr->No]=p; 
		} 
		else 
		{ 
			p->x=Pos[parent->No]->x+200-row*40; 
			p->y=Pos[parent->No]->y+100; 
			Pos[ptr->No]=p; 
		} 
		row++; 
		if(ptr->code<=4||ptr->code>=9) 
		{ 
			ZuoBiao(ptr->left,ptr,row); 
			ZuoBiao(ptr->right,ptr,row); 
		} 
	} 
	listnode *p; 
	p=q.front->next; 
	///////若最左的结点超出屏幕范围,则将它移到屏幕内///////// 
	int delta=0-Pos[p->data->No]->x; 
	if(delta>0) 
	{ 
		for(int i=1;i<100;i++) 
		{ 
			if(Pos[i]!=NULL) 
				Pos[i]->x+=delta+5; 
		} 
		m_x+=delta+5; 
	} 
	/////////////////////////////////////////////////////////// 
} 
 
int ErrorTest(node* ptr) 
{ 
	if(ptr!=NULL) 
	{ 
		listnode *p; 
		p=q.front->next; 
		while(p!=NULL) 
		{ 
			if(p->data->code!=7&&p->data->code!=8&&(p->data->left==NULL||p->data->right==NULL)) 
				return 0; 
			p=p->next; 
		} 
	} 
	return 1; 
}