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

📄 wordanalyze.cpp

📁 用c编的能认一些保留字
💻 CPP
字号:
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;

string preserve_word[10]={"int","char","bool","long","struct","while","for","if","case","switch"};//保留字
//保留字内码
char inner_code[10][3]={{'0','0','0'},{'0','0','1'},{'0','0','2'},{'0','0','3'},{'0','0','4'},{'0','0','5'},
{'0','0','6'},{'0','0','7'},{'0','0','8'},{'0','0','9'}};
	
signed char table[9][7]={							//状态转换矩阵(实数)
	/*digit,'.','+','-','E','\n or space ',other*/
	{1,-1,-1,-1,-1,-1,-1},							//状态0(初试状态)的转换情况
	{1,2,-1,-1,4,9,-1},								//状态1的转换情况
	{3,-1,-1,-1,-1,-1,-1},							//状态2的转换情况
	{3,-1,-1,-1,4,9,-1},							//状态3的转换情况
	{7,-1,6,5,-1,9,-1},								//状态4的转换情况
	{7,-1,-1,-1,-1,-1,-1},							//状态5的转换情况
	{7,-1,-1,-1,-1,-1,-1},							//状态6的转换情况
	{8,-1,-1,-1,-1,9,-1},							//状态7的转换情况
	{-1,-1,-1,-1,-1,9,-1}};							//状态8的转换情况

bool IsCharater(char ch)  //判断该字符是否为小写字母,是返回真,否则返回假
{
	if((int)ch>=97&&(int)ch<=122) return true;
	else return false;
}

bool Isdigit(char ch)	  //判断该字符是否为数字,是返回真,否则返回假
{
	if((int)ch>=48&&(int)ch<=57) return true;
	else return false;
}

void convert(char *buffer)  //将该字符串表示的实数转换为双精度型
{
	
	int i=0,j=0,k,kk,n,flag;
	double temp=0,num;
	while(buffer[i]!='\0'&&buffer[i]!='.'&&buffer[i]!='E')
	{
		
		i++;
		j++;
	}
	k=i+1;
	
	for(i=0;i<j;i++) temp=temp*10+buffer[i]-'0';
	
	num=temp;
	
	if(buffer[j]=='.')
	{
		
		i=j=k;

		while(buffer[i]!='\0'&&buffer[i]!='E')
		{
			
			i++;
			j++;
		}
		
		kk=j;
		for(i=k,n=0,temp=0;i<j;i++)
		{
			temp=temp*10+buffer[i]-'0';
			n++;
			
		}
		for(i=0;i<n;i++) temp=temp/10;
		num+=temp;
		if(buffer[kk]=='E') 
		{
			for(j=k-1,i=kk;buffer[i]!='\0';i++,j++) buffer[j]=buffer[i];
			buffer[j]='\0';
		}
		
	}
	
	if(buffer[k-1]=='E')
	{
		
		temp=buffer[k+1]-'0';
		if(buffer[k+2]!='\0') 	temp=temp*10+buffer[k+2]-'0';
		if(buffer[k]=='+') {cout<<temp<<'\n';flag=1;}
	
		else if(buffer[k]=='-') flag=2;
	
		else if(buffer[k]!='\0')
		{
			temp=buffer[k]-'0';
			if(buffer[k+1]!='\0') temp=temp*10+buffer[k+1]-'0';
			flag=1;
		}
		if(flag==1) for(j=0;j<temp;j++) num*=10;
		else if(flag==2) for(j=0;j<temp;j++) num/=10;
	}
	sprintf(buffer,"%1.12e",num);
	//cout<<buffer;
}




