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

📄 c++词法分析.cpp

📁 一个读单词过程
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<ctype.h>
#include<string.h>
//#define KEY_No 1
//#define ID_No 2
//#define Number_No 3
//#define Sign_No 4
//#define Other_No 5
int isID();    //英文单词
int isNbr();   //无符号整形数
int match();   //保留字
void other();  //字符函数
void report_error(); //出错信息
char token[20];  //字符长度
char file[20];   //文件名长度
FILE *fp;
char ch;    //用于存放取到的一个字符
int i;
int main()
{
	cout<<"请输入文件名:";
	cin>>file;
	cout<<endl;
	fp=fopen(file,"r");//读文件
	if(fp)
	{
		ch=fgetc(fp); //读取一个字符
		while(ch!=EOF)  //判断
		{
			if(isalpha(ch))
			{
				if(isID())
				{
					if(match())	
						cout<<"("<<"保留字,"<<token<<")";//输出关键字
					else
						cout<<"("<<"标识符,"<<token<<")";//输出标识符
				}
			}
	        else
			{
		        if(isdigit(ch))
			        isNbr();             //整形数的情况
		        else
			        other();             //运算符、分割符时的情况
			}
			ch=fgetc(fp);
			cout<<'\n';
		}
		cout<<endl<<endl;
	}
	else 
		cout<<"你所想找的文件不存在!"<<endl<<endl;//找不到该文件
	return 0;
}
int isID()     //单词的情况
{
	token[0]=ch;
	ch=fgetc(fp);
	i=1;
	while(isalnum(ch)||ch=='_')
	{
		token[i]=ch;
		i++;
		ch=fgetc(fp);
	}
	token[i]='\0';
	fseek(fp,-1,1);
	return 1;
}
int isNbr()     //判断并输出无符号整形数
{
	token[0]=ch;
	ch=fgetc(fp);
	i=1;
	while(isdigit(ch)||ch=='.')
	{
		token[i]=ch;
		i++;
		ch=fgetc(fp);
	}
	token[i]='\0';
	fseek(fp,-1,1);
	cout<<"(无符号整形数,"<<token<<")";
	return 1;
}
int match()       //逐个查找验证是不是保留字
{
	char *keyword[]=
	{
	"if","else","int","while","return","continue","for","do","bresk"
	};
	for(int i=0;i<9;i++)
	{
		if(!strcmp(token,keyword[i]))
		{
			return 1;
			break;
		}		
	}
	return 0;
}
void other()      //判断并输出运算符,标识符
{
	switch(ch)
	{
	case'<':
		ch=fgetc(fp);
		if(ch=='<')
		{
			ch=fgetc(fp);
			if(ch=='=')
				cout<<"(运算符,<<=)";
			else{
				fseek(fp,-1,1);
				cout<<"(运算符,<<)";
			}
		}
		else{
			if(ch=='=')
				cout<<"(运算符,<=)";
			else{
				fseek(fp,-1,1);
				cout<<"(运算符,<)";
			}
		}
		break;
	case'=':
		ch=fgetc(fp);
		if(ch=='=')
			cout<<"(运算符,==)";
		else
		{
			fseek(fp,-1,1);
			cout<<"(运算符,=)";
		}
		break;
	case'>':
		ch=fgetc(fp);
		if(ch=='>')
		{
			ch=fgetc(fp);
			if(ch=='=')
				cout<<"(运算符,>>=)";
			else
			{
				fseek(fp,-1,1);
				cout<<"(运算符,>>)";
			}
		}
		else{
			if(ch=='=')
				cout<<"(运算符,>=)";
			else
			{
				fseek(fp,-1,1);
				cout<<"(运算符,>)";
			}
		}
		break;
	case'+':
		ch=fgetc(fp);
		if(ch=='+')
			cout<<"(运算符,++)";
		else
		{
			if(ch=='=')
				cout<<"(运算符,+=)";
			else
			{
				fseek(fp,-1,1);
				cout<<"(运算符,+)";
			}
		}
		break;
	case'-':
		ch=fgetc(fp);
		switch(ch)
		{
		case'-':cout<<"(运算符,--)";
			break;
		case'=':cout<<"(运算符,-=)";
			break;
		case'>':cout<<"(运算符,->)";
			break;
		default:fseek(fp,-1,1);
			cout<<"(运算符,-)";
			break;
		}
	case'*':
		ch=fgetc(fp);
		if(ch=='=')
			cout<<"(运算符,*=)";
		else
		{
			fseek(fp,-1,1);
			cout<<"(运算符,*)";
		}
		break;
	case'&':
		ch=fgetc(fp);
		if(ch=='&')
		{
			ch=fgetc(fp);
			if(ch=='=')
				cout<<"(运算符,&&=)";
			else
			{
				fseek(fp,-1,1);
				cout<<"(运算符,&&)";
			}
		}
		else{
			fseek(fp,-1,1);
			cout<<"(运算符,&)";
		}
		break;
	case'|':
		ch=fgetc(fp);
		if(ch=='|')
		{
			ch=fgetc(fp);
			if(ch=='=')
				cout<<"(运算符,||=)";
			else
			{
				fseek(fp,-1,1);
				cout<<"(运算符,||)";
			}
		}
		else
		{
			if(ch=='=')
				cout<<"(运算符,|=)";
			else
			{
				fseek(fp,-1,1);
				cout<<"(运算符,|)";
			}
		}
		break;
	case'^':
		ch=fgetc(fp);
		if(ch=='=')
			cout<<"(运算符,^=)";
		else
		{
			fseek(fp,-1,1);
			cout<<"(运算符,^)";
		}
		break;
	case'!':
		ch=fgetc(fp);
		if(ch=='=')
			cout<<"(运算符,!=)";
		else
		{
			fseek(fp,-1,1);
			cout<<"(分割符,!)";
		}
		break;
	case'~':cout<<"(分割符,~)";
		break;
	case'.':cout<<"(分割符,.)";
		break;
	case'(':cout<<"(分割符,()";
		break;
	case')':cout<<"(分割符,))";
		break;
	case'{':cout<<"(分割符,{)";
		break;
	case'}':cout<<"(分割符,})";
		break;
	case'[':cout<<"(分割符,[)";
		break;
	case']':cout<<"(分割符,])";
		break;
	case',':cout<<"(分割符,,)";
		break;
	case';':cout<<"(分割符,;)";
		break;
	case'?':
		ch=fgetc(fp);
		if(ch==':')
			cout<<"(分割符,?:)";
		else
		{
			fseek(fp,-1,1);
			cout<<"(分割符,?)";
		}
		break;
	case':':
		ch=fgetc(fp);
		if(ch==':')
			cout<<"(分割符,::)";
		else
		{
			fseek(fp,-1,1);
			cout<<"(分割符,:)";
		}
		break;
	case'/':
		ch=fgetc(fp);
		switch(ch)
		{
		case'=':cout<<"(分割符,/=)";
			break;
		case'/':
			while(ch!='\n')
			{
		    	ch=fgetc(fp);
			}
			break;
		case'*':
			{
s1:             while(ch!='*')
				{
				    ch=fgetc(fp);
				}
			    ch=fgetc(fp);
			    if(ch!='/')
				    goto s1;
			}
			break;
		default:
			fseek(fp,-1,1);			
            cout<<"(分割符,/)";
			break;
		}
		break;
	case'\\':
		cout<<"(分割符,\\)";
		break;
	case'%':
		ch=fgetc(fp);
		if(ch=='=')
			cout<<"(分割符,%=)";
		else
		{
			fseek(fp,-1,1);
			cout<<"(分割符,%)";
		}
		break;
	case'@':cout<<"(分割符,@)";
		break;
	case'#':cout<<"(分割符,#)";
		break;
	case'"':cout<<"(分割符,\")";
		break;
	case' ':cout<<"(分割符,' ')";
		 break;
	case'\n':cout<<"(分割符,换行)";
		break;
    case'	':
		break;
	default:report_error();
		break;
	}
}
void report_error()
{
	cout<<"Error finds!";
}

		


	



⌨️ 快捷键说明

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