📄 shiyan3.txt
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dos.h>
char A[20];//分析栈
char B[20];//剩余字符串
char vt[20];//非终结符
char vn[20];//终结符
int inputlen = 0,vtlen,vnlen,loop = 0,conlen=0,top = 0;
int b = 0;
typedef struct type
{
char left;
char right[5];
int length;
}type;
type convey[10];
type C[10][10];
void init()
{
int i,j;
for(i = 0;i<10;i++)
for(j = 0;j<10;j++)
{
C[i][j].left = 'N';
}
}
//输出分析栈
void printA()
{
int p;
for(p = 0;p<=top+1;p++)
printf("%c",A[p]);
printf("\t\t");
}
//输出剩余串
void printB()
{
int q;
for(q = 0;q<b;q++)
printf(" ");
for(q = b;q<=inputlen;q++)
printf("%c",B[q]);
printf("\t\t\t");
}
void main()
{
char ch,x;
type temp;
int i,j,k;
int row,col;
int finish = 0,flag = 0;
init();
printf("请输入非终结符(以'#'结束):");
i = 0;
do
{
ch = getchar();
vt[i] = ch;
i++;
}while(ch!='#');
vtlen = i;
printf("\n");
printf("请输入终结符(以'#'结束):");
j = 0;
do
{
ch = getchar();
vn[j] = ch;
j++;
}while(ch!='#');
vnlen = j;
printf("\n");
i = 0;
do
{
printf("请输入第 %d 个产生式:\n",++loop);
getchar();
printf("\t产生式左部:");
temp.left = getchar();
getchar();
printf("\t产生式右部(空用'^'表示):");
j = 0;
do
{
ch = getchar();
temp.right[j] = ch;
j++;
}while(ch!='#');
temp.length = j;
convey[conlen++] = temp;
getchar();
printf("请输入此产生式在分析表中的位置:");
scanf("%d %d",&row,&col);
getchar();
C[row][col] = temp;
printf("\n还要继续输入吗?(Y/N)");
ch = getchar();
if(ch=='Y')
continue;
else
break;
getchar();
}while(1);
printf("请输入要分析串:");
do
{
scanf("%c",&ch);
B[inputlen] = ch;
inputlen++;
//判断输入是否有违禁字符
for(i = 0;i<vnlen;i++)
if(vn[i]!=ch)
continue;
if(i==vnlen)
{
printf("输入中有违禁字符!");
exit(1);
}
}while(ch!='#');
ch = B[0];//当前分析字符
A[top] = '#';
A[++top] = vt[0];
printf("步骤\t\t分析栈 \t\t剩余字符 \t\t所用产生式\n");
do
{
x = A[top--];//x为当前栈顶字符
printf("%d",k++);
printf("\t\t");
for(j=0;j<vnlen;j++)
if(x==vn[j])
{
flag = 1;
break;
}
if(flag==1)
{
if(x=='#')
{
finish = 1;
printf("acc!\n");
getchar();
getchar();
exit(1);
}
if(x==ch)
{
printA();
printB();
printf("%c匹配\n",ch);
ch = B[++b];
flag = 0;
}
else
{
printA();
printB();
printf("%c出错\n",ch);
exit(1);
}
}
else
{
for(j=0;j<vtlen;j++)
if(x==vt[j])
{
row = j;
break;
}
for(j = 0;j<vnlen;j++)
if(ch==vn[j])
{
col = j;
break;
}
temp = C[row][col];
if(temp.left!='N')
{
printA();
printB();
printf("%c->",temp.left);
for(j = 0;j<temp.length;j++)
printf("%c",temp.right[j]);
printf("\n");
for(j=(temp.length-1);j>=0;j--)
A[++top] = temp.right[j];
if(A[top]=='^')//为空则不进栈
top--;
}
else
{
printA();
printB();
printf("%c出错\n",x);
exit(1);
}
}
}while(finish==0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -