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

📄 test.cpp

📁 此文件包含了《编译原理》课程设计中词法、语法分析器及代码优化的源代码
💻 CPP
字号:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define FEOF 0
#define NLRL 26
#define NLRC 25
#define NG 16
#define NLL 100
#define NLC 20
#define identifierNum 100

FILE * fp3, *fp4;
char strReadFile[20];

//
int main()
{
	// 函数声明
	void analyzer();

	analyzer();

	return 0;
} // main 函数结束
//

// 对某程序已通过词法分析的中间代码进行语法分析
void analyzer()
{
	int i, j, k;
	
    // ***************************
	// 循环读取grammar.txt
	// ***************************
	int i1 = 0;
	char grammar[NG][2];
	strcpy(strReadFile,"grammar.txt");
	fp3 = fopen(strReadFile, "r");
	if(fp3 == NULL)
	{
		printf("Can not open file!\n");
		exit(0);
	}
	while((feof(fp3)) == FEOF)
	{	
		fscanf(fp3,"%s ", grammar[i1]);
	//	printf("%s %d\n", grammar[i1], strlen(grammar[i1]));
		i1 = i1 + 1;
	};
	fclose(fp3);
	
	// ***************************
	// 循环读取 length.txt
	// ***************************
	int i2 = 0;
	int length[NG];
	strcpy(strReadFile,"length.txt");
	fp3 = fopen(strReadFile, "r");
	if(fp3 == NULL)
	{
		printf("Can not open file!\n");
		exit(0);
	}
	while((feof(fp3)) == FEOF)
	{	
		fscanf(fp3,"%d ", &length[i2]);
	//	printf("%d\n", length[i2]);
		i2 = i2 + 1;
	};
	fclose(fp3);

	// ***************************
	// 循环读取rightString.txt
	// ***************************
	int i4 = 0;
	char rightString[NLRC][5];
	strcpy(strReadFile,"rightString.txt");
	fp3 = fopen(strReadFile, "r");
	if(fp3 == NULL)
	{
		printf("Can not open file!\n");
		exit(0);
	}
	while((feof(fp3)) == FEOF)
	{	
		fscanf(fp3,"%s ", rightString[i4]);
	//	printf("%s %d\n", rightString[i4], strlen(rightString[i4]));
		i4 = i4 + 1;
	};
	fclose(fp3);
 	   
	// ****************************
	// 读入indirectResult.txt文件,进行语法分析
	// ****************************
	int i3 = 0;
	char indirectResult[NLL][NLC];
	strcpy(strReadFile,"indirectResult.txt");
	fp3 = fopen(strReadFile, "r");
	if(fp3 == NULL)
	{
		printf("Can not open file!\n");
		exit(0);
	}
	while((feof(fp3)) == FEOF)
	{	
		fscanf(fp3,"%s ", indirectResult[i3]);
	//	printf("%s %d\n", indirectResult[i3], strlen(indirectResult[i3]));
		i3 = i3 + 1;
	};
	fclose(fp3);

	// *********************************
	// 读入 LR-table.txt 分析表
	// ***********************************
	int LR[NLRL][NLRC];
	strcpy(strReadFile,"LR-table.txt");
	fp3 = fopen(strReadFile, "r");
//	fp4 = fopen("data.xls","w");
	if(fp3 == NULL)
	{
		printf("Can not open file!\n");
		exit(0);
	}
	for(i = 0; i < NLRL; ++i)
	{
		for(j = 0; j < NLRC; ++j)
		{
			fscanf(fp3,"%d ", &LR[i][j]);
		//	fprintf(fp4,"%d\t", LR[i][j]);
		}
	//	fprintf(fp4,"\n");
	}
//	fclose(fp4);
	fclose(fp3);

	int wid;
	int sort;
	printf("分析读入程序(记号ID):\n");
	int indirectResultNum[NLL];
	for(wid = 0; wid < i3; ++wid)
	{
		sort = (int)indirectResult[wid][0];
		// indirectResult[i] 和 indirectResultNum[i]对应
		// 先识别出一整个串,再根据开头识别是数字还是字母
		if((strcmp(indirectResult[wid],"void")) == 0)
		{
			indirectResultNum[wid] = 0;
		}
		else if((strcmp(indirectResult[wid],"main")) == 0)
		{
			indirectResultNum[wid] = 1;
		}
		else if((strcmp(indirectResult[wid],"()")) == 0)
		{
			indirectResultNum[wid] = 2;
		}
		else if((strcmp(indirectResult[wid],"{")) == 0)
		{
			indirectResultNum[wid] = 3;
		}
		else if((strcmp(indirectResult[wid],"int")) == 0)
		{
			indirectResultNum[wid] = 4;
		}
		else if((strcmp(indirectResult[wid],"=")) == 0)
		{
			indirectResultNum[wid] = 6;
		}
		else if((strcmp(indirectResult[wid],"}")) == 0)
		{
			indirectResultNum[wid] = 22;
		}
		else if((strcmp(indirectResult[wid],";")) == 0)
		{
			indirectResultNum[wid] = 23;
		}
		else // 识别变量和数字
		{
			if(sort > 47 && sort < 58)
				indirectResultNum[wid] = 7;
			else 
				indirectResultNum[wid] = 5;
		}
		printf("%s(%d)\n", indirectResult[wid], indirectResultNum[wid]);
	}
	indirectResultNum[wid] = 24;

	fp3 = fopen("result.txt","w");
	int a, state[100], llength, LRresult, right, t;
	char symbol[identifierNum][10], m[2];
	char error[20];// 错误类型
	state[0] = 0;
	strcpy(symbol[0],"#");
	int p1 = 0;
	int p2 = 0;
	printf("\n按文法规则归约顺序如下:\n");
	fprintf(fp3,"按文法规则归约顺序如下:\n");
	// ***************
	// 归约算法如下所显示
	// ***************
	while(true)
	{
		j = state[p2];
		
		k = indirectResultNum[p1];
		t = LR[j][k]; // 当出现t为0的时候
		if(t == 0)
		{
			if(k == 0)
				strcpy(error,"void");
			else if(k == 1)
				strcpy(error,"main");
			else if(k == 2)
				strcpy(error,"()");
			else if(k == 3)
				strcpy(error,"{");
			else if(k==4)
				strcpy(error,"int");
			else if(k == 6)
				strcpy(error,"=");
			else if(k == 22)
				strcpy(error,"}");
			else if(k == 23)
				strcpy(error,";");
			else
				strcpy(error,"其他错误符号");

			printf("\n检测结果:");
			printf("代码中存在语法错误");
			printf("错误状况:错误状态编号为 %d 读头下符号为 %s\n\n", j, error);
			fprintf(fp3,"%d %d\n", k, t);
			fclose(fp3);
			break;
		}
		else if(t == -100)	// -100 为达到接受状态
		{
			printf("\n");
			printf("\n检测结果: ");
			printf("代码通过语法检测!\n\n");
			fclose(fp3);
			break;
		}
		else if(t < 0 && t != 100)	// 归约操作
		{
			strcpy(m, grammar[-t]);
			printf("%s ", m);		// 输出开始符
			fprintf(fp3,"%s ", m);		// 输出开始符
			p2 = p2 - llength + 1;          
			right = 0;				// 存放该字符串在语法分析表中相对应的列
			for(i = 0; i < i4; ++i)
				if((strcmp(m, rightString[i])) == 0)
				{
					right = i;
					break;
				}
			if(right == 0)
			{
				printf("\n");
				printf("代码中有语法错误\n\n");
				fclose(fp3);
				break;
			}
			fprintf(fp3,"%d\n", LRresult);
			strcpy(symbol[p2], m);

			
			fprintf(fp3,"\n%d %d %d %d %d %s  %d  %d  %d  %d ", p1, p2, j, k, t, m, llength, right, a, LRresult);
			fprintf(fp3,"%s\n",indirectResult[p1]);
			
			//
			fprintf(fp3,"归约后\nstate: ");
			for(i = 0; i <= p2; ++i)
				fprintf(fp3," %d ", state[i]);
			fprintf(fp3,"\n");
			fprintf(fp3,"symbol: ");
			for(i = 0; i <= p2; ++i)
				fprintf(fp3," %s ", symbol[i]);
			fprintf(fp3,"\n");
			//
		}
		else if(t > 0)
		{	// 移近操作

			fprintf(fp3,"\n%d %d\n", p1, p2);

			p2 = p2 + 1;
			i = 0;
			symbol[p2][i] = '\0';
			p1 = p1 + 1;

			//
			fprintf(fp3,"%d %d ", p1, p2);
			fprintf(fp3,"%d %d %d ", j, k, t);
			fprintf(fp3,"%s\n",indirectResult[p1]);

			fprintf(fp3,"移近后\nstate: ");
			for(i = 0; i <= p2; ++i)
				fprintf(fp3," %d ", state[i]);
			fprintf(fp3,"\n");
			fprintf(fp3,"symbol: ");
			for(i = 0; i <= p2; ++i)
				fprintf(fp3," %s ", symbol[i]);
			fprintf(fp3,"\n");
			//
		}		
	}
	fclose(fp3);

	return ;
} // analyzer 函数结束

⌨️ 快捷键说明

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