www.pudn.com > SyntaxAnalysis.rar > Test.cpp


#include  
#include  
#include  
 
#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 函数结束