编译原理——简单词法分析程序

效果如下:

代码和解析:(C++)

/*
	int    1
	if     2
	main   3
	数字   4 
	return 5
	cin    6
	cout   7
	for    8
	(      9
	)      10
	{      11
	}      12
	<<     13
	>>     14
	;      15
	++     16
	<      17
	=      19
   变量    20
    ==     22
	+      23
	>      24
*/

#include <iostream>
#include <string>
#include <string.h>
using namespace std;

struct String{
	string str;
	int mode;
}str[100];

void initial()
{
	str[1].str="int";str[1].mode=1;        str[2].str="if";str[2].mode=2;
	str[3].str="main";str[3].mode=3;       str[4].str="";str[4].mode=4;//第4类是数字 
	str[5].str="return";str[5].mode=5;     str[6].str="cin";str[6].mode=6;
	str[7].str="cout";str[7].mode=7;       str[8].str="for";str[8].mode=8;
	str[9].str="(";str[9].mode=9;          str[10].str=")";str[10].mode=10;
	str[11].str="{";str[11].mode=11;       str[12].str="}";str[12].mode=12;
	str[13].str="<<";str[13].mode=13;      str[14].str=">>";str[14].mode=14;
	str[15].str=";";str[15].mode=15;       str[16].str="++";str[16].mode=16;
	str[17].str="<";str[17].mode=17;       str[19].str="=";str[19].mode=19;
	str[20].str="";str[20].mode=20;//第20类是变量 
	str[21].str="endl";str[21].mode=21;    str[22].str="==";str[22].mode=22;
	str[23].str="+";str[23].mode=23;	   str[24].str=">";str[24].mode=24;  
}

int main()
{
	initial();
	string str1;
	while(getline(cin,str1))
	{
		int len=str1.length();
		int i=0;
		for(i=0;i<len;i++)
		{
			string str2="";
			if(str1[i]==' ') continue;
			bool flag=false;
			if((str1[i]>='a'&&str1[i]<='z')||(str1[i]>='A'&&str1[i]<='Z'))//为标示符或变量名 
			{
//				cout<<"zimu"<<endl;	 
				while((str1[i]>='0'&&str1[i]<='9')||(str1[i]>='a'&&str1[i]<='z')||(str1[i]>='A'&&str1[i]<='Z')) 
				{
					str2+=str1[i];
					i++;
				}
				--i;
			//	cout<<"i:"<<i<<endl;
				for(int n=1;n<=24;n++)
				{
					if(str2==str[n].str)
					{
						//cout<<"n:"<<n<<endl;
						cout<<"("<<str[n].mode<<","<<str[n].str<<")"<<endl;
						flag=true;
						break;
					}
				}
				if(flag==false)
					cout<<"("<<str[20].mode<<","<<str2<<")"<<endl;
			}
			else if(str1[i]>='0'&&str1[i]<='9')//为数字的情况
			{
//				cout<<"shuzi"<<endl;
				int sum=0;
				while(str1[i]>='0'&&str1[i]<='9')
				{
				//	cout<<"shuzi2"<<endl;
					sum=sum*10+str1[i]-'0';
					i++;
				}
				--i;
				cout<<"("<<str[4].mode<<","<<sum<<")"<<endl; 
			}
			else if(str1[i]=='('){cout<<"("<<str[9].mode<<","<<str[9].str<<")"<<endl;}
			else if(str1[i]==')'){cout<<"("<<str[10].mode<<","<<str[10].str<<")"<<endl;}
			else if(str1[i]=='{'){cout<<"("<<str[11].mode<<","<<str[11].str<<")"<<endl;}
			else if(str1[i]=='}'){cout<<"("<<str[12].mode<<","<<str[12].str<<")"<<endl;}
			else if(str1[i]=='=')//需要判断是1个"="还是2个"=" 
			{
//				cout<<"="<<endl;
				string s1="";
				while(str1[i]=='=')
				{
					s1+=str1[i];
					i++;
				} 
				--i;
				for(int n=1;n<=24;n++)
				{
					if(s1==str[n].str)
					{
						//cout<<"n:"<<n<<endl;
						cout<<"("<<str[n].mode<<","<<str[n].str<<")"<<endl;
						break;
					}
				}
			}
			else if(str1[i]=='<')
			{
//				cout<<"<"<<endl;
				string s2="";
				while(str1[i]=='<')
				{
					s2+=str1[i];
					i++;
				} 
				--i;
				for(int n=1;n<=24;n++)
				{
					if(s2==str[n].str)
					{
						//cout<<"n:"<<n<<endl;
						cout<<"("<<str[n].mode<<","<<str[n].str<<")"<<endl;
						break;
					}
				}
			}
			else if(str1[i]=='>')
			{
//				cout<<">"<<endl;
				string s3="";
				while(str1[i]=='>')
				{
					s3+=str1[i];
					i++;
				} 
				--i;
				for(int n=1;n<=24;n++)
				{
					if(s3==str[n].str)
					{
						//cout<<"n:"<<n<<endl;
						cout<<"("<<str[n].mode<<","<<str[n].str<<")"<<endl;
						break;
					}
				}
			}
			else if(str1[i]=='+')
			{
//				cout<<"+"<<endl;
				string s5="";
				while(str1[i]=='+')
				{
					s5+=str1[i];
					i++;
				} 
				--i;
				for(int n=1;n<=24;n++)
				{
					if(s5==str[n].str)
					{
						//cout<<"n:"<<n<<endl;
						cout<<"("<<str[n].mode<<","<<str[n].str<<")"<<endl;
						break;
					}
				}
			}
		}		
	}
	return 0;
}
原创文章 54 获赞 99 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_38938670/article/details/89364293