?? 2.cpp
字號(hào):
#include<stdio.h>
#include<string.h>
char ch;//讀入字符串?dāng)?shù)組
int i=1;
int total=0;//統(tǒng)計(jì)步數(shù)
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',' ',//把所有的終結(jié)符和非終接符寫入數(shù)組
'e','+','T','e',
'e',' ',' ',' ',
'T','F','t',' ',
't','*','F','t',
't',' ',' ',' ',
'F','(','E',')',
'F','i',' ',' ',};
for( j1=0;j1<8;j1++)//先掃一遍看CH在數(shù)組的哪一行
for( j2=0;j2<4;j2++)
if(b[j1][j2]==ch)
m=j1;
for( j1=1;j1<10;j1++)//進(jìn)行自上而下推導(dǎo)
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的數(shù)組相符
if(a1[j1]==b[m][0])
{k1=j1;k2=m;}
for(j1=k1;j1<10;j1++)//把所要替換的字符放到數(shù)組的最后
{
if(a1[j1+1]!=' ')
a1[j1]=a1[j1+1];
else
{
a1[j1]=b[k2][0];
break;
}
}
for(j2=1;j2<4;j2++)//進(jìn)行替換
{
a1[j1]=b[k2][j2];
j1++;
}
if(k2==0) strcpy(a3,"E->Te");//把產(chǎn)生式寫入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()//打印函數(shù)
{
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("請(qǐng)輸入你要分析的字符串:(以#號(hào)結(jié)束)\n");
do
{
scanf("%c",&ch);
a2[j]=ch;
j++;
}while(ch!='#');
ch=a2[0];
printf("步驟\t\t符號(hào)棧\t\t\t輸入串\t\t所用產(chǎn)生式\n");
print();
do
{
zifu();
}while(ch!='#');
printf("分析成功!!");
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -