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

📄 编译原理实验2.txt

📁 【实验名称】递归子程序分析器的设计与实现 【实验目的和要求】 设计、编制
💻 TXT
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//子函数声明
int E();
int A();
int B();
int C();

//定义全局变量
char input[20];//存待分析的字符串
int k = 0;//控制待分析字符串的位置下标

int E()
{
	int flage = 0;
	if(input[k]=='#')//是否已结束
		return 1;
	else
	{
		//匹配
		if(input[k]!='e')
			return 0;
		else
		{
			k+=1;
			//调用带返回值的函数B(),返回1则继续,否则error
			flage = B();
			if(flage==0)
				return 0;
			else
			{
				k+=1;
				if(input[k]!='a')
					return 0;
				else
				{
					k++;
					//调用带返回值的函数A(),返回1则继续,否则error
					flage = A();
					if(flage==0)
						return 0;
					else 
						return 1;
				}
			}
		}
	}

}

//根据A->a|bAcB规则进行匹配
int A()
{
	int flaga = 0;//局部变量,作判断之用
	//是否结束
	if(input[k]=='#')
		return 1;
	else
	{
		if(input[k]=='a')
			return 1;
		else if(input[k]=='b')
		{
			k++;
			flaga = A();
			if(flaga == 0)
				return 0;
			else
			{
				k++;
				if(input[k]!='c')
					return 0;
				else
				{
					k++;
					flaga = B();
					if(flaga == 0)
						return 0;
					else
						return 1;
				}
			}
		}
		else 
			return 0;
	}
}

//根据B->dEd|aC规则进行匹配
int B()
{
	int flagb = 0;
	if(input[k]=='d')
	{
		k++;
		flagb = E();
		if(flagb==0)
			return 0;
		else
		{
			k++;
			if(input[k]=='d')
				return 1;
			else
				return 0;

		}
	}
	else if(input[k]=='a')
	{
		k++;
		flagb = C();
		if(flagb==0)
			return 0;
		else
			return 1;
	}
	else
		return 0;
}


//根据C->d|dC规则进行匹配
int C()
{
	int flagc = 0;
	if(input[k]=='e')
		return 1;
	else if(input[k]=='d')
	{
		k++;
		flagc = C();
		if(flagc==0)
			return 0;
		else 
			return 1;
	}
	else 
		return 0;

}

//主函数
void main()
{
	int i = 0;
	int flag = 0;
	char ch;
	//输出 说明性文字,增强程序的可读性 
	printf("*--------------递归子程序法分析器---------------*\n");
	printf("\n");
	printf("\n");
	//本程序只能分析下面文法的句子,其他需另行编程实现,方法相同
	printf("*-------------本程序分析的文法如下:-------------*\n");
	printf("*             G[E]:                             *\n");
	printf("*                   E->eBaA                     *\n");
	printf("*                   A->a|bAcB                   *\n");
	printf("*                   B->dEd|aC                   *\n");
	printf("*                   C->e|dC                     *\n");
	printf("*-----------------------------------------------*\n");
	printf("\n");
	printf("请输入待分析的字符串(以'#'结束):");
	printf("\n");
	//输入待分析的字符串,用循环来实现,将其存入input数组中
	do
	{
		ch = getchar();
		input[i] = ch;
		i++;
	}while(ch!='#');//字符串以#结束
	//分析开始,因为文法的识别符号为E ,故先调用此函数
	flag = E();
	//返回1,则说明是文法的句子
	if(flag==1)
		printf("\t\t--- 此字符串是该文法的句子!\n");
	//否则不是
	else
		printf("\t\t--- 此字符串不是该文法的句子!\n");
	printf("\n");
	printf("\t分析结束!\n");

	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -