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

📄 cifafenxiqi.cpp

📁 自己做的一个词法分析器
💻 CPP
字号:
#include<iostream.h> 
#include<fstream.h> 
#include<stdlib.h> 
#include<stdio.h> 
#include<string.h> 
#include<conio.h>
#include<process.h> /*头文件*/

 
void init(); 
char *DchangeB(char *buf); 
int search(char *buf,int type,int command); 
void intdeal(char *buffer); 
void chardeal(char *buffer); 
void errordeal(char error,int lineno); 
void scanner();
 
void init() 
{ 
	char *key[]={" ","auto","break","case","char","const","continue","default","do","double",
		         "else","enum","extern","float","for","goto","if","int","long","register",
				 "return","short","signed","sizeof","static","struct","switch","typedef",
				 "union","unsigned","void","volatile","while","bool","class","new","friend",
				 "true","delete","using","namespsce","private","protected","publec","this"};
	             /*C++语言所有关键字*/ 
	char *limit[]={" ","(",")","<",">","->",".","!","++","—","&","~","/","%","+","-","<<",">>","[",
                   "<=",">",">=","==","!=","&&","||","=","+=","-=","*=","/=",",",";","{","}","#",
			       "_","'","//","/*","*/"}; /*运算、限界符*/ 
	fstream outfile; 
	int i,j; 
	char *c; 
	outfile.open("key.txt",ios::out); 
	for(i=0;i<32;i++) 
		outfile<<key[i]<<endl; 
	outfile.close(); 
	outfile.open("Limit.txt",ios::out); 
	for(j=0;j<38;j++) 
		outfile<<limit[j]<<endl; 
	c=""; 
	outfile<<c; 
	outfile.close(); 
	outfile.open("bsf.txt",ios::out); 
	outfile.close(); 
	outfile.open("cs.txt",ios::out); 
	outfile.close(); 
	outfile.open("output.txt",ios::out); 
	outfile.close(); 
}
 
char *DchangeB(char *buf) 
{ 
	int temp[20]; 
	char *binary; 
	int value=0,i=0,j; 
	for(i=0;buf[i]!='0';i++) 
		value=value*10+(buf[i]-48); /*将字符转化为十进制数*/ 
	if(value==0) 
	{ 
		binary=new char[2]; 
		binary[0]='0'; 
		binary[1]='0'; 
		return(binary); 
	} 
	i=0; 
	while(value!=0) 
	{ 
		temp[i++]=value%2; 
		value/=2; 
	} 
	temp[i]='0'; 
	binary=new char[i+1]; 
	for(j=0;j<=i-1;j++) 
		binary[j]=(char)(temp[i-j-1]+48); 
	binary[i]='0'; 
	return(binary); /*十进制转化为二进制*/ 
}
 
int search(char *buf,int type,int command) 
{ 
	int number=0; 
	fstream outfile; 
	char ch; 
	char temp[30]; 
	int i=0; 
	switch(type) 
	{ 
	case 1: outfile.open("key.txt",ios::in);break; 
	case 2: outfile.open("bsf.txt",ios::in);break; 
	case 3: outfile.open("cs.txt",ios::in);break; 
	case 4: outfile.open("limit.txt",ios::in);break; 
	} 
	outfile.get(ch); 
	while(ch!=EOF) 
	{ 
		while(ch!=' ') 
		{ 
			temp[i++]=ch; 
			outfile.get(ch); 
		} 
		temp[i]='0'; 
		i=0; 
		number++; 
		if(strcmp(temp,buf)==0) 
		{ 
			outfile.close(); 
			return number; /*若找到,返回在相应表中的序号*/ 
		} 
		else 
			outfile.get(ch);
	} //结束外层while循环 
	if(command==1) 
	{ 
		outfile.close( ); 
		return 0; /*找不到,当只需查表,返回0,否则还需造表*/ 
	} 
	switch(type) 
	{ 
	case 1: outfile.open("key.txt",ios::in);break; 
	case 2: outfile.open("bsf.txt",ios::in);break; 
	case 3: outfile.open("cs.txt",ios::in);break; 
	case 4: outfile.open("limit.txt",ios::in);break; 
	} 
	outfile<<buf; 
	outfile.close(); 
	return number+1; 
}
 
