📄 yasuowenfa.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 + -