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

📄 递归下降分析.cpp

📁 编译器中递归下降算法的简单实现
💻 CPP
字号:
// 递归下降分析.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "digui.h"
#include <stdlib.h>

/**************
文法描述:
	E->TE'
	E'->ATE'|ε
	T->FT'
	T'->MFT'|ε
	F->(E)|i
	A->+|-
	M->*|/
**************/

//读入实验一中的二元式文件内容并完成转换
void ReadBuff()
{
	char in[20];
	FILE *infile;
	do{
		printf("请输入需要分析的源文件路径:");
		scanf("%s",&in);
		infile = fopen(in, "r");
		if(infile==NULL) 
			printf("\n出错:未找到源文件,请再次输入源文件路径!\n\n");
	}while(infile==NULL);

	int id = 0, i = 0;
	char b[20];
	do{	
		fgets(b,20,infile); 
		char *cc; 
		cc = strtok(b,","); 
//		printf("\t%s\n",cc); 
		id = atoi(cc);
		switch(id){
		case 12:
		case 13:
			buff[i++] = 'i';
			break;
		case 25:
			buff[i++] = '/';
			break;
		case 26:
			buff[i++] = '+';
			break;
		case 27:
			buff[i++] = '-';
			break;
		case 28:
			buff[i++] = '*';
			break;
		case 30:
			buff[i++] = '(';
			break;
		case 31:
			buff[i++] = ')';
			break;
		default:
			break;
		} 
	}while(id != 0 && i <= 50);
	printf("\n转换为文法对应形式:%s\n\n",buff);

	int n = strlen(buff);
	buff[n++] = '#';
}

//判断是否正确结束递归过程
bool Recurrence()
{
	advance();
	E();
	if (currChar == '#')
		return true;
	else
		return false;
}

//进行递归调用
void Digui()
{
	//读入二元式并完成转换
	ReadBuff();

	printf("\n*****************************************\n");
	printf("  步 数     当前句柄   当前处理的字符\n");
	printf("*****************************************\n");
	
	if(Recurrence() && !tagOfError)
		printf("\n分析结果:输入串合法!\n");
	else
		printf("\n分析结果:输入串非法!\n");	
	
	//重置操作
	pointer = 0;
	tagOfError = false;
	step = 0;
}

int main(int argc, char* argv[])
{
	int c=0;
	printf("************************\n");
	printf("************************\n");
	printf("------------------------\n");
	printf("************************\n");
	printf("**  <文法描述>        **\n");
	printf("**    1:E->TE'        **\n");
	printf("**    2:E'->ATE'|ε   **\n");
	printf("**    3:T->FT'        **\n");
	printf("**    4:T'->MFT'|ε   **\n");
	printf("**    5:F->(E)|i      **\n");
	printf("**    6:A->+|-        **\n");
	printf("**    7:M->*|/        **\n");
	printf("************************\n");
	do{
		printf("\n请选择:1->递归下降分析   2->退出\n");
		scanf("%d",&c);
		if(c==1){
			Digui();
		}else if(c==2)
			break;
		else printf("请选择正确选项!\n");
	}while(true);

	return 0;
}

⌨️ 快捷键说明

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