⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shiyan3.txt

📁 【实验名称】LL(1)分析总控程序的设计与实现 【实验目的和要求】 设计、编制
💻 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 + -