📄 test.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 + -