⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remanage.cpp

📁 识别正规式
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}

}

/*消除DFA中的无用状态*/
void REManage::RemoveFutility()
/*
===================
输入:
	  miniStartDFA
	  miniEndDFA
      miniNonEndDFA
	  MiniDFA_EDGE
	  miniStateGather
===================
输出:
	  miniStartDFA
	  miniEndDFA
      miniNonEndDFA
	  MiniDFA_EDGE
	  miniStateGather	  
===================
*/
{

	vector<unsigned>	reachedState;
	queue<unsigned>	reached;

	vector<unsigned> startGather;
	vector<unsigned>	endGather;

	reachedState.clear();	


	reached.push(miniStartDFA);
	reachedState.push_back(miniStartDFA);

	while(reached.size()>0)
	{
		unsigned front=reached.front();
		reached.pop();

		for(unsigned i=0;i<MiniDFA_EDGE.size();i++)
		{
			if(find(DFAInput.begin(),DFAInput.end(),MiniDFA_EDGE[i].input)
				==DFAInput.end())
				DFAInput.push_back(MiniDFA_EDGE[i].input);

			if(MiniDFA_EDGE[i].start==front)
			{
				if(find(reachedState.begin(),reachedState.end(),MiniDFA_EDGE[i].end)
					==reachedState.end())
				{
					reachedState.push_back(MiniDFA_EDGE[i].end);
					reached.push(MiniDFA_EDGE[i].end);
				}
			}
		}
	}
	sort(reachedState.begin(),reachedState.end());

	vector<EDGE>::iterator iterEDGE;
	
	for(unsigned i=0;i<MiniDFA_EDGE.size();i++)
	{
		if(find(reachedState.begin(),reachedState.end(),MiniDFA_EDGE[i].start)
			==reachedState.end())
		{
			iterEDGE=MiniDFA_EDGE.begin()+i;
			MiniDFA_EDGE.erase(iterEDGE++);
			i--;
		}
	}

	vector<unsigned>::iterator iterEnd;
	for(unsigned i=0;i<miniEndDFA.size();i++)
	{
		if(find(reachedState.begin(),reachedState.end(),miniEndDFA[i])
			==reachedState.end())
		{
			iterEnd=miniEndDFA.begin()+i;
			miniEndDFA.erase(iterEnd++);
			i--;
		}
	}
	
	size_t initSize=reachedState.size()+1;

	while(reachedState.size()<initSize)
	{
		initSize=reachedState.size();

		startGather.clear();
		endGather.clear();

		for(unsigned m=0;m<MiniDFA_EDGE.size();m++)
		{
			if(find(startGather.begin(),startGather.end(),MiniDFA_EDGE[m].start)
				==startGather.end())
				startGather.push_back(MiniDFA_EDGE[m].start);
			if(find(endGather.begin(),endGather.end(),MiniDFA_EDGE[m].end)
				==endGather.end())
				endGather.push_back(MiniDFA_EDGE[m].end);
		}

		for(unsigned i=0;i<reachedState.size();i++)
		{
			if(find(startGather.begin(),startGather.end(),reachedState[i])
				==startGather.end()&&
				find(miniEndDFA.begin(),miniEndDFA.end(),reachedState[i])
				==miniEndDFA.end())		
			{
				for(unsigned j=0;j<MiniDFA_EDGE.size();j++)
				{
					if(MiniDFA_EDGE[j].end==reachedState[i])
					{
						DFA_EDGE.erase(MiniDFA_EDGE.begin()+j);
						j--;
					}
				}
				reachedState.erase(reachedState.begin()+i);
				break;
			}
		}
	}

	for(unsigned i=0;i<MiniDFA_EDGE.size();i++)
	{
		if(find(miniDFAInput.begin(),miniDFAInput.end(),MiniDFA_EDGE[i].input)
			==miniDFAInput.end())
			miniDFAInput.push_back(MiniDFA_EDGE[i].input);
	}

}
size_t REManage::MovdDFA(unsigned start,char input)
{
	for(unsigned i=0;i<DFA_EDGE.size();i++)
	{
		if(DFA_EDGE[i].start==start
			&&DFA_EDGE[i].input==input)
			return DFA_EDGE[i].end;
	}

	return -1;
}

unsigned REManage::FindGather(unsigned end,vector<vector<unsigned> > gather)
{
	if(end<0)
		return end;
	for(unsigned i=0;i<gather.size();i++)
		if(find(gather[i].begin(),gather[i].end(),end)!=gather[i].end())
			return i;
	return -1;
}

