www.pudn.com > 编译原理LALR(1)文法分析器.zip > Item.h


/***********************/ 
/*    CItem类的定义    */ 
/***********************/ 
 
const int END=1000; 
 
class CItem 
{ 
public: 
	CItem(){string.MakeEmpty();} 
	int operator == (CItem &right)					//重载"=="符号 
	{ 
		int pos1=this->GetDotPos(); 
		int pos2=right.GetDotPos(); 
		if(this->vn==right.vn&&pos1==pos2) 
			if(this->sentence[pos1+1]==right.sentence[pos2+1] 
				&&this->sentence[pos1-1]==right.sentence[pos2-1]) 
				return 1; 
		return 0; 
	} 
	CItem &operator = (CItem &right)				//重载"="符号 
	{ 
		vn=right.vn; 
		for(int i=0;right.sentence[i]!=END;i++); 
		sentence=new int[i+1]; 
		sentence[i]=END; 
		for(i=0;right.sentence[i]!=END;i++) 
			sentence[i]=right.sentence[i]; 
		string.Add(right.string); 
		return *this; 
	} 
	int IsForReduce()								//是否待约项目 
	{ 
		int pos=GetDotPos(); 
		if(sentence[pos+1]<0)	return 1; 
		return 0; 
	} 
	int IsAccept()									//是否接收项目 
	{ 
		int pos=GetDotPos(); 
		if(vn==-5&&sentence[pos+1]==END)	return 1; 
		return 0; 
	} 
	int IsShift()									//是否移进项目 
	{ 
		int pos=GetDotPos(); 
		if(sentence[pos+1]>0)	return 1; 
		return 0; 
	} 
	int IsReduce()									//是否归约项目 
	{ 
		int pos=GetDotPos(); 
		if(pos==0) return 0; 
		if(sentence[pos+1]==END)	return 1; 
		return 0; 
	} 
	int GetDotPos()									//返回圆点位置 
	{ 
		for(int i=0;sentence[i]!=END;i++) 
			if(sentence[i]==1) break; 
		return i; 
	} 
	int Merge(CItem &item) 
	{ 
		int len1=string.Length(); 
		string.Add(item.string); 
		int len2=string.Length(); 
		if(len2-len1>0) return 1; 
		return 0; 
	} 
public: 
	int vn; 
	int *sentence; 
	List string; 
};