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

📄 lex.l

📁 基于C++的编译器词法分析模块生成器[Lex]
💻 L
字号:
%{#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();%}alpha			[A-Za-z]digit			[0-9]alphanum		[A-Za-z0-9]delim           [\t-\t\s-\s]rline           [\r-\r]nline           [\n-\n]%%{rline} {lineno++;}{nline} {WriteToken(NEWLINE);}{delim}{delim}* {;}{alpha}{alphanum}* {WriteToken(IDENTIFIER);ProcessId();}{digit}{digit}* {WriteToken(NUMBER);ProcessNum();}"int" {WriteToken(INT);}"if" {WriteToken(IF);}"else" {WriteToken(ELSE);}"return" {WriteToken(RETURN);}"float" {WriteToken(FLOAT);}"struct" {WriteToken(STRUCT);}"(" {WriteToken(LPAR);}")" {WriteToken(RPAR);}"{" {WriteToken(LBRACE);}"}" {WriteToken(RBRACE);}"[" {WriteToken(LBRACK);}"]" {WriteToken(RBRACK);}"==" {WriteToken(EQUAL);}"=" {WriteToken(ASSIGN);}";" {WriteToken(SEMICOLON);}"," {WriteToken(COMMA);}"." {WriteToken(DOT);}"+" {WriteToken(PLUS);}"-" {WriteToken(MINUS);}"*" {WriteToken(TIMES);}"/" {WriteToken(DIVIDE);}%%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 + -