📄 yufa.cpp
字号:
#include<stdio.h>
#include<string.h>
#define N 6
char s[30];
int l=0;
char a,X;
char VN[4]={'S','H','M','A'};
char VT[4]={'a','d','b','e'};
int q=0;
char chuan[N];
struct FXB
{ char C[5];
}M[4][5]={{"aH","\0","\0","\0","\0"},{"aMd","d","\0","\0","\0"},{"Ab","!","!","Ab","\0"},{"aM","\0","\0","e","\0"}};
int chashu(char A[])
{ int i=0;
while(A[i]!='\0')
i++;
return i-1;
}
void insertstack(char A[])
{ int p;
p=chashu(A);
while(p>=0&&A[p]!='!')
{ l++;
s[l]=A[p];
p--;
}
}
void printfstack()
{ int m=0;
printf("\t");
while(s[m]!='\0'&&m<=l+1)
{printf("%c",s[m]);
m++;
}
printf("\t");
}
void print()
{ int i=q;
printf("\t");
while(chuan[i]!='\0')
{
printf("%c",chuan[i]);
i++;
}
printf("\t");
}
int chabiao()
{ int i,j,m,n;
for(j=0;j<4;j++)
if(X==VN[j])
m=j;
for(i=0;i<4;i++)
if(a==VT[i])
n=i;
if(M[m][n].C[0]!='\0')
{ insertstack(M[m][n].C);
return 1;
}
else
{printf("M[X][a]不是产生式,出错");
return 0;
}
}
void popstack()
{ X=s[l];
l--;
}
void main()
{
int t=1,i,j=1;
printf("请输入分析串:\n");
for(i=0;i<N;i++)
scanf("%c",&chuan[i]);
s[0]='#';
s[1]='S';
l=1;
printf("步骤\t分析栈\t\t剩余输入串\t推导用产生式或匹配\n");
printf("%d ",j);
while(t==1)
{
popstack();
printfstack();
print();
a=chuan[q];
for(i=0;i<4;i++)
if(X==VT[i])
{ if(X==a)
{ printf("\t'%c'匹配",a);
q++;
break;}
else
{ printf("不匹配,不是G[S]的句子");
t=0;
break;
}
}
if(i==4)
if(X=='#')
if(X==a)
{printf("分析成功");
t=0;
break;
}
else
{ printf("不匹配");
t=0;
}
else
t=chabiao();
j++;
printf("\n%d ",j);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -