📄 2.cpp
字号:
#include<stdio.h>
#include<string.h>
char ch;//读入字符串数组
int i=1;
int total=0;//统计步数
char a1[10],a2[10],a3[10];char c1='n';
void fengxi()
{ int m,k1,k2,j1,j2;char c[3]={'+','*','i'};
char b[8][4]={'E','T','e',' ',//把所有的终结符和非终接符写入数组
'e','+','T','e',
'e',' ',' ',' ',
'T','F','t',' ',
't','*','F','t',
't',' ',' ',' ',
'F','(','E',')',
'F','i',' ',' ',};
for( j1=0;j1<8;j1++)//先扫一遍看CH在数组的哪一行
for( j2=0;j2<4;j2++)
if(b[j1][j2]==ch)
m=j1;
for( j1=1;j1<10;j1++)//进行自上而下推导
for(j2=0;j2<8;j2++)
if(a1[j1]==b[j2][0])
{
for(int j3=1;j3<4;j3++)
{
if(b[j2][j3]=='+') c1='+';
if(b[j2][j3]=='*') c1='*';
if(b[j2][j3]=='i') c1='i';
}
if(c1!=ch&&c1!='n')
{ c1='n'; break;}
k1=j1;k2=j2;
goto a;
}
a: for(j1=1;j1<10;j1++) //看是否有与含ch的数组相符
if(a1[j1]==b[m][0])
{k1=j1;k2=m;}
for(j1=k1;j1<10;j1++)//把所要替换的字符放到数组的最后
{
if(a1[j1+1]!=' ')
a1[j1]=a1[j1+1];
else
{
a1[j1]=b[k2][0];
break;
}
}
for(j2=1;j2<4;j2++)//进行替换
{
a1[j1]=b[k2][j2];
j1++;
}
if(k2==0) strcpy(a3,"E->Te");//把产生式写入a3
if(k2==1) strcpy(a3,"e->+Te");
if(k2==2) strcpy(a3,"e->^");
if(k2==3) strcpy(a3,"T->Ft");
if(k2==4) strcpy(a3,"t->*Ft");
if(k2==5) strcpy(a3,"t->^");
if(k2==6) strcpy(a3,"F->(E)");
if(k2==7) strcpy(a3,"F->i");
}
void print()//打印函数
{
printf("%d\t\t%s\t\t%s\t%s\n",total,a1,a2,a3);
total++;
strcpy(a3," ");
}
int panduan()//
{
for(int j1=1;j1<10;j1++)
if(a1[j1]==ch)
{
for(int j2=j1;j2<10;j2++)
{
if(a1[j2+1]!=' ')
a1[j2]=a1[j2+1];
else {a1[j2]=' ';break;}
}
return 1;
}
return 0;
}
void zifu()
{int t1,t2=1,t3=1;
if(panduan()==1)
{
ch=a2[i];
a2[i-1]=' ';
i++;
print();
}
else
{
fengxi();print();
}
for(int j1=1;j1<10;j1++)//判断a1里面是否全为et字符
{
if(a1[j1]!='t'&&a1[j1]!='e'&&a1[j1]!=' ')
{t2=0;}
if(a1[j1]==' ')
{t1=j1+1;break;}
}
for(j1=0;j1<10;j1++)
if(a2[j1]!=' '&&a2[j1]!='#')
t3=0;
if(t2==1&&t3==1)
{
for(j1=1;j1<t1;j1++)
{ if(j1!=1)
print();
for(int j2=1;j2<t1;j2++)
{
if(a1[j2+1]!=' ')
a1[j2]=a1[j2+1];
else {a1[j2]=' ';break;}
}
if(a1[1]=='e') strcpy(a3,"e->^");
if(a1[1]=='t') strcpy(a3,"t->^");
}
}
}
void main()
{
strcpy(a1,"#E ");
for(int j1=2;j1<10;j1++)
{
a2[j1]=' ';
}
int j=0;
printf("请输入你要分析的字符串:(以#号结束)\n");
do
{
scanf("%c",&ch);
a2[j]=ch;
j++;
}while(ch!='#');
ch=a2[0];
printf("步骤\t\t符号栈\t\t\t输入串\t\t所用产生式\n");
print();
do
{
zifu();
}while(ch!='#');
printf("分析成功!!");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -