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

📄 yasuowenfa.cpp

📁 编译原理的实验~~是大学三年级的课程,编译原理压缩文法
💻 CPP
字号:
#include<iostream.h>
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
class command
{
private:
	char vn[50];
	char vt[50];
public:
	char**p;
	int line;
	int VN;
	int VT;
	command()
	{
		line=0;
		VN=0;
		VT=0;
		cout<<"请输入要输入文法的行数:"<<endl;
		int n;
		cin>>n;
		line=n;
		p=new char*[n];
		for(int i=0;i<n;i++)
		{
			p[i]=new char[50];
		}
		for( i=0;i<line;i++)
			for(int j=0;j<50;j++)
				p[i][j]='\0';
        cout<<"请输入文法!"<<endl;
		for( i=0;i<n;i++)
		{
			cin>>p[i];
		}
		Search_big();
		Search_small();
	}
	void Search_big()
	{
		VN=0;
		for(int i=0;i<line;i++)
			for(int j=0;j<50;j++)
			{   char temp=p[i][j];
	            if(temp>='A'&&temp<='Z')
				{
			      bool state=true;
                  for(int k=0;k<VN;k++)
				  {
				   if (temp==vn[k])
				   {state=false;break;}
				  }
			      if(state==true)
				   vn[VN++]=temp;
				}
			}			
	}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	void Search_small()
	{
		VT=0;
		for(int i=0;i<line;i++)
			for(int j=4;j<50;j++)
			{   char temp=p[i][j];
	            if(temp>='a'&&temp<='z')
				{
			      bool state=true;
                  for(int k=0;k<VT;k++)
				  {
				   if (temp==vt[k])
				   
				   {state=false;break;}
				  }
			      if(state==true)
				   vt[VT++]=temp;
				}
			}
	}
	void pint()
{
    cout<<" 得到的文法是:  "<<endl;
	for(int i=0;i<line;i++)
	{
		cout<<p[i]<<endl;
	}
	cout<<" 您所得的文法的行数是: "<<line<<endl;
	cout<<"         终结符个数是: "<<VT<<endl;
	cout<<"       非终结符个数是: "<<VN<<endl;
}
//====================================================================================
	void compac0()
	{
		int tempN[20];
		for(int i=0;i<line;i++)
	  {
		  tempN[i]=0;
	  }
		for(i=0;i<line;i++)
			if(p[i][0]==p[i][4]&&p[i][5]=='\0')
			{
				tempN[i]=0;
			}
			else
				tempN[i]=1;
			int k=0;
		 int t=0;
		 for(i=0;i<line;i++)
		 {
			 if(tempN[i]==1)
			 t++;
		 }
		 char **q=new char*[t];
		 for(i=0;i<t;i++)
			 q[i]=new char[50];
		 for(i=0;i<line;i++)
		 {
			 
			 if(tempN[i]==1)
			 {
				 tempN[i]=0;
				 q[k++]=p[i];
			 }
		 }
		 char**m=p;
		 p=q;
		 q=m;
		 delete[]q;
		 line=t;
         Search_big();
		 Search_small();
	}
//===================================================================================
	bool compac1()
	{
		int tab=line;
      int tempN[20];
	  int temp_count=0;
	  char tempC[50];
	  for(int i=0;i<line;i++)
	  {
		  tempN[i]=0;
	  }
     for(i=0;i<line;i++)
		 for(int j=4;j<50;j++)
		 {
			 char tem=p[i][j];
			 if(tem>='A'&&tem<='Z')
			 {		
			      bool state=true;
                  for(int k=0;k<temp_count;k++)
				  {
				   if (tem==tempC[k])
				   {
					   state=false;
					   break;
				   }
				  }
			      if(state==true)
				   tempC[temp_count++]=tem;
			 }
		 }
		 for(i=0;i<line;i++)
		 {
			 for(int j=0;j<temp_count;j++)
			 {
				 if(tempC[j]==p[i][0])
				 tempN[i]=1;
			 }
			 tempN[0]=1;
		 }
		 int k=0;
		 int t=0;
		 for(i=0;i<line;i++)
		 {
			 if(tempN[i]==1)
			 t++;
		 }
		 char **q=new char*[t];
		 for(i=0;i<t;i++)
			 q[i]=new char[50];
		 for(i=0;i<line;i++)
		 {
			 
			 if(tempN[i]==1)
			 {
				 tempN[i]=0;
				 q[k++]=p[i];
			 }
		 }
		 char**m=p;
		 p=q;
		 q=m;
		 delete[]q;
		 line=t;
         Search_big();
		 Search_small();
		 if(line!=tab)
			 return true;
		 else
			 return false;
	}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	bool compac2()
	{
		int tab=line;
		int tempN[20];
		for(int i=0;i<line;i++)
		{
		  tempN[i]=0;
		}
		char *Char2=new char[50];
		int char2N=0;
		bool state=true;
//------------------------------------------------------------------------------
		while(state)
		{
			state=false;
			for(int i=0;i<line;i++)
			{
               if(p[i][4]>='a'&&p[i][4]<='z'&&tempN[i]!=1&&p[i][5]=='\0')
			   {
				   state=true;
				 
				   tempN[i]=1;
				   bool see=true;
				   for(int k=0;k<char2N;k++)
				   {
					   if(Char2[k]==p[i][0])
					   {
						   see=false;
						   break;
					   }
				   }
				   if(see==true)
				   {
					   Char2[char2N++]=p[i][0];
				   }
			   }
			 
			}
	//--------------23------------------------------------------------------------
			for(i=0;i<line;i++)
			{
				int s=0,r=0;
				if(tempN[i]!=1)
				{
					

				for(int j=4;j<50;j++)
				{
					 
					if(p[i][j]>='A'&&p[i][j]<='Z')
					{
						s++;

						for(int k=0;k<char2N;k++)
						{
							if(p[i][j]==Char2[k])
							{
								r++;
							}
						}
					}
				}
				               if(s==r)
							   {
									state=true;
									tempN[i]=1;
									bool see=true;
									for(int k=0;k<char2N;k++)
									{
										if(Char2[k]==p[i][0])
										{
											see=false;
											break;
										}
									}
								if(see==true)
									Char2[char2N++]=p[i][0];
							
							   }
			}
			}
				
//---------------------------------------------------------------------------
	}
//----------------------------------------------------------------------------
		 int k=0;
		 int t=0;
		 for(i=0;i<line;i++)
		 {
			 if(tempN[i]==1)
			 t++;
		 }
		 char **q=new char*[t];
		 for(i=0;i<t;i++)
			 q[i]=new char[50];
		 for(i=0;i<line;i++)
		 {
			 
			 if(tempN[i]==1)
			 {
				 tempN[i]=0;
				 q[k++]=p[i];
			 }
		 }
		 char**m=p;
		 p=q;
		 q=m;
		 delete[]q;
		 line=t;
         Search_big();
		 Search_small();
		 if(tab!=line)
					return true;
				else
					return false;
	}
	void compac()
	{
		compac0();
		bool loop=true;
		while(compac1()||compac2());

	}
};
//==============================================================================
//==============================================================================
void main()
{
	command a;
	cout<<"输入完成之后"<<endl;
	a.pint();
	cout<<endl;
	cout<<"文法压缩之后"<<endl;
	a.compac();
	a.pint();
}

⌨️ 快捷键说明

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