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