📄 suanfuyouxian.cpp
字号:
#include<iostream>
using namespace std;
int tpd1(char a)
{
int x;
char T[8]={'+','-','*','/','(',')','i','#'};
for(x=0;x<8;x++)
{
if(a==T[x])
{
return x;
break;
}
}
if(x==8)
{
return 0;
}
}
char tpd2(char a)
{
char T[8]={'+','-','*','/','(',')','i','#'};
for(int x=0;x<8;x++)
{
if(a==T[x])
{
break;
}
}
if(x==8)
{
return 'N';
}
else
{
return 'Y';
}
}
char npd(char a)
{
char N[3]={'E','T','F'};
for(int x=0;x<3;x++)
{
if(a==N[x])
{
break;
}
}
if(x==3)
{
return 'N';
}
else
{
return 'Y';
}
}
int pdyx(int i,int j)
{
char T[8]={'+','-','*','/','(',')','i','#'};
char FF[8]={"(i"};
char LF[8]={")i"};
char FT[8]={"*/(i"};
char LT[8]={"*/)i"};
char FE[8]={"+-*/(i"};
char LE[8]={"+-*/)i"};
switch(T[i])
{
case '+':
case '-':
int m;
for(m=0;;m++)
{
if(!FT[m])
{
break;
}
if(T[j]==FT[m])
{
return 1;
break;
}
}
break;
case '*':
case '/':
int k;
for(k=0;;k++)
{
if(!FF[k])
{
break;
}
if(T[j]==FF[k])
{
return 1;
break;
}
}
break;
case '(':
int y;
for(y=0;;y++)
{
if(!FE[y])
{
break;
}
if(T[j]==FE[y])
{
return 1;
break;
}
}
break;
case ')':
break;
case 'i':
break;
case '#':
return 1;
break;
default:
break;
}
switch(T[j])
{
case '+':
case '-':
int t;
for(t=0;;t++)
{
if(!LE[t])
{
break;
}
if(T[i]==LE[t])
{
return 2;
break;
}
}
break;
case '*':
case '/':
int x;
for(x=0;;x++)
{
if(!LT[x])
{
break;
}
if(T[i]==LT[x])
{
return 2;
break;
}
}
break;
case '(':
break;
case ')':
int n;
for(n=0;;n++)
{
if(!LE[n])
{
break;
}
if(T[i]==LE[n])
{
return 2;
break;
}
}
break;
case 'i':
break;
case '#':
return 2;
break;
default:
break;
}
}
void main()
{
char a[20];
char T[8]={'+','-','*','/','(',')','i','#'};
int jz[8][8];//3代表优先级相同,2代表前者优先级高于后者,1代表前者低于后者
cout<<"根据F-->(E)|i可知\nFIRSTVT(F)={(,i} LASTVT(F)={),i}\n根据T-->T*F|T/F|F可知\nFIRSTVT(T)={*,/,(,i} LASTVT(F)={*,/,),i}\n根据E-->E+T|E-T|T可知\nFIRSTVT(E)={+,-,*,/,(,i} LASTVT(E)={+,-,*,/,),i}\n\n\n"<<endl;
for(int x=0;x<8;x++)
{
for(int y=0;y<8;y++)
{
if((x==4&&y==7)||(x==5&&(y==4||y==6))||(x==6&&(y==4||y==6))||(x==7&&y==5))
{
continue;
}
if((x==4&&y==5)||(x==7&&y==7))
{
jz[x][y]=3;
continue;
}
jz[x][y]=pdyx(x,y);
}
}
cout<<" ";
for(int e=0;e<8;e++)
{
cout<<" "<<T[e]<<" ";
}
cout<<endl;
for(int d=1;d<9;d++)
{
cout<<" "<<T[d-1]<<" ";
for(int y=1;y<9;y++)
{
switch(jz[d-1][y-1])
{
case 1:
cout<<" < ";
break;
case 2:
cout<<" > ";
break;
case 3:
cout<<" = ";
break;
default:
cout<<" ";
break;
}
}
cout<<endl;
}
cout<<"\n\n\n"<<endl;
cout<<"输入测试串(以#结束):"<<endl;
cin>>a;
cout<<"\n\n"<<endl;
char S[20];
S[0]='#';
S[1]=NULL;
int i=0,j=0;
int c=1;
int g=0;
int l;
while(a[j])
{
if(c<10)
{
cout<<" "<<c<<" ";
}
if(c>9)
{
cout<<" "<<c<<" ";
}
c++;
for(int x=0;;x++)
{
if(!S[x])
{
break;
}
cout<<S[x];
}
for(l=i;l<11;l++)
{
cout<<" ";
}
int h;
char b;
if(tpd2(S[i])=='Y')
{
h=i;
}
else
{
h=i-1;
}
if(jz[tpd1(S[h])][tpd1(a[j])]==2)
{
cout<<" > "<<a[j]<<" ";
for(l=0;l<=j;l++)
{
cout<<" ";
}
for(int x=j+1;;x++)
{
if(!a[x])
{
break;
}
cout<<a[x];
}
while(1)
{
b=S[h];
if(tpd2(S[h-1])=='Y')
{
h=h-1;
}
else
{
h=h-2;
}
if(jz[tpd1(S[h])][tpd1(b)]==1)
{
int p=i-h;
char ls[20];
int t=h;
for(int s=0;s<p;s++)
{
ls[s]=S[++t];
}
ls[p]=NULL;
char gyx[13][4]={{"E+T"},{"E-T"},{"T"},{"T*F"},{"T/F"},{"F"},{"(E)"},{"i"},{"F+F"},{"F-F"},{"F*F"},{"F/F"},{"(F)"}};
int x;
for(x=0;x<13;x++)
{
int y=0,z=0;
while(gyx[x][y]&&ls[z])
{
if(gyx[x][y]==ls[z])
{
y++;
z++;
continue;
}
else
{
break;
}
}
if((!ls[z])&&(!gyx[x][y]))
{
i=h+1;
if((x==0)||(x==1)||(x==2))
{
S[i]='E';
cout<<" 规约 "<<endl;
}
if((x==3)||(x==4)||(x==5))
{
S[i]='T';
cout<<" 规约 "<<endl;
}
if((x==6)||(x==7)||(x==8)||(x==9)||(x==10)||(x==11)||(x==12))
{
S[i]='F';
cout<<" 规约 "<<endl;
}
S[i+1]=NULL;
break;
}
else
{
continue;
}
}
if(x==13)
{
g=1;
cout<<" 失败 \n"<<endl;
cout<<"规约失败,不可接受"<<endl;
}
break;
}
else
{
continue;
}
}
}
else
{
if(jz[tpd1(S[h])][tpd1(a[j])]==1)
{
cout<<" < "<<a[j]<<" ";
for(l=0;l<=j;l++)
{
cout<<" ";
}
for(int x=j+1;;x++)
{
if(!a[x])
{
break;
}
cout<<a[x];
}
cout<<" 移进 "<<endl;
i=i+1;
S[i]=a[j];
j++;
S[i+1]=NULL;
continue;
}
else
{
if(jz[tpd1(S[h])][tpd1(a[j])]==3)
{
char n='#';
if(jz[tpd1(S[h])][tpd1(n)]==3)
{
if(npd(S[h+1])=='Y'&&a[j]=='#')
{
cout<<" = "<<a[j]<<" ";
for(l=0;l<=j;l++)
{
cout<<" ";
}
for(int x=j+1;;x++)
{
if(!a[x])
{
break;
}
cout<<a[x];
}
cout<<" 接受 \n"<<endl;
cout<<"规约成功,可接受"<<endl;
break;
}
else
{
cout<<" "<<a[j]<<" ";
for(l=0;l<=j;l++)
{
cout<<" ";
}
for(int x=j+1;;x++)
{
if(!a[x])
{
break;
}
cout<<a[x];
}
cout<<" 失败 \n"<<endl;
cout<<"规约失败,不可接受"<<endl;
break;
}
}
else
{
cout<<" = "<<a[j]<<" ";
for(l=0;l<=j;l++)
{
cout<<" ";
}
for(int x=j+1;;x++)
{
if(!a[x])
{
break;
}
cout<<a[x];
}
cout<<" 移进 "<<endl;
i=i+1;
S[i]=a[j];
j++;
S[i+1]=NULL;
continue;
}
}
else
{
cout<<" "<<a[j]<<" ";
for(l=0;l<=j;l++)
{
cout<<" ";
}
for(int x=j+1;;x++)
{
if(!a[x])
{
break;
}
cout<<a[x];
}
cout<<" 失败 \n"<<endl;
cout<<"规约失败,不可接受"<<endl;
break;
}
}
}
if(g==1) break;
//if(a[j]=='#') break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -