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

📄 lexicalanalyzer.cpp

📁 对象为c语言子集的词法分析程序 个人的课程代码
💻 CPP
字号:
#include "LexicalAnalyzer.h"

LexicalAnalyzer::LexicalAnalyzer(char* src)
{	
	infile.open(src, ios::in);
	assert( infile );
	NUM_OF_STATES = 19;
	transitionTable = new set<int>*[NUM_OF_STATES];
	for ( int i=0; i<NUM_OF_STATES; i++ )
	{
		transitionTable[i] = new set<int>[128];
	}
	isFinal = new bool[NUM_OF_STATES];
	for ( int i=0 ;i<NUM_OF_STATES; i++ )
		isFinal[i] = false;

	//head
	transEpsilon(0,1);
	transEpsilon(0,3);

	//id
	transLetter(1,2);
	transLetter(2,2);
	transDigit(2,2);

	//num
	transDigit(3,4);
	transDigit(4,4);
	transitionTable[4][int('.')].insert(5);
	transitionTable[4][int('e')].insert(8);
	transDigit(5,6);
	transDigit(6,6);
	transitionTable[6][int('e')].insert(8);
	transitionTable[8][int('+')].insert(9);
	transitionTable[8][int('-')].insert(9);
	transEpsilon(8,9);
	transDigit(9,10);
	transDigit(10,10);
	
	//=
	transitionTable[0][int('=')].insert(7);

	//+-*/
	transitionTable[0][int('+')].insert(12);
	transitionTable[0][int('-')].insert(12);
	transitionTable[0][int('*')].insert(12);
	transitionTable[0][int('/')].insert(12);

	//{
	transitionTable[0][int('{')].insert(13);

	//}
	transitionTable[0][int('}')].insert(14);

	//(
	transitionTable[0][int('(')].insert(15);

	//)
	transitionTable[0][int(')')].insert(16);

	//;
	transitionTable[0][int(';')].insert(17);

	//,
	transitionTable[0][int(',')].insert(18);

	isFinal[2] = true;
	isFinal[4] = true;
	isFinal[6] = true;
	isFinal[7] = true;
	isFinal[10] = true;
	isFinal[12] = true;
	isFinal[13] = true;
	isFinal[14] = true;
	isFinal[15] = true;
	isFinal[16] = true;
	isFinal[17] = true;
	isFinal[18] = true;
}

LexicalAnalyzer::~LexicalAnalyzer(void)
{
	for ( int i=0; i<NUM_OF_STATES; i++ )
	{
		delete []transitionTable[i];
	}
	delete []transitionTable;
}


//LexicalAnalyzer* LexicalAnalyzer::getInstance(string src)
//{
//	if ( instance == NULL )
//		instance = new LexicalAnalyzer(src);
//	return instance;
//}


string LexicalAnalyzer::getNextToken(string& token)
{
	int lastAccpState = -1;
	curLexLen = 0;
	char c;
	set<int> intiState;
	intiState.insert(0);
	set<int> S = getEpsilonClosure(intiState);
	c = getNextChar();
	if (c==-1)
	{
		token = "#";
		return "termination";
	}
	while (c!=-1 && !S.empty()) 
	{
		if (c==' '|| c=='\t'|| c=='\n')
		{
			break;
		}
		S = getEpsilonClosure(move(S, c));
		lastAccpState = currentFinalState;
		c = getNextChar();
	}

	token = "";
	while (curLexLen!=0)
	{
		token += innedSq.front();
		curLexLen--;
		innedSq.pop();
	}
	lastSq = innedSq;
	while (!innedSq.empty())
	{
		innedSq.pop();
	}

	switch(lastAccpState)
	{
	case -1:
		return "error";
	case 2:
		if (symbTbl.isKeyword(token))
			return "keyword";
		symbTbl.installId(currentToken);
		return "identifier";
	case 4:
	case 6:
	case 10:
		symbTbl.installNum(currentToken);
		return "number";
	case 7:
		return "assignOp";
	case 12:
		return "arithmeticOP";
	case 13:
		return "leftBrace";
	case 14:
		return "rightBrace";
	case 15:
		return "leftpPrentheses";
	case 16:
		return "rightPrentheses";
	case 17:
		return "semicolon";
	case 18:
		return "comma";
	default:
		assert(false);
	}
}


void LexicalAnalyzer::transLetter(int startState, int endState)
{
	for ( char c='a'; c<='z'; c++ )
		transitionTable[startState][int(c)].insert(endState);
	for ( char c='A'; c<='Z'; c++ )
		transitionTable[startState][int(c)].insert(endState);
}

void LexicalAnalyzer::transDigit(int startState, int endState)
{
	for ( char c='0'; c<='9'; c++ )
		transitionTable[startState][int(c)].insert(endState);
}

void LexicalAnalyzer::transEpsilon(int startState, int endState)
{
	transitionTable[startState][0].insert(endState);
}


set<int> LexicalAnalyzer::getEpsilonClosure(set<int> T)
{
	set<int> ET = T;
	stack<int> s;
	for( set<int>::iterator i = T.begin(); i!=T.end(); ++i)
	{
		s.push(*i);
	}

	while (!s.empty())
	{
		int t = s.top();
		s.pop();
		for ( set<int>::iterator u = transitionTable[t][0].begin(); u!=transitionTable[t][0].end(); ++u )
		{
			if (ET.find(*u)==ET.end())
			{
				ET.insert(*u);
				s.push(*u);
			}
		}
	}
	return ET;
}

set<int> LexicalAnalyzer::move(set<int> s, char a)
{
	set<int> rs;
	for ( set<int>::iterator i = s.begin(); i!=s.end(); ++i)
	{
		set<int> rsi = transitionTable[*i][int(a)];
		for (set<int>::iterator j = rsi.begin(); j!=rsi.end(); ++j)
		{
			if ( rs.find(*j)== rs.end() )
			{
				rs.insert(*j);
				if (isFinal[*j])
				{
					currentFinalState = *j;
					curLexLen = innedSq.size();
				}
			}
		}
	}
	return rs;
}

char LexicalAnalyzer::getNextChar()
{ 
	char c;
	if (!lastSq.empty())
	{
		c = lastSq.front();
		lastSq.pop();
	}
	else 
		c = infile.get();
	if (!(c==' '|| c=='\t'|| c=='\n'||c=='\#'))
		innedSq.push(c);
	return c;
}

⌨️ 快捷键说明

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