/*合并DFA中的等价状态*/
/*
===================
输入:
	  DFAInput
	  startDFA
	  endDFA
	  nonEndDFA
	  DFA_EDGE
===================
输出:
	  miniStartDFA
	  miniEndDFA
      miniNonEndDFA
	  MiniDFA_EDGE
	  miniStateGather	  
===================
*/
void REManage::CombineEquality()
{
	vector<vector<unsigned> > completeStateGather;
	vector<vector<unsigned> > currentStateGather;

	completeStateGather.clear();
	currentStateGather.clear();

	completeStateGather.push_back(nonEndDFA);
	completeStateGather.push_back(endDFA);
	
	size_t initSize=completeStateGather.size()-1;
	bool seperate=true;
	

	for(unsigned allState=0;allState<completeStateGather.size();allState++)
	{
		initSize=completeStateGather.size()-1;

		while(completeStateGather.size()>initSize)
		{
			vector<unsigned> testState=completeStateGather[allState];
			initSize=completeStateGather.size();				
			if(testState.size()==1)
				continue;
			for(unsigned i=0;i<DFAInput.size();i++)
			{	
				seperate=true;
				currentStateGather.clear();
				currentStateGather.resize(completeStateGather.size()+1);

				for(unsigned j=0;j<testState.size();j++)
				{
					unsigned gather=FindGather(
						MovdDFA(testState[j],DFAInput[i]),
						completeStateGather);
					currentStateGather[gather+1].push_back(testState[j]);
				}
				
				for(unsigned j=0;j<currentStateGather.size();j++)
				{
					if(currentStateGather[j].size()==testState.size())
					{
						seperate=false;
						break;
					}
				}
				
				if(seperate)
				{
					completeStateGather.erase(completeStateGather.begin()+allState);			
					for(unsigned j=0;j<currentStateGather.size();j++)
					{
						if(currentStateGather[j].size()>0)
						{
							completeStateGather.push_back(currentStateGather[j]);
						}
					}
					break;
				}
					
			}
		}	
	}
	sort(completeStateGather.begin(),completeStateGather.end());

	miniStateGather=completeStateGather;

	for(unsigned i=0;i<DFA_EDGE.size();i++)
	{
		EDGE temp;
		temp.input=DFA_EDGE[i].input;
		temp.start=completeStateGather[FindGather(DFA_EDGE[i].start,completeStateGather)][0];
		temp.end=completeStateGather[FindGather(DFA_EDGE[i].end,completeStateGather)][0];
		
		if(find(MiniDFA_EDGE.begin(),MiniDFA_EDGE.end(),temp)==MiniDFA_EDGE.end())
			MiniDFA_EDGE.push_back(temp);
	}
	for(unsigned i=0;i<miniStateGather.size();i++)
	{
		if(find(miniStateGather[i].begin(),miniStateGather[i].end(),startDFA)
			!=miniStateGather[i].end())
			miniStartDFA=miniStateGather[i][0];

		for(unsigned j=0;j<miniStateGather[i].size();j++)
		{
			if(find(endDFA.begin(),endDFA.end(),miniStateGather[i][j])
				!=endDFA.end())
			{
				if(find(miniEndDFA.begin(),miniEndDFA.end(),miniStateGather[i][0])
					==miniEndDFA.end())
					miniEndDFA.push_back(miniStateGather[i][0]);
			}
			else
			{
				if(find(miniNonEndDFA.begin(),miniNonEndDFA.end(),miniStateGather[i][0])
					==miniNonEndDFA.end())
					miniNonEndDFA.push_back(miniStateGather[i][0]);
			}
		}
	}
}

/*最小化DFA*/
void REManage::MinimizeDFA()
{
	this->CombineEquality();
	this->RemoveFutility();
}
void REManage::clear()
{
	NFA_EDGE.clear();
	NFAInput.clear();
	startNFA.clear();
	endNFA.clear();
	
	DFAInput.clear();
	endDFA.clear();
	nonEndDFA.clear();
	DFA_EDGE.clear();
	DFAStateGather.clear();

	miniDFAInput.clear();
	miniEndDFA.clear();
	miniNonEndDFA.clear();
	MiniDFA_EDGE.clear();
    miniStateGather.clear();
}
//设置正规式
bool REManage::setRE(string re)
{
	this->state=1;
	this->clear();
	this->re=re;
	if(REJudge() == false)return false;
	return true;
}

//设置NFA
void REManage::setNFA(vector<EDGE> edge,vector<unsigned> start,vector<unsigned> end)
{
	//对输入与输出清空
	this->clear();
	this->state=1;
	this->NFA_EDGE=edge;
	this->startNFA=start;
	this->endNFA=end;

	for(unsigned i=0;i<edge.size();i++)
	{
		if(find(NFAInput.begin(),NFAInput.end(),edge[i].input)
			==NFAInput.end())
			NFAInput.push_back(edge[i].input);
	}

}

//设置DFA
void REManage::setDFA(vector<EDGE> edge,unsigned start,vector<unsigned> end)
{
	//对输入与输出清空
	this->clear();
	this->state=1;
	this->DFA_EDGE=edge;
	this->startDFA=start;
	this->endDFA=end;

	for(unsigned i=0;i<edge.size();i++)
	{
		if(find(DFAInput.begin(),DFAInput.end(),edge[i].input)
			==DFAInput.end())
			DFAInput.push_back(edge[i].input);
		if(find(endDFA.begin(),endDFA.end(),edge[i].start)
			==endDFA.end()&&
			find(nonEndDFA.begin(),nonEndDFA.end(),edge[i].start)
			==nonEndDFA.end())
			nonEndDFA.push_back(edge[i].start);
		if(find(endDFA.begin(),endDFA.end(),edge[i].end)
			==endDFA.end()&&
			find(nonEndDFA.begin(),nonEndDFA.end(),edge[i].end)
			==nonEndDFA.end())
			nonEndDFA.push_back(edge[i].end);
	}
}