void main(int argc,char *argv[])
{
	int i=0,j=0,k=0,tag=0,state=0,temp;
	char ch;
	char *buffer2=new char;
	string finname,foutname,buffer;

	FILE *fin,*fout;
	cout<<"This is 010851's word analyzer.\n"
		<<"First please input the main file name you want to analyze:  ";
	cin>>finname;
	cout<<"Then input the main file name you want to output:  ";
	cin>>foutname;
	finname=finname+".fin";
	foutname=foutname+".fou";
	fin=fopen(finname.c_str(),"r");
	if(fin==NULL)
	{
		cout<<"Can't open the source file!";
		exit(-1);
	}
	fout=fopen(foutname.c_str(),"w");
	if(fout==NULL)
	{
		cout<<"Can't open or creat the output file!";
		fclose(fin);
		exit(-1);
	}

	ch=fgetc(fin);
	while(ch!=EOF)
	{
		
		if(ch==' '||ch=='\n') ch=fgetc(fin);//需要改进!
		
		buffer="";
		
		if(IsCharater(ch)) //如果该字符串的首字符是小写英文字母的处理情况
		{
			do{
				buffer+=ch;
				ch=fgetc(fin);
			}while(IsCharater(ch)||Isdigit(ch));
		
			
			if(ch==' '||ch=='\n')
			{
				if(buffer=="int")
				{
					
					for(i=0;i<3;i++) fputc(inner_code[0][i],fout);
					fputc('\n',fout);
					
				}
				else if(buffer=="char")
				{
					for(i=0;i<3;i++) fputc(inner_code[1][i],fout);
					fputc('\n',fout);
				}
				else if(buffer=="bool")
				{
					for(i=0;i<3;i++) fputc(inner_code[2][i],fout);
					fputc('\n',fout);
				}
				else if(buffer=="long")
				{
					for(i=0;i<3;i++) fputc(inner_code[3][i],fout);
					fputc('\n',fout);
				}
				else if(buffer=="struct")
				{
					for(i=0;i<3;i++) fputc(inner_code[4][i],fout);
					fputc('\n',fout);
				}
				else if(buffer=="while")
				{
					for(i=0;i<3;i++) fputc(inner_code[5][i],fout);
					fputc('\n',fout);
				}
				else if(buffer=="for")
				{
					for(i=0;i<3;i++) fputc(inner_code[6][i],fout);
					fputc('\n',fout);
				}
				else if(buffer=="if")
				{
					for(i=0;i<3;i++) fputc(inner_code[7][i],fout);
					fputc('\n',fout);
				}
				else if(buffer=="case")
				{
				for(i=0;i<3;i++) fputc(inner_code[8][i],fout);
					fputc('\n',fout);
				}
				else if(buffer=="switch")
				{
					for(i=0;i<3;i++) fputc(inner_code[9][i],fout);
					fputc('\n',fout);
				}
				else
				{
					for(i=0;i<buffer.size();i++) buffer2[i]=buffer.at(i);
					buffer2[i]='\0';
					fprintf(fout,"Identify :%s \n",buffer2);		
			
				}
				
			}

			else
			{
				
				tag=0;
				do
				{	
					buffer+=ch;
					ch=fgetc(fin);
					if(ch==EOF)
					{
						tag=1;
						break;
						
					}
				}while(ch!=' '&&ch!='\n');
				for(i=0;i<buffer.size();i++) buffer2[i]=buffer.at(i);
				buffer2[i]='\0';
				fprintf(fout,"Error Constant: %s\n",buffer2);	
				if(tag==1) break;
				else continue;
			}
		}
		else if(Isdigit(ch)) //如果该字符串的首字符是数字的处理情况
		{
			
			i=0;
			state=0;
			while(state!=-1&&state!=9)
			{	
				if(isdigit(ch))
					j=0;
				else switch(ch)
				{
					case '.':j=1;break;
					case '+':j=2;break;
					case '-':j=3;break;
					case 'E':j=4;break;
					case '\n':j=5;break;
					case ' ':j=5;break;
					default:j=6;
				}
			
				temp=table[state][j];
				
				if(-1==temp)
				{
					buffer2[i]=ch;
					state=-1;
				}
				else
				{
					buffer2[i]=ch;
					i++;
					state=temp;
					ch=fgetc(fin);
				}
			}
			
			
			if(state==-1)
			{
			
				tag=0;
				while(ch!=' '&&ch!='\n')
				{	
					if(ch==EOF)
					{
						tag=1;
						break;
					}
					buffer2[i+1]=ch;
					i++;
					ch=fgetc(fin);
					
				}
				buffer2[i]='\0';
				fprintf(fout,"Error constant: %s\n",buffer2);	
				if(tag==1) break;
				else continue;
			}
			else
			{
				if(buffer2[i-1]!=' '&&buffer2[i-1]!='\n') buffer2[i]='\0';
				else buffer2[i-1]='\0';
				convert(buffer2);
				fprintf(fout,"%s\n",buffer2);
			}
		}
		else if(ch!=EOF) //其他情况(一定是认不出的字符串)
		{
			tag=0;
				
				do
				{	
					buffer+=ch;
					ch=fgetc(fin);
					if(ch==EOF)
					{
						tag=1;
						break;
						
					}
				}while(ch!=' '&&ch!='\n');
				for(i=0;i<buffer.size();i++) buffer2[i]=buffer.at(i);
				buffer2[i]='\0';
				fprintf(fout,"Error constant: %s\n",buffer2);	
				if(tag==1) break;
				else continue;
		}
	}
}
	
			

		

	

⌨️ 快捷键说明

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