void chardeal(char *buffer) 
{ 
	fstream outfile; 
	int result; 
	result=search(buffer,1,1); /*先查关键字表*/ 
	outfile.open("output.txt",ios::app); 
	if(result!=0) 
	{ 
		cout<<buffer<<"是关键字"<<endl; 
		outfile<<buffer<<result<<endl; 
	} /*若找到,写入输出文件*/ 
	else 
	{ 
		result=search(buffer,2,2); /*若找不到,则非关键字,查标识符表,还找不到则造入标识符表*/ 
		outfile<<buffer<<result<<endl; 
	} /*写入输出文件*/ 
	outfile.close(); 
}
 
void errordeal(char error,int lineno) 
{ 
	cout<<" error: "<<error<<" ,line"<<lineno<<endl; 
}
 
void scanner() 
{ 
	fstream infile,outfile; 
	char filename[20]; 
	char ch; 
	int err=0; 
	int i=0,line=1; 
	int count,result,errorno=0; 
	char array[30]; 
	char *word; 
	cout<<" 请输入要分析的文件名:"; 
	cin>>filename; 
	err=1; 
	infile.open(filename,ios::nocreate|ios::in); 
	while(! infile) 
	{ 
		cout<<"不能打开文件"<<endl; 
		cout<<"请重新输入要分析的文件名: "; 
		cin>>filename; 
		infile.open(filename,ios::nocreate|ios::in); 
		err++; 
		if(err==3) 
		{ 
			cout<<"SORROY YOU CAN'T VIEW THE PROGRAME "; 
			cout<<"TANKE YOU VIEW"<<endl; 
			exit(0); 
		} 
	} 
	infile.get(ch); 
	while(ch!=EOF) 
	{ /*按字符依次扫描源程序,直至结束*/ 
		i=0; 
		if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')) 
		{/*以字母开头*/  
			while(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')||
				((ch>='0')&&(ch<='9'))) 
			{ 
				array[i++]=ch; 
				infile.get(ch); 
			} 
			word=new char[i+1]; 
			word[i]='0'; 
			chardeal(word); 
			if(ch!=EOF) 
				infile.seekg(-1,ios::cur); 
		} 
		else 
			if(ch>='0'&&ch<='9') 
			{ /*以数字开头*/ 
				while(ch>='0'&&ch<='9') 
				{ 
					array[i++]=ch; 
					infile.get(ch); 
				} 
				word=new char[i+1]; 
				word[i]='0'; 
				cout<<word<<"为常数;"<<endl; 
				if(ch!=EOF) 
					infile.seekg(-1,ios::cur); 
			} 
			else 
				if((ch==' ')||(ch=='\t')) 
					infile.get(ch);/*消除空格符和水平制表符*/ 
				else 
					if(ch=='\n')
					{	
						infile.get(ch);
						line++; /*消除回车并记录行数*/
					}
					else 
						if(ch=='/') 
						{ /*消除注释*/ 
							infile.get(ch); 
							if(ch=='=') 
							{ /*判断是否为‘/=’符号*/ 
								outfile.open("output.txt",ios::noreplace|ios::app); 
								cout<<"/= 为运算符; "; 
								outfile<<"/=\t\t\t4\t\t\t32\n"; 
								outfile.close(); 
							} 
							else 
								if(ch!='*') 
								{ /*若为除号,写入输出文件*/ 
									outfile.open("output.txt",ios::noreplace|ios::app); 
									cout<<"/ 为运算符; "; 
									outfile<<"/\t\t\t4\t\t\t13\n"; 
									outfile.close(); 
									outfile.seekg(-1,ios::cur); 
								} 
								else 
									if(ch=='*') 
									{ /*若为注释的开始,消除包含在里面的所有字符*/ 
										count=0; 
										infile.get(ch); 
										while(count!=2) 
										{ /*当扫描到‘*’且紧接着下一个字符为‘/’才是注释的结束*/ 
											count=0; 
											while(ch!='*') 
												infile.get(ch); 
											count++; 
											infile.get(ch); 
											if(ch=='/') 
												count++; 
											else 
												infile.get(ch); 
										} 
									} 
						} 
						else 
							if(ch=='"') 
							{ /*消除包含在双引号中的字符串常量*/ 
								outfile.open("output.txt",ios::noreplace|ios::app); 
								outfile<<ch<<"\t\t\t4\t\t\t37\n"; 
								outfile.close();
								while(ch!='"') 
								{ 
									infile.get(ch); 
									infile<<ch<<"\t\t\t4\t\t\t37\n"; 
									cout<<ch; 
								} 
								cout<<"为常量;"<<endl; 
								infile.close(); 
							} 
							else 
							{ /*首字符为其它字符,即运算限界符或非法字符*/ 
								array[0]=ch; 
								infile.get(ch); /*再读入下一个字符,判断是否为双字符运算、限界符*/ 
								if(ch!=EOF) 
								{ /*若该字符非文件结束符*/ 
									array[1]=ch; 
									word=new char[3]; 
									word[2]='0'; 
									result=search(word,4,1); /*先检索是否为双字符运算、限界符*/ 
									if(result==0) /*若不是*/ 
										word=new char[2]; 
									else 
									{ /*若为双字符运算、限界符,写入输出文件*/ 
										outfile.open("output.txt",ios::noreplace|ios::app); 
										cout<<word<<endl; 
										outfile<<word<<"\t\t\t4\t\t\t"<<result<<endl;
										outfile.close( ); 
									} 
									word[1]='0'; 
									result=search(word,4,1); /*检索是否为单字符运算、限界符*/ 
									if(result==0) 
									{ /*若还不是,则为非法字符*/ 
										errordeal(array[0],line); 
										errorno++; 
										infile.seekg(-1,ios::cur); 
									} 
									else 
									{ /*若为单字符运算、限界符,写入输出文件并将扫描文件指针回退一个字符*/ 
										outfile.open("output.txt",ios::noreplace|ios::app); 
										cout<<word<<endl; 
										outfile<<word<<"\t\t\t4\t\t\t"<<result<<"\t"<<endl; 
										outfile.close(); 
										infile.seekg(-1,ios::cur); 
									} 
								} 
								else 
								{ /*若读入的下一个字符为文件结束符*/ 
									word=new char[2]; 
								    word[1]='0'; 
								    result=search(word,4,1); /*只考虑是否为单字符运算、限界符*/ 
								    if(result==0) /*若不是,转出错处理*/ 
										errordeal(array[0],line); 
								    else 
									{ /*若是,写输出文件*/ 
										outfile.open("output.txt",ios::noreplace|ios::app); 
									    cout<<word<<endl; 
									    cout<<word<<endl; 
									    outfile<<word<<"\t\t\t4\t\t\t"<<result<<"\t"<<endl; 
									    outfile.close(); 
									} 
								}
								infile.get(ch);
							}
							infile.close(); 
							cout<<"一共出现了"<<errorno<<"错误."; /*报告错误字符个数*/ 
}
 
void main() 
{
	char yn; 
	do 
	{ 
		init(); /*初始化*/ 
		scanner();/*扫描源程序*/ 
		cout<<"是否继续进行(y/n)\n "; //判断是否继续?
		cin>>yn;
		 
	} 
	while(yn=='y'||yn=='Y');
	cout<<"谢谢使用!!"<<endl;
}

⌨️ 快捷键说明

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