words.cpp

来自「词法分析器真的很不错谢谢你若喜欢就下载吧要支持我啊」· C++ 代码 · 共 282 行

CPP
282
字号
#include<iostream.h>
#include<string.h>
#include<fstream.h>
#include<stdlib.h>
void Scanner();               //识别单词 
int iskeywords(char[]);       //识别字母为关键字
int isidnumber(char[]);        //识别字母
int isnum(char[]);             //合法数字
char ischar(char,ifstream,ofstream);     //识别保留字和标识符      
char isnumber(char,ifstream,ofstream);          //识别整数
char isanotation(char,ifstream,ofstream);       //处理符号
char isother(char,ifstream,ofstream);           //识别其他特殊字符
char *keywords[14]={"int","char","float","void","const","for","if","else",
"then","while","switch","break","begin","end"};
int sum=1,count=1;
 void main()
{
	cout<<"词法分析器:"<<endl;
	Scanner();
}
void Scanner()              //识别单词
{
	char fileName[30];
	ofstream outstuf;
	cout<<"输入要分析的文件名:"<<endl;
	cin>>fileName;
	ifstream infile(fileName,ios::in);
	ofstream outfile("out.txt",ios::out);
	ofstream outid("id.txt",ios::out);
	ofstream outnum("num.txt",ios::out);
	outid.close();
	outnum.close();
	char s=infile.get();
	while(s!=EOF)
	{
		if(s==' '||s=='\t')
		{
			s=infile.get();continue;
		}
		else if(s=='\n')
		{
		    	s=infile.get();sum++;continue;
		}
             else if((s>='a'&&s<='z')||(s>='A'&&s<='Z'))
			 {
			         s=ischar(s,infile,outfile);continue;
			 }
			      else if(s>='0'&&s<='9')
				  {
		            	 s=isnumber(s,infile,outfile);continue;
				  }
				       else if((s=='+')||(s=='-')||(s=='*')||(s=='%')||(s=='(')||(s==')')||(s=='[')
						   ||(s==']')||(s=='<')||(s=='>')||(s=='=')||(s=='!')||(s=='%')||(s=='|')||(s=='&'))
					   {
						   s=isanotation(s,infile,outfile);continue;
					   }
					        else if(s=='/')
							{
							     s=isother(s,infile,outfile);continue;
							}
							     else
								 {
									 cout<<"第"<<sum<<"行有错误! "<<s<<"字符非法!"<<endl;
									 s=infile.get();continue;
								 }
	}
}
int iskeywords(char temp[])      //识别字母为关键字
{
	for(int i=0;i<14;i++)
	{
		if(strcmp(keywords[i],temp)==0)
		{
			return 1;
		}
	}
	return 0;
}
int isidnumber(char temp[])    //识别字母
{
	int i=0;
	char str[20];
	ifstream inid("id.txt",ios::in);
	while(inid>>i>>str)
	{
		if(strcmp(str,temp)==0)
			return i;
	}
	inid.close();
	ofstream outid("id.txt",ios::app);
	outid<<++i<<'\t'<<temp<<'\n';
	outid.close();
	return i;
}
char ischar(char s,ifstream infile,ofstream outfile)      //识别保留字和标识符 
{
	int i=0;
	char temp[30];
	while((s>='a'&&s<='z')||(s>='A'&&s<='Z')||(s>='0'&&s<='9'))
	{
		temp[i]=s;
		i++;
		s=infile.get();
	}
	temp[i]='\0';//字符结束
	if(iskeywords(temp)!=0)
	{
		outfile<<"("<<temp<<",_)"<<'\n';
		return s;
	}
	else
	{
		outfile<<"(ID,"<<isidnumber(temp)<<")"<<'\n';
		return s;
	}
	cout<<temp<<"错误!!"<<endl;
	return s;
}
int isnum(char temp[])          //合法数字
{
    int i=0;
	char str[20];
	ifstream innum("num.txt",ios::in);
	while(innum>>i>>str)
	{
		if(strcmp(str,temp)==0)
			return i;
	}
	innum.close();
	ofstream outnum("num.txt",ios::app);
	outnum<<++i<<'\t'<<temp<<'\n';
	outnum.close();
	return i;
}
char isnumber(char s,ifstream infile,ofstream outfile)       //识别整数
{	
    int i=0,j=1,k=0;
	char temp[30];
	while(s>='0'&&s<='9')
	{	
		temp[i]=s;
		i++;
		s=infile.get();
		while((s>='a'&&s<='z')||(s>='A'&&s<='Z'))
		{
			cout<<"第"<<sum<<"行有"<<j<<"错误!"<<endl;
			s=infile.get();
			j++;
			k=1;
		}
	}
	temp[i]='\0';//字符结束
    if(k==0)
	outfile<<"(Num,"<<isnum(temp)<<")"<<'\n';
	return s;
}
char isanotation(char s,ifstream infile,ofstream outfile)   //处理符号
{
	if((s=='+')||(s=='-')||(s=='*')||(s=='%')||(s=='(')||(s==')')||(s=='[')||(s==']'))
	{
		char t;
		t=s;
		s=infile.get();
        if(s=='=')
		{
			outfile<<"("<<t<<"="<<","<<"_)"<<'\n';
			s=infile.get();
			return s;
		}
		else
		{
            outfile<<"("<<t<<","<<"_)"<<'\n';
			return s;
		}
	}
    else if((s=='<')||(s=='>')||(s=='='))
	{
		char t;
		t=s;
		s=infile.get();
		if(s=='=')
		{
			outfile<<"("<<"rlop"<<","<<"="<<t<<"=)"<<'\n';
			s=infile.get();
			return s;
		}
		else
		{
            outfile<<"("<<"rlop"<<","<<t<<")"<<'\n';
			return s;
		}
	}
       	else if(s=='|')
		{
			char t;
			t=s;
			if(s=='|')
			{
			  outfile<<"("<<"or"<<","<<"_)"<<'\n';
	    	  s=infile.get();
			  return s;
			}
			else
			{
				cout<<"第"<<sum<<"行有错误!"<<t<<"字符非法!"<<endl;
                s=infile.get();
			    return s;
			}
		}
            else if(s=='&')
			{
	        	char t;
			    t=s;
			    if(s=='&')
				{
			       outfile<<"("<<"and"<<","<<"_)"<<'\n';
	    	       s=infile.get();
			       return s;
				}
		    	else
				{
			       cout<<"第"<<sum<<"行有错误!"<<t<<"字符非法!"<<endl;
                   s=infile.get();
			       return s;
				}
			}
            	 else if(s=='!')
				 {
		           char t;
			       t=s;
			       if(s=='=')
				   {
			         outfile<<"("<<"rlop"<<","<<"!="<<")"<<'\n';
	    	         s=infile.get();
			         return s;
				   }
				   else
				   {
					 outfile<<"(<"<<"not"<<","<<"_)"<<'\n';
	                 s=infile.get();
					 return s;
				   }
				 }
}
char isother(char s,ifstream infile,ofstream outfile)   //识别其他特殊字符
{
     int i=0;
   	 s=infile.get();
	 if(s=='*')
	 {	 
		 s=infile.get();
	       while(s!=EOF)
		   {
			   if(s=='*')
			   {
			     s=infile.get();
			     if(s=='/')
				 {
			       s=infile.get();
			       return s;
				 }
			   }
			  s=infile.get();
			  if(s==EOF)
			  {   
				  cout<<"第"<<sum<<"行错误!"<<endl;
				  break;
			  }
		   }
		  return s;
   	 }
	 else
	 {
		 if(s=='=')
		 outfile<<"("<<"/="<<","<<"_)"<<'\n';
		 else
		 outfile<<"("<<"/"<<","<<"_)"<<'\n';
		 return s;
	 }
	
}

⌨️ 快捷键说明

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