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

📄 ll1分析.cpp

📁 编译器中LL(1)算法的简单实现
💻 CPP
字号:
// LL1分析.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "analysis.h"
/**************
文法描述:
E->TE'
E'->ATE'|ε
T->FT'
T'->MFT'|ε
F->(E)|i
A->+|-
M->*|/
**************/

//读入实验一中的二元式文件内容并完成转换
void ReadBuff()
{
	char in[20];
	FILE *infile;
	do{
		printf("\n请输入需要分析的源文件路径:");
		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,",");  //用,分隔字符串b 
		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++] = '#';
}

//打印输出分析过程
void PrintStep()
{

	printf("%3d       ",step);
	for(int i=0; i< top; i++)
		printf("%c",stack[i]);
	for(int k=0; k< 12-i; k++)
		printf(" ");
	for(int j=index; j<(int)strlen(buff); j++)
		printf("%c",buff[j]);
	for(k=0; k< 10+index; k++)
		printf(" ");
	if(is_non_Terminate(currChar)){
		int m = transFeiZhongjie(currChar);
		int n = transZhongjie(buff[index]);
		if(M_LL1[m][n] != NULL){
			printf("%c->%s",currChar,M_LL1[m][n]);
		}
		else{
			printf("分析出错");
		}
	}
	if(currChar == '#' && buff[index] == '#')
		printf("分析成功");
	printf("\n");
  
}

//LL(1)文法分析过程
bool LL1Parser()
{
	char* cc;
//	printf("输入字符:");
//	scanf("%s",buff);
	//读入二元式文件并完成转换
	ReadBuff();
	//相关初始化操作
	InitLL1Table();
	InitStack();
	step = 0;
	index = 0;
	push('#');
	push('E');
	printf("步骤     分析栈         余留输入串        所用产生式\n");
	do{
		step++;
		currChar = stack[top-1];
		PrintStep();
		if(is_terminate(currChar)){ //终结符号
			if(currChar == buff[index]){
				pop();
				index = index + 1;
			}
			else
			{
				return false;
			}
		}
		else if(is_non_Terminate(currChar)){ //非终结符号
			int m,n,j;
			m = transFeiZhongjie(currChar);
			n = transZhongjie(buff[index]);
			if(m == -1 || n== -1)
				return false;
			cc = M_LL1[m][n];
			if(cc == " " || cc == "" || cc == NULL) //出错
				return false;
			else if(cc == "e"){  //ε产生式
				pop();
			}else{  //非ε产生式
				j = strlen(cc);
				pop();
				while(j>0){
					j--;
					push(cc[j]);
				}
			}

		}
		else
		{
			return false;
		}
		if(currChar == '#' && buff[index] == '#')
			return true;
		else if(index == 0 && top==0)
			return false;
	}while(top>0);
	return true;
}


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-> LL(1)分析   2-> 退出\n");
		scanf("%d",&c);
		if(c==1){
			if(LL1Parser())
				printf("\n分析结果:输入串合法!\n");
			else
				printf("\n分析结果:输入串非法!\n");
		}else if(c==2)
			break;
		else printf("\n请选择正确选项!\n");
	}while(true);
	
	return 0;
}

⌨️ 快捷键说明

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