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

📄 11.zip.cpp

📁 编译原理的课程设计
💻 CPP
字号:
#include<iostream>
#include<string>
using namespace std;
const int length=10;
const int max=20;
typedef struct
{
	char gzl;
	char gzr[length];
	string firstl;
	string firstr;
	string follow;
	int  rvt;
}guize;
class wenfa
{
  private:
	  char (*s)[max];
	  char *vn;
	  char *vt;
	  int counter;
	  guize *gz;
      char sbf;
  public:
	  wenfa();
	  ~wenfa();
	  bool input();
	  void v();//分别装入终结符和非终结符
	  void output();
	  void printf();
	  string first_l(char c);
	  string first_r(char c);
	  string follow(char c);
	  void process(int n,int n1);
	  void ff();
};
wenfa::wenfa()
{
	s=new char[length][max];
	vn=new char[length];
	vt=new char[length];
	gz=new guize[1];
	counter=0;
}
wenfa::~wenfa()
{
	delete []gz;
	delete []s;
	delete []vn;
	delete []vt;
}
bool wenfa::input()
{
	int hang=0;//文法的行数
	int pointer=0;
	int i,j;
	cout<<"输入你要输入文法的行数 hang:";
	cin>>hang;
	cout<<"输入你将要输入的文法 :"<<endl;
	for(i=0;i<hang;i++)
	{
		cin>>s[i];
		for(j=0;j<strlen(s[i]);j++)
			if(s[i][j]=='|')pointer++;
	}
	if(hang>0){process(hang,pointer);return true;}
	else {cout<<"请输入文法"<<endl;return false;}
}
void wenfa::process(int n,int n1)
{
		int i,j,k,hang=0,m=0,hang1=0;
		char *t=new char[length];
		counter=n+n1;
		gz=new guize[counter];
        for(i=0;i<n;i++)
		{
			m=0;
	        for(j=4;j<strlen(s[i]);j++)
			{
				if(s[i][j]=='|')
				{
				    gz[hang].gzl=s[i][0];
			        t[m]=0;
					m=0;
                    gz[hang].rvt=0;
					strcpy(gz[hang].gzr,t);
					for(k=0;k<strlen(t);k++)
					{
					    if(t[k]>='A'&&t[k]<='Z')
						 gz[hang].rvt++;
					}
			        hang++;
				}                    	
				else 
				{
					t[m++]=s[i][j];
				}
			}
	           gz[hang].gzl=s[i][0];
               t[m]=0;m=0;
               gz[hang].rvt=0;		  
       	       strcpy(gz[hang].gzr,t);
			   for(k=0;k<strlen(t);k++)
				{
					if(t[k]>='A'&&t[k]<='Z')
					gz[hang].rvt++;
				}
	           hang++;
		}
	    if(hang==counter) 
		{
		  cout<<"文法存入成功!"<<endl;
		  v();
		}
	    else cout<<"未成功存放!"<<endl;
        delete []t;
}
void wenfa::output()
{
		 int hang=0,i;
		 for( i=0;i<counter;i++)
		 {
		      cout<<gz[i].gzl<<"::="<<gz[i].gzr<<"     ";hang++;
			  if(hang%2==0)cout<<endl;
		 }
	     cout<<endl;
	     cout<<"非终结符Vn={ ";
	     for(i=0;vn[i]!='\0';i++)
		 cout<<vn[i]<<"、";
	     cout<<'\b'<<" }共有:"<<strlen(vn)<<"个;"<<endl;
         cout<<"终结符vt={ ";
	     for(i=0;vt[i]!='\0';i++)
		  cout<<vt[i]<<"、";
	     cout<<'\b'<<" }共有:"<<strlen(vt)<<"个;"<<endl;
}
void wenfa::v()
 {
     int i,j,k,c1=0,c2=0;
     bool bool1,bool2;
     for(i=0;i<counter;i++)
	 {
         bool1=false;
         for(j=0;j<c1;j++)
           if(vn[j]==gz[i].gzl) {bool1=true;break;}
         if(!bool1) vn[c1++]=gz[i].gzl;
         for(j=0;j<strlen(gz[i].gzr);j++){
			if(!(gz[i].gzr[j]>='A'&&gz[i].gzr[j]<='Z'))
			{
                bool2=false;
                for(k=0;vt[k]!='\0';k++)
                     if(vt[k]==gz[i].gzr[j]){bool2=true;break;}
					 if(bool2==false)vt[c2++]=gz[i].gzr[j];
			}
		 }
	 }
    vn[c1]=vt[c2]=0;
    cout<<endl;
}
string wenfa::first_l(char c)
{
	string f;
	for(int i=0;i<counter;i++)
	{
		if(gz[i].gzl==c)
		{
			if(gz[i].gzr[0]=='3'||(gz[i].gzr[0]<'A'&&gz[i].gzr[0]>'Z'))
			{
				gz[i].firstl=gz[i].firstl+gz[i].firstr[0];
			}
			else f=first_l(gz[i].gzr[0]);
			gz[i].firstl=gz[i].firstl+f;
		}
	}
	return gz[i].firstl;
}
string wenfa::first_r(char c)
{
	string f;
	for(int i=0;i<counter;i++)
	{
		if(gz[i].gzl==c)
		{
			if(gz[i].gzr[0]=='3'||(gz[i].gzr[0]<'A'&&gz[i].gzr[0]>'Z'))
			{
				gz[i].firstr=gz[i].firstr+gz[i].firstr[0];
			}
			else f=first_r(gz[i].gzr[0]);
				gz[i].firstr=gz[i].firstr+f;
		}
	}
	return gz[i].firstr;
}
string wenfa::follow(char c)
{
	string f;bool biaozhi=true;
	for(int i=0;i<counter;i++)
	{
		if(i==0)gz[i].follow="#";
		for(int j=0;j<counter;j++)
			for(int k=0;k<strlen(gz[j].gzr);k++)
				if(gz[j].gzr[k]==gz[i].gzl)
				{
					if(gz[j].gzr[k+1]<'A'&&gz[j].gzr[k+1]>'Z')
					{
						gz[i].follow=gz[i].follow+gz[j].gzr[k+1];
					}
					else
					{
						biaozhi=true;
						if(gz[j].gzr[k+1]!='\0')
						{
							for(int m=0;m<counter;m++)
							{
							 if(gz[j].gzr[k+1]==gz[m].gzl)
							 {
								if(gz[m].gzr[0]=='3')
								{
									biaozhi=false;
									break;
								}
								else continue;
							 }
							}
						    if (!biaozhi)f=follow(gz[j].gzl);
						    else f=gz[j].firstr[k];
						    gz[i].follow=gz[i].follow+f;
						}
						else
						{
							f=follow(gz[j].gzl);
							gz[i].follow=gz[i].follow+f;
						}
					}
				}
	}
	return gz[i].follow;

}
void wenfa::printf()
{
	cout<<"现在将输出first和follow: "<<endl;
	for(int i=0;i<counter;i++)
	{
		cout<<"First("<<gz[i].gzl<<")={"<<gz[i].firstl<<"}"<<"  "
			<<"First("<<gz[i].firstr<<")={"<<gz[i].firstr<<"}"<<endl;
	}
	cout<<"显示操作结束"<<endl;
}
void wenfa::ff()
{
	for(int i=0;i<counter;i++)
	{
		first_l(gz[i].gzl);
		first_r(gz[i].gzl);
		follow(gz[i].gzl);
	}
}
void main()
{
		wenfa wf;
		int m;
		bool boole,boolee=false;
		cout<<"0--退出            1--输入规则"<<endl
			<<"2--显示文法        3--显示first和follow"<<endl
			<<"4--执行first和follow算法"<<endl;
		while(1){
			    
				cout<<"输入操作"<<endl;
				cin>>m;
				boole=false;
				switch(m){
				case 0:{boole=true;break;}
				case 1:{if(wf.input())
						   boolee=true;
					    
					    break;}
				case 2:{if(boolee) {wf.output();}
					      else cout<<"规则尚未输入,请输入后重试!"<<endl;
						break;
					   }
			
				case 3:{if(boolee) wf.printf();
					     else cout<<"规则尚未输入,请输入后重试!"<<endl;
						break;
					   }
				case 4:
					{
						if(boolee)wf.ff();
						break;
					}
				default : cout<<"输入命令错误!!!"<<endl;
				}
				if(boole) break;
			}
}

⌨️ 快捷键说明

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