📄 alysis.cpp
字号:
#include<iostream>
using namespace std;
const int MAX=150;
class Chomsky
{
char p[MAX];
int i,j,z,z1;
char VN[50];
char VT[50];
char start;
public:
int sort;
void inputG(void)
{
char tmp;
cout<<"请输入文法G的非终结符号集VN,每个符号用“,”隔开,全输入完毕请输入“.”:"<<endl;
for(i=0;i<50;i++)
{
cin>>tmp;
if(tmp!='.')
{
VN[i]=tmp;
}
else {z=i;break;}
}
cout<<"请输入文法G的终结符号集VT,每个符号用“,”隔开,全输入完毕请输入“.”:"<<endl;
for(i=0;i<50;i++)
{
cin>>tmp;
if(tmp!='.')
{
VT[i]=tmp;
}
else {z1=i;break;}
}
cout<<"请输入初始符号:"<<endl;
cin>>start;
cout<<"输入产生式集p(要求:每个产生式用“,”隔开,全输入完毕请输入“.”):"<<endl;
for(i=0;i<MAX;i++)
{
cin>>tmp;
if(tmp!='.')
{
p[i]=tmp;
}
else {j=i;p[i]='.';break;}
}
}
void outputG(void)
{
cout<<"文法G=({";
for(i=0;i<z;i++)
{
cout<<VN[i];
}
cout<<"},{";
for(i=0;i<z1;i++)
{
cout<<VT[i];
}
cout<<"},P,"<<start<<"}"<<endl;
cout<<"其中,P={";
for(i=0;i<=j;i++)
{
cout<<p[i];
}
cout<<"}"<<endl;
cout<<"这是"<<sort<<"型文法。"<<endl;
}
int sortG(void)
{
sort=2;
int flag=0;
int leftcount=0;
int rightcount=0;
int k=0,m=0,q,v,g;
int tst1[MAX];
int tst2[MAX];
int left[MAX];
int right2[MAX];
int right1[MAX];
int pflag;
int c=0;
int b=0;
int o=0;
int tmp1=0;
int tmp2=50;
int tmp3=0;
char tt[MAX];
for(i=0;i<=j;i++)
{
if((p[i]==',')||(p[i]=='.'))
{
left[m]=leftcount;
if(tmp2>rightcount)
{right2[m]=rightcount;}
else{right2[m]=tmp2;}
if(tmp1<rightcount)
{right1[m]=rightcount;}
else{right1[m]=tmp1;}
tst2[m]=right2[m]-left[m];
tst1[m]=right1[m]-left[m];
m++;
leftcount=0;
rightcount=0;
tmp1=0;
tmp2=50;
flag=0;
continue;
}
else if((p[i]==':')||(p[i]=='='))
{
flag=1;
continue;
}
else if(flag==0){leftcount++;continue;}
else if((flag==1)&&(p[i]!='|')){rightcount++;continue;}
else if((flag==1)&&(p[i]=='|'))
{
if(rightcount<tmp2){tmp2=rightcount;tmp3=rightcount;rightcount=0;continue;}
if((rightcount>tmp1)||(tmp3>tmp1))
{
tmp1=max(tmp3,rightcount);
rightcount=0;
continue;
}
}
}
for(q=0;q<m;q++)
{
if(left[q]>1)
{sort=1;break;}
else continue;
}
for(v=0;v<m;v++)
{
if(tst2[v]<0)//不是1型文法
{sort=0;break;}
else continue;
}
if(sort==2)
{
for(i=0;i<=j;i++)
{
if((i!=0)&&((p[i-1]=='=')||(p[i-1]=='|')))
{
tt[o]=p[i];
o++;
}
else continue;
}
for(i=0;i<o;i++)
{
for(g=0;g<z;g++)
{
if(tt[i]==VN[g])
{pflag=0;break;}
else continue;
}
}
for(v=0;v<m;v++)
{
if((tst1[v]>1)||(pflag==0))
{sort=2;break;}
else
{sort=3;continue;}
}
}
return sort;
}
};
int main()
{
Chomsky G;
G.inputG();
G.sortG();
G.outputG();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -