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

📄 lex.cpp

📁 基于C++的编译器词法分析模块生成器[Lex]
💻 CPP
字号:


#include "stdafx.h"
#include "lex.h"

ifstream fin;
ofstream fout;
string curstr;
dfa_state_map dfa;
state_action_map action;

int lineno = 1;
int state = 1;

void WriteToken(int token);
void ProcessNum();
void ProcessId();
void ReportParseError();


//DFA terminal state process function
void ProcessEndState(int state){
	switch(state){
		case 2: {;}break;
		case 3: {WriteToken(NEWLINE);}break;
		case 4: {lineno++;}break;
		case 5: {WriteToken(LPAR);}break;
		case 6: {WriteToken(RPAR);}break;
		case 7: {WriteToken(TIMES);}break;
		case 8: {WriteToken(PLUS);}break;
		case 9: {WriteToken(COMMA);}break;
		case 10: {WriteToken(MINUS);}break;
		case 11: {WriteToken(DOT);}break;
		case 12: {WriteToken(DIVIDE);}break;
		case 13: {WriteToken(NUMBER);ProcessNum();}break;
		case 14: {WriteToken(SEMICOLON);}break;
		case 15: {WriteToken(ASSIGN);}break;
		case 16: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 17: {WriteToken(LBRACK);}break;
		case 18: {WriteToken(RBRACK);}break;
		case 19: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 20: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 21: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 22: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 23: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 24: {WriteToken(LBRACE);}break;
		case 25: {WriteToken(RBRACE);}break;
		case 26: {;}break;
		case 27: {WriteToken(NUMBER);ProcessNum();}break;
		case 28: {WriteToken(EQUAL);}break;
		case 29: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 30: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 31: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 32: {WriteToken(IF);}break;
		case 33: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 34: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 35: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 36: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 37: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 38: {WriteToken(INT);}break;
		case 39: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 40: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 41: {WriteToken(ELSE);}break;
		case 42: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 43: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 44: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 45: {WriteToken(FLOAT);}break;
		case 46: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 47: {WriteToken(IDENTIFIER);ProcessId();}break;
		case 48: {WriteToken(RETURN);}break;
		case 49: {WriteToken(STRUCT);}break;
		default:{ReportParseError();}break;
	}
}


void WriteToken(int token){
	fout<<unsigned char(token);
}

void ProcessNum(){
	fout<<unsigned char(0x20)<<curstr<<unsigned char(0x20);
}

void ProcessId(){
	fout<<unsigned char(0x20)<<curstr<<unsigned char(0x20);
}

void ReportParseError(){
	cerr<<"\nParse Error!\n";
	cerr<<"Line "<<lineno<<": "<<curstr<<"_<--";
	cerr<<"\n\n";
	fout<<"\nParse Error!\n";
	fout<<"Line "<<lineno<<": "<<curstr<<"_<--";
	fout<<"\n\n";

	fin.close();
	fout.close();

	exit(0);
}

void InitDFA(){
	ifstream dfain;
	dfain.open("dfa.bin", ios::binary);
	if (!dfain){
		cerr<<"\nError: DFA code file not found.\n";
		exit(0);
	}

	cout<<"\nloading DFA...\n";
	unsigned long start = GetTickCount();
	while(int(dfain.get())!=0x00){
		dfain.unget();
		int from = int(dfain.get());
		char transition = char(dfain.get());
		int to = int(dfain.get());
		dfa[from][transition] = to;
	}
	int state_count = int(dfain.get());
	for (int i = 0; i < state_count; i++){
		if (int(dfain.get())==0x00){
			action[i+1] = "";
			dfain.get();
		}
		else{
			getline(dfain, action[i+1]);
		}
	}
	cout<<"Loading complete, "<<GetTickCount()-start<<" ms.\n";

	dfain.close();
}

int _tmain(int argc, _TCHAR* argv[])
{
	InitDFA();

	switch(argc){
		case 1:
			{
				fin.open("test.txt", ios::binary);
				fout.open("tokenlist.bin", ios::binary);
			}
			break;
		case 2:
			{
				;
			}
			break;
		case 3:
			{
				fin.open(argv[1], ios::binary);
				fout.open(argv[2], ios::out);
			}
			break;
		default:
			cerr<<"\Error: illegal parameters.\n";
			break;
	}
	if (!fin){
		cerr<<"\nError: can't open source file.\n";
		exit(0);
	}
	if (!fout){
		cerr<<"\nError: can't open output file.\n";
		exit(0);
	}

	char c;
	cout<<"\n------------------------------------------\n";
	cout<<lineno<<' ';
	while(!fin.eof()){
		c = fin.get();
		if (dfa[state][c]!=0){
			state = dfa[state][c];
			curstr += c;
		}
		else{
			ProcessEndState(state);
			if (dfa[1][c]==0){
				if (fin.eof()) break;
				ReportParseError();
			}
			else{
				state = dfa[1][c];
				curstr.clear();
				curstr += c;
			}
		}
		cout<<c;
		if (c==0x0a){
			cout<<lineno<<' ';
		}
	}

	cout<<"\n------------------------------------------\n";
	cout<<"\nParse complete.\n";

	return 0;
}

⌨️ 快捷键说明

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