📄 suanfu.txt
字号:
#include<iostream>
#include<malloc.h>
#include<cstring>
#include<iomanip>
using namespace std;
bool pd();
void pd1();
void pd2();
void bj();
int bj1(char ch);
void showstack();
int k,j,step=0;
int sign;
char Stack[100];
char a,Q;
char Vn[5]={'e','E','T','F','P'};
//char *Vt[7]={"+","*","^","i","(",")","#"};
char Vt[7]={'+','*','^','i','(',')','#'};
char table[7][7]=
{
'>','<','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','$','$','>','>',
'<','<','<','<','<','=','$',
'>','>','>','$','$','>','>',
'<','<','<','<','<','$','=',
};
char *P[]={"e->#E#","E->E+T","E->T","T->T*F","T->F","F->P^F","F->P","P->(E)","P->i"};
//判断是否是终结符
bool pd(char a)
{
if(a=='+'||a=='*'||a=='^'||a=='i'||a=='('||a==')'||a=='#')
return 1;
else
return 0;
}
//根据算符优先表比较匹配
void bj()
{
int m=bj1(Stack[j]);
int n=bj1(a);
if(table[m][n]=='>')
{
Q=Stack[j];
pd2();
m=bj1(Stack[j]);
n=bj1(Q);
if(table[m][n]=='<')
{
sign=2;
showstack();
k=j+1;
Stack[k]='N';
pd1();
}
else
{
Q=Stack[j];
pd2();
}
}
else if(table[m][n]=='<')
{
sign=1;
showstack();
k=k+1;
Stack[k]=a;
a=getchar();
pd1();
}
else if(table[m][n]=='=')
{
m=bj1(Stack[j]);
n=bj1('#');
if(table[m][n]=='=')
{
sign=3;
showstack();
cout<<" 正确! "<<endl;
}
else
{
showstack();
k=k+1;
Stack[k]=a;
a=getchar();
pd1();
}
}
else
{
showstack();
cout<<" error!"<<endl;
}
}
int bj1(char ch)
{
if(ch=='+')
return 0;
else if(ch=='*')
return 1;
else if(ch=='^')
return 2;
else if(ch=='i')
return 3;
else if(ch=='(')
return 4;
else if(ch==')')
return 5;
else if(ch=='#')
return 6;
}
//
void pd1()
{
if(pd(Stack[k])==1)
j=k;
else
j=k-1;
bj();
}
void pd2()
{
if(pd(Stack[j-1])==1)
j=j-1;
else
j=j-2;
}
void showstack()
{
step++;
if(step==1)
cout<<"\n 步骤 当前符号 移进或规约 符号栈\n";
cout<<" "<<setw(2)<<step<<" "<<a<<" ";
if(sign==1)
cout<<"移进 ";
else if(sign==2)
cout<<"归约 ";
else if(sign==3)
cout<<"接受 ";
for(int n=0;n<=k;n++)
{
cout<<Stack[n];
}
cout<<endl;
}
void main()
{
cout<<"---->给定文法为:<-----\n"<<endl;
for(int i=0;i<9;i++)
{
cout<<" "<<P[i]<<endl;
}
cout<<"---->算符优先关系表为:<----\n"<<endl;
for(int j=0;j<7;j++)
{
cout<<setw(3)<<Vt[j];
}
cout<<endl;
for(int m=0;m<7;m++)
{
cout<<Vt[m];
for(int n=0;n<7;n++)
{
if(table[m][n]!='$')
cout<<setw(3)<<table[m][n];
else
cout<<setw(3)<<"";
}
cout<<endl;
}
cout<<"---->请输入表达式<----"<<endl;
k=0;
Stack[k]='#';
a=getchar();
sign=1;
pd1();
}
//char *P[]={"#E#","E+T","T","T*F","F","P^F","P","(E)","i"};
//char number[5][2]={1,0,2,3,4,5,6,7,8,9};
/*void main()
{
for(int i=0;i<5;i++)
{
for(int j=0;j<2;j++)
{
if(number[i][j]!=0)
{
cout<<" "<<Vn[i]<<"->"<<P[number[i][j]-1]<<endl;
}
}
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -