📄 试验3.txt
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
char A[20];
char B[20];
char v1[20] = {'i','+','*','(',')','#'};
char v2[20] = {'E','G','T','S','F'};
int j = 0,b = 0,top = 0,l;
typedef struct type
{
char origin;
char array[5];
int length;
}type;
type e,t,g,g1,s,s1,f,f1;
type C[10][10];
void print()
{
int a;
for(a = 0;a<=top+1;a++)
{
printf("%c",A[a]);
}
printf("\t\t");
}
void print1()
{
int j;
for(j=0;j<b;j++)
printf(" ");
for(j = b;j<=l;j++)
printf("%c",B[j]);
printf("\t\t");
}
void main()
{
int m,n,k = 0,flag = 0,finish = 0;
char ch;
char x;
type cha;
e.origin = 'E';
strcpy(e.array,"TG");
e.length = 2;
t.origin = 'T';
strcpy(t.array,"FS");
t.length = 2;
g.origin = 'G';
strcpy(g.array,"+TG");
g.length = 3;
g1.origin = 'G';
g1.array[0] = '^';
g1.length = 1;
s.origin = 'S';
strcpy(s.array,"*FS");
s.length = 3;
s1.origin = 'S';
s1.array[0] = '^';
s1.length = 1;
f.origin = 'F';
strcpy(f.array,"(E)");
f.length = 3;
f1.origin = 'F';
f1.array[0] = 'i';
f1.length = 1;
for(m = 0;m<=4;m++)
for(n = 0;n <= 5;n++)
{
C[m][n].origin = 'N';
}
C[0][0] = e;
C[0][3] = e;
C[1][1] = g;
C[1][4] = g1;
C[1][5] = g1;
C[2][0] = t;
C[2][3] = t;
C[3][1] = s1;
C[3][2] = s;
C[3][4] = C[3][5] = s1;
C[4][0] = f1;
C[4][3] = f;
printf("提示:本程序只对由i,+,*,(,)构成的以#为结束的字符串进行分析,\n");
printf("请输入要分析的字符串:");
do
{
scanf("%c",&ch);
if((ch!='i') && (ch!='+') && (ch!='*') && (ch!='(') && (ch!=')') && (ch!='#'))
{
printf("输入中有违禁字符!\n");
exit(1);
}
B[j] = ch;
j++;
}while(ch!='#');
l = j;
ch = B[0];
A[top] = '#';
A[++top] = 'E';
printf("步骤\t\t分析栈 \t\t剩余字符 \t\t所用产生式\n");
do
{
x = A[top--];
printf("%d",k++);
printf("\t\t");
for(j = 0;j<=5;j++)
if(x==v1[j])
{
flag = 1;
break;
}
if(flag==1)
{
if(x=='#')
{
finish = 1;
printf("acc!\n");
getchar();
getchar();
exit(1);
}
if(x==ch)
{
print();
print1();
printf("%c匹配\n",ch);
ch = B[++b];
flag = 0;
}
else
{
print();
print1();
printf("%c出错\n",ch);
exit(1);
}
}
else
{
for(j = 0;j<=4;j++)
{
if(x==v2[j])
{
m = j;
break;
}
for(j = 0;j<=5;j++)
if(ch==v2[j])
{
n = j;
break;
}
cha = C[m][n];
if(cha.origin!='N')
{
print();
print1();
printf("%c->",cha.origin);
for(j = 0;j<cha.length;j++)
printf("%c",cha.array[j]);
printf("\n");
for(j = (cha.length-1);j>=0;j--)
A[++top] = cha.array[j];
if(A[top]=='^')
top--;
}
else
{
print();
print1();
printf("%c出错\n",x);
exit(1);
}
}
}
}while(finish == 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -