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

📄 liblexic.cpp

📁 lex语法分析
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	bFitted = true;
	if('%' == strWord[len-1]) {
		strTemp.erase(strTemp.begin(),strTemp.end());
		strTemp.append(strWord,0,len-1);
		if(PatternNumeral(strTemp,strTempPatEx))
		{
			strTempPat = strTempPat + strTempPatEx;
			strTempPat = strTempPat + "%";
		}
		else {
			bFitted = false;
		}	
		if(bFitted) {
			strPattern = strPattern + strTempPat;
		}
		return bFitted;
	} // {d}%

	for(i=0; i<len && bFitted; i++)
	{
		if(strWord[i]==':') {
			if(PatternNumeral(strTemp,strTempPatEx))
			{
				strTempPat = strTempPat + strTempPatEx;
			}
			else {
				bFitted = false;
			}
			strTemp.erase(strTemp.begin(),strTemp.end());
			strTempPat = strTempPat + ":";
		}
		else {
			strTemp.append(1,strWord[i]);
		}
	} // for		
	if(bFitted) {
		if(PatternNumeral(strTemp,strTempPatEx))
		{
			strTempPat = strTempPat + strTempPatEx;
		}
		else {
			bFitted = false;
		}
	}
	if(bFitted) {
		strPattern = strPattern + strTempPat;
	}
	return bFitted;
}
//  {i}  + 全字母
//  {f}  + 全字母
//  {d}  + 全字母
// 
//  {i}  + 全字母 + .                                12.6ft.
//  {f}  + 全字母 + . 
//  {d}  + 全字母 + .
//  {i}  + 全字母 + {i}   680x0-based  80486DX2-based  80486DX2-50
  