void REManage::Process()
{
	this->ProcessREToNFA();
	this->NFAInput=this->REInput;
	this->DFAInput=this->NFAInput;
	this->ProcessNFAToDFA();
	this->MinimizeDFA();
	this->OutputResult();
}
void REManage::OutputResult()
{
	cout<<"==================开始==================="<<endl;
	cout<<endl;
	cout<<"正规式:"<<this->re<<endl;
	cout<<"正规式输入符:";
	for(unsigned i=0;i<this->REInput.size();i++)
		cout<<this->REInput[i]<<" ";
	cout<<endl;

	cout<<"=================构造NFA=================="<<endl;
	cout<<"初态集:";
	for(unsigned i=0;i<this->startNFA.size();i++)
		cout<<this->startNFA[i]<<" ";
	cout<<endl;
	cout<<"终态集:";
	for(unsigned i=0;i<this->endNFA.size();i++)
		cout<<this->endNFA[i]<<" ";
	cout<<endl;

	cout<<"NFA的边集:"<<endl;
	for(unsigned i=0;i<this->NFA_EDGE.size();i++)
	{
		cout<<"Index "<<i<<": ";
		cout<<this->NFA_EDGE[i].start<<"  "
			<<this->NFA_EDGE[i].input<<"  "
			<<this->NFA_EDGE[i].end<<endl;
	}

	cout<<endl;

	cout<<"================确定为DFA================="<<endl;
	cout<<"初态:"<<startDFA<<endl;
	cout<<"终态集:";
	for(unsigned i=0;i<this->endDFA.size();i++)
		cout<<this->endDFA[i]<<" ";
	cout<<endl;

	cout<<"DFA的边集:"<<endl;
	for(unsigned i=0;i<this->DFA_EDGE.size();i++)
	{
		cout<<"Index "<<i<<": ";
		cout<<this->DFA_EDGE[i].start<<"  "
			<<this->DFA_EDGE[i].input<<"  "
			<<this->DFA_EDGE[i].end<<endl;
	}

	cout<<endl;

	cout<<"==============最小化的DFA==============="<<endl;
	cout<<"初态:"<<miniStartDFA<<endl;
	cout<<"终态集:";
	for(unsigned i=0;i<this->miniEndDFA.size();i++)
		cout<<this->miniEndDFA[i]<<" ";
	cout<<endl;

	cout<<"最小化DFA的边集:"<<endl;
	for(unsigned i=0;i<this->MiniDFA_EDGE.size();i++)
	{
		cout<<"Index "<<i<<": ";
		cout<<this->MiniDFA_EDGE[i].start<<"  "
			<<this->MiniDFA_EDGE[i].input<<"  "
			<<this->MiniDFA_EDGE[i].end<<endl;
	}

	cout<<endl;
	cout<<"==================结束==================="<<endl;
}

bool REManage::REJudge()const
{
	int leftbracket = 0,rightbracket = 0;
	for(unsigned i = 0;i < re.length();i++)
	{
		if(re[i] != '.'&&re[i] != '|'
			&&re[i] != '*'&&re[i] != '('
			&&re[i] != ')'&&isalnum(re[i]) == 0)
			return false;										//不能有非法字符
		if((re[i] == '.'||re[i] == '|'
			||re[i] == '*'||re[i] == ')')&&i == 0)
			return false;			//'.''|''*'')'不能是第一个字符
		if((re[i] == '.'||re[i] == '|'||re[i] == '(')&&
			i == re.length()-1)
			return false;				//'.''|''('不能是最后一个字符
		if(re[i] == '.'&&
			(re[i-1] == '|'||re[i+1] == '|'
			||re[i+1] == '.'||re[i-1] == '('
			||re[i+1] == ')'||re[i+1] == '*'))
			return false;								//'.'前后不允许出现的符号
		if(re[i] == '|'&&
			(re[i+1] == '*'||re[i+1] == ')'
			||re[i-1] == '('||re[i+1] == '|'))
			return false;						//'|'前后不允许出现的符号
		if(re[i] == '*'&&(re[i-1] == '('||re[i-1] == '*'))
			return false;							//'*'前后不允许出现的符号
		if(re[i] == ')'&&leftbracket == 0)
			return false;							//式子的括号必须以'('开始
		if(re[i] == '(')leftbracket++;
		if(re[i] == ')')rightbracket++;			//给左右括号计数看是否匹配
	}
	if(leftbracket != rightbracket)return false;	//左右括号数量不匹配
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -