📄 实验二2.cpp
字号:
#include<string.h>
#include<stdio.h>
#define NUM 20
#define SIZE 8
main()
{ char str1[NUM][SIZE],str2[2*NUM][SIZE];
char str3[2*NUM][SIZE],c[4*NUM];
int i,n,j=1,k=1,m=0,x=0;
printf("规则的条数是:(while U::=Vt,the Vt only is a character).\n");
printf("n=");
for( i=0;i<n;i++)
printf("第i条规则是:");
scanf("%d",&n);
printf("Please input the P of G[Z]:\n");//以回车作为标志
for(i=0;i<=n;i++)
{ gets(str1[i]);
if(strlen(str1[i])==5)
{ if(str1[i][0]!=str1[i][4])
{ strcpy(str2[j],str1[i]);
j+=2;
}
}
else if(strlen(str1[i])>5)
{ strcpy(str2[j],str1[i]);
j+=2;
}
}
if(str2[1][0]!='Z')
{ for(i=3;i<j-1;i+=2)
{ if(str2[i][0]=='Z')
{ strcpy(str1[0],str2[i]);
strcpy(str2[i],str2[1]);
strcpy(str2[1],str1[0]);
break;
}
}
}
loop:for(i=0;i<strlen(str2[k]);i++)//判别条件1
{ if(str2[k][i]>='A'&&str2[k][i]<='Z')
{ c[m]=str2[k][i];
str2[k-1][i]='*';//在规则左部非终结符上加‘*’号
m++;
}
}
for(i=3;i<j-1;i+=2)
{ for(n=0;n<m;n++)
{ if(str2[i][0]==c[n]&&str2[i-1][0]!='*')
{ k=i;
goto loop;
}
}
}
printf("条件1得到的文法是:\n");
for(n=1,i=1;i<j-1;i+=2)
{ for(k=0;k<m;k++)
{ if(str2[i][0]==c[k])
{ strcpy(str3[n],str2[i]);
printf("%s\n",str2[i]);
n+=2;
break;
}
}
}
for(k=0;k<m;k++)
c[k]='\n';
printf("压缩文法规则是:\n");
for(i=0;i<n-1;i+=2)
{ if(strlen(str3[i])==5);
{ if(str3[i][5]>='a'&&str3[i][5]<='z')
{ c[x]=str3[i][0];
x++;
printf("%s\n",str3[i]);
}
}
}
loop1:for(i=0;i<n-1;i+=2)//判别条件2
{ for(m=0;m<x;m++)
for(j=4;j<(strlen(str3[i]));j++)
{ if(str3[i][j]==c[m]&&str3[i-1][j]!='*')
{ c[x]=str3[i][0];
x++;
str3[i-1][j]='*';
}
}
}
for(i=1;i<n-1;i+=2)
{ for(j=4;j<strlen(str3[i]);j++)
for( m=0;m<x;m++)
{ if(str3[i][j]==c[m])
{ printf("%s\n",str3[i]);
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -