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

📄 classes.cpp

📁 简单的有穷自动机词法分析
💻 CPP
字号:
#include  "Classes.h"


///////////////////////////////////////////
// function of protected.............
///////////////////////////////////////////
//对字符进行分类编码
int CWordAnalyzing::CodeChar(char ch)
{
	if(ch >= '0' && ch <= '9')
		return 0;
	else if( (ch >= 'a' && ch <= 'z')||(ch >= 'A' && ch <= 'Z') )
		return 1;
	else if(ch =='+' || ch =='-' || ch =='*'|| ch =='/' || ch =='=')
		return 2;
	else if( ch == '(' || ch == ')' || ch == ';')
		return 3;
	else if( ch == (char)9 || ch == (char)10 || ch == ' ' ||ch == (char)0)
		return 4;
	else if( ch == '.')
		return 5;
	else 
		return 6;
}


int CWordAnalyzing::GetNextState(int iCurrentState,int iIpt)
{
	return m_StateMap[iCurrentState][iIpt];
}
//end of protected function....


/////////////////////////////////////////////////
//  function of public...
/////////////////////////////////////////////////

CWordAnalyzing::CWordAnalyzing()
{
	m_pSrcChar = NULL;
	m_nCharLength = 0;
	m_iNodeUsedPos = 0;
	m_iWordLine = 1;
	m_pNode = new SResultNode[100];
	//m_StateMap[8][7];
	int arrTemp[8][7] ={
						{1,2,3,4,0,-1,-1},
						{1,-1,6,6,6,5,-1},
						{2,2,7,7,7,-1,-1},
						{-1,-1,-1,-1,-1,-1,-1},
						{-1,-1,-1,-1,-1,-1,-1},
						{1,-1,-1,-1,-1,-1,-1},
						{-1,-1,-1,-1,-1,-1,-1},
						{-1,-1,-1,-1,-1,-1,-1},
						};
	for(int i=0;i<8;i++)
	{
		for(int j=0;j<7;j++)
		{
			m_StateMap[i][j] = arrTemp[i][j];
		}
	}
}

CWordAnalyzing::~CWordAnalyzing()
{
	for(int i=0;i<m_iNodeUsedPos;i++)
	{
		delete []m_pNode[i].m_pWord;
	}
	delete []m_pNode;
}
void CWordAnalyzing::Create(char *pSrcChar,int nLength)
{
	m_pSrcChar = pSrcChar;
	m_nCharLength = nLength;
}
bool CWordAnalyzing::WordAnalyzing()
{
	int  iStrBeginPos =0;              //当前单词的开始位置
	int  iCurrentState = 0;            //当前状态
	int  iIpt = 0;                     //  当前状态接受的输入
	char ch;
	for(int i=0;i<m_nCharLength;i++)
	{
		
		ch = m_pSrcChar[i];
		int a = 1;
		if((int)ch == 10)
		{
			m_iWordLine++;
			//ch = m_pSrcChar[i];
		}
		
		iIpt = CodeChar(ch);
		iCurrentState = GetNextState(iCurrentState,iIpt);
		if(iCurrentState == 0)
		{
			iStrBeginPos = i+1;
			continue;
		}
		else if(iCurrentState == 3)
		{
			//开始填充单词属性
			m_pNode[m_iNodeUsedPos].m_pWord = new char[1];
			m_pNode[m_iNodeUsedPos].m_pWord[0] = ch;
			m_pNode[m_iNodeUsedPos].m_nWord =1;
			m_pNode[m_iNodeUsedPos].m_iCode = 3;
			m_iNodeUsedPos++;
			//结束填充

			iStrBeginPos = i+1;
			iCurrentState = 0;
		}
		else if(iCurrentState == 4)
		{
			//开始填充单词属性
			m_pNode[m_iNodeUsedPos].m_pWord = new char[1];
			m_pNode[m_iNodeUsedPos].m_pWord[0] = ch;
			m_pNode[m_iNodeUsedPos].m_nWord =1;
			m_pNode[m_iNodeUsedPos].m_iCode = 4;
			m_iNodeUsedPos++;
			//结束填充
			iStrBeginPos = i+1;
			iCurrentState = 0;
		}
		else if(iCurrentState == 6)
		{
			//开始填充单词属性
			m_pNode[m_iNodeUsedPos].m_pWord = new char[i-iStrBeginPos];
			int k=0;
			for(int j=iStrBeginPos;j<i;j++)
			{
				m_pNode[m_iNodeUsedPos].m_pWord[k] = m_pSrcChar[j];
				k++;
			}
			m_pNode[m_iNodeUsedPos].m_nWord =i-iStrBeginPos;
			m_pNode[m_iNodeUsedPos].m_iCode = 2;
			m_iNodeUsedPos++;
			//结束填充
			iStrBeginPos = i;
			i--;
			iCurrentState = 0;
		}
		else if(iCurrentState == 7)
		{
			//开始填充单词属性
			m_pNode[m_iNodeUsedPos].m_pWord = new char[i-iStrBeginPos];
			int k=0;
			for(int j=iStrBeginPos;j<i;j++)
			{
				m_pNode[m_iNodeUsedPos].m_pWord[k] = m_pSrcChar[j];
				k++;
			}
			m_pNode[m_iNodeUsedPos].m_nWord =i-iStrBeginPos;
			m_pNode[m_iNodeUsedPos].m_iCode = 1;
			m_iNodeUsedPos++;
			//结束填充
			iStrBeginPos = i;
			i--;
			iCurrentState = 0;
		}
		else if(iCurrentState == -1)
		{
			for(int j=iStrBeginPos;j<i;j++)
			{
				cout<<m_pSrcChar[j];
			}
			cout<<"*"<<"是不合法单词"<<endl;
			cout<<"在行"<<m_iWordLine<<"  "<<endl;
			return false;
		}
	}
	return true;
}

void CWordAnalyzing::DisPlayResult()
{
	for(int i=0;i<m_iNodeUsedPos;i++)
	{
		cout<<m_pNode[i].m_iCode<<"    ";
		for(int j=0;j<m_pNode[i].m_nWord;j++)
		{
			cout<<m_pNode[i].m_pWord[j];
		}
		
		cout<<endl;
	}
}

void CWordAnalyzing::GetWords(SResultNode **pNode,int &nLength)
{
	*pNode = m_pNode;
	nLength = m_iNodeUsedPos;
}
//end of public function...

⌨️ 快捷键说明

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