//  {i}  + 单字符 + . +  单字符 + .......(省略)       
//  {f}  + 单字符 + . +  单字符 + .......(省略)       9.30p.m
//  {d}  + 单字符 + . +  单字符 + .......(省略)  
//     说明:若只加 点号  就结束了 若加  . +  单字符 还可以递归
bool CLibLexic::PatternDA(string strWord,string& strPattern)
{
	string strNumPat,strNum,strTemp;
	int i,state,len;
	bool bAtEndState,bNormalQuit;

	len = strWord.length();
	for(i=0, state=0, bAtEndState=false, bNormalQuit=true;
	i<len && bNormalQuit;
	i++) 
	{
		switch(state) {
		case 0:
			if (strWord[i]>='0' && strWord[i]<='9') {
				state = 2;
				bAtEndState = false;
				strNum.append(1,strWord[i]);
			}
			else if ('.'==strWord[i]) {
				state = 1;
				bAtEndState = false;
				strNum.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 1:
			if (strWord[i]>='0' && strWord[i]<='9') {
				state = 2;
				bAtEndState = false;
				strNum.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 2:
			if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z')) 
			{
				state = 3;
				bAtEndState = true;
				strTemp.append(1,strWord[i]);
			}
			else if (strWord[i]>='0' && strWord[i]<='9') {
				state = 2;
				bAtEndState = false;
				strNum.append(1,strWord[i]);
			}
			else if ('.'==strWord[i]) {
				state = 1;
				bAtEndState = false;
				strNum.append(1,strWord[i]);
			}
			else if (','==strWord[i]) {
				state = 1;
				bAtEndState = false;
				strNum.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 3:
			if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z')) 
			{
				state = 4;
				bAtEndState = true;
				strTemp.append(1,strWord[i]);
			}
			else if ('.'==strWord[i]) {
				state = 6;
				bAtEndState = false;
				strTemp.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 4:
			if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z')) 
			{
				state = 4;
				bAtEndState = true;
				strTemp.append(1,strWord[i]);
			}
			else if ('.'==strWord[i]) {
				state = 5;
				bAtEndState = true;
				strTemp.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 5:
			bNormalQuit = false;
			break;
		case 6:
			if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z')) 
			{
				state = 7;
				bAtEndState = true;
				strTemp.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 7:
			if ('.'==strWord[i]) {
				state = 8;
				bAtEndState = true;
				strTemp.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 8:
			if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z')) 
			{
				state = 7;
				bAtEndState = true;
				strTemp.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		default:
			assert(false);
		} // switch;
	} // for
	if(bNormalQuit&&bAtEndState) {
		if(PatternNumeral(strNum,strNumPat)){
			strPattern = strNumPat + strTemp;
			return true;
		}
	}

	len = strWord.length();
	strTemp.erase(strTemp.begin(),strTemp.end());
	for(i=0, state=0, bAtEndState=false, bNormalQuit=true;
	i<len && bNormalQuit;
	i++) 
	{
		switch(state) {
		case 0:
			if (strWord[i]>='0' && strWord[i]<='9') {
				state = 1;
				bAtEndState = false;
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 1:
			if (strWord[i]>='0' && strWord[i]<='9') {
				state = 1;
				bAtEndState = false;
			}
			else if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z')) 
			{
				strTemp.append(1,strWord[i]);
				state = 2;
				bAtEndState = false;
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 2:
			if (strWord[i]>='0' && strWord[i]<='9') {
				state = 3;
				bAtEndState = true;
			}
			else if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z')) 
			{
				strTemp.append(1,strWord[i]);
				state = 2;
				bAtEndState = false;
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 3:
			if (strWord[i]>='0' && strWord[i]<='9') {
				state = 3;
				bAtEndState = true;
			}
			else {
				bNormalQuit = false;
			}
			break;
		default:
			assert(false);
		}
	}
	if(bNormalQuit&&bAtEndState) {
		strPattern = "{i}" + strTemp + "{i}";
		return true;		
	}
	return false;
}
//  '  +  {i}
//  '  +  {i} + s
//  {i}  + ' + s
//  如 '90s  2005's 1980's 60's 16's  '90
bool CLibLexic::PatternIS(string strWord,string& strPattern)
{
	string strTempPat;
	bool bNormalQuit,bAtEndState;
	int i,state,len;

	len = strWord.length();
 	bNormalQuit = true; 
	bAtEndState = false; 
	for(i=0 , state=0; i<len && bNormalQuit; i++)
	{
		switch(state) {
		case 0:
			if (strWord[i]>='0' && strWord[i]<='9') 
			{
				bAtEndState = false;
				state = 3;
			}
			else if (strWord[i]=='\'') {
				strTempPat = "'";
				bAtEndState = false;
				state = 1;
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 1:
			if (strWord[i]>='0' && strWord[i]<='9') 
			{
				bAtEndState = true;
				state = 2;
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 2:
			if (strWord[i]>='0' && strWord[i]<='9') 
			{
				bAtEndState = true;
				state = 2;
			}
			else if (strWord[i]=='s') 
			{
				strTempPat = strTempPat + "{i}s";
				bAtEndState = true;
				state = 5;
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 3:
			if (strWord[i]>='0' && strWord[i]<='9') 
			{
				bAtEndState = false;
				state = 3;
			}
			else if (strWord[i]=='\'') {
				strTempPat = "{i}'";
				bAtEndState = false;
				state = 4;
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 4:
			if (strWord[i]=='s') 
			{
				strTempPat = strTempPat + "s";
				bAtEndState = true;
				state = 5;
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 5:
			bNormalQuit = false;
			break;
		default:
			assert(false);
		} // switch
	} // for
	if(bNormalQuit&&bAtEndState) {
		if(2==state){
			strTempPat = strTempPat + "{i}";
		}
		strPattern = strTempPat;
		return true;
	}
	return false;
}
// 任意字符 + (s)  s不分大小写
// 任意字符 + (es) es不分大小写
//  (全小写字母)在单词的前,中,后
bool CLibLexic::PatternLSR(string strWord, string& strPattern)
{
	string strTemp;
	int i,len,state;
	bool bNormalQuit,bAtEndState,bFitted;
	len = strWord.length();

	bNormalQuit = true;
	bAtEndState = false;
	for(i=0,state=0; i<len && bNormalQuit; i++)
	{
		switch(state) {
		case 0:
			if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z')) 
			{
				state = 0;
				bAtEndState = false;
				strTemp.append(1,strWord[i]);
			}
			else if ('('==strWord[i]) {
				state = 1;
				bAtEndState = false;
				//strTemp.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 1:
			if ( strWord[i]>='a' && strWord[i]<='z') 
			{
				state = 2;
				bAtEndState = false;
				strTemp.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 2:
			if  ( strWord[i]>='a' && strWord[i]<='z')
			{
				state = 2;
				bAtEndState = false;
				strTemp.append(1,strWord[i]);
			}
			else if (')'==strWord[i]) {
				state = 3;
				bAtEndState = true;
				//strTemp.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 3:
			if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z')) 
			{
				state = 4;
				bAtEndState = true;
				strTemp.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		case 4:
			if ( ( strWord[i]>='a' && strWord[i]<='z') || ( strWord[i]>='A' && strWord[i]<='Z')) 
			{
				state = 4;
				bAtEndState = true;
				strTemp.append(1,strWord[i]);
			}
			else if ('('==strWord[i]) {
				state = 1;
				bAtEndState = false;
				//strTemp.append(1,strWord[i]);
			}
			else {
				bNormalQuit = false;
			}
			break;
		default:
			assert(false);
		}
	}
	bFitted = (bNormalQuit&&bAtEndState);

	if(!bFitted) {
		bNormalQuit = true;
		if(len < 4)  {
			bNormalQuit = false;
		}
		if(bNormalQuit) {
			strTemp.erase(strTemp.begin(),strTemp.end());
			strTemp.append(strWord,len-3,3);
			ToLower(strTemp);
			if(strTemp.compare("(s)")==0) {
				//strTemp = strWord;
				strTemp.erase(strTemp.begin(),strTemp.end());
				strTemp.append(strWord,0,len-3);
				strTemp = strTemp + "s";
			}
			else {
				bNormalQuit = false;
			}
		}
		bFitted = bNormalQuit;
	}

	if(!bFitted) {
		bNormalQuit = true;
		if(len < 5)  {
			bNormalQuit = false;
		}
		if(bNormalQuit) {
			strTemp.erase(strTemp.begin(),strTemp.end());
			strTemp.append(strWord,len-4,4);
			ToLower(strTemp);
			if(strTemp.compare("(es)")==0) {
				//strTemp = strWord;
				strTemp.erase(strTemp.begin(),strTemp.end());
				strTemp.append(strWord,0,len-4);
				strTemp = strTemp + "es";
			}
			else {
				bNormalQuit = false;
			}
		}
		bFitted = bNormalQuit;
	}
	if(bFitted)
		strPattern = strTemp;
	return bFitted;
}

void CLibLexic::ToLower(string &str)
{
	string strTemp;
	strTemp = str;
	str.erase(str.begin(),str.end());
		for(int i=0; i<strTemp.length(); i++)
		{
			if( strTemp[i]>='A' && strTemp[i]<='Z') {
				str.append(1,strTemp[i]-'A'+'a');
			}
			else {
				str.append(1,strTemp[i]);
			}
		} //将大写字母变为小写字母 
}

⌨️ 快捷键说明

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