最近编译原理课程实验做LL(1)中的First和Follow文法的算法实现,百度了半天,要么是要钱,要么是觉得好复杂,作为学渣的我看不懂;那为了完成实验,只能自己慢慢搞出来,由于之前的课也没怎么听,研究这两个文法都用了好长时间,那么关于First和Follow的理解,网上有很好的教程,这边就不解释了;
注意:我本人是一名妥妥的学渣,为了完成实验,只试验了书上的案例,所以我实现的代码可能也只适用于书上的,如果换了给的条件,那么代码就可能出现偏差,如果是想要适应性较好的代码,请移步别的文章。
另外,Follow文法代码实现比较复杂,这边不贴出实现代码,如果想要,可以私信我。
First文法C语言实现:
#include
/*
E -> TE'
E' -> +TE'|e
T -> FT'
T' -> *FT'|e
F -> (E) |id
E'变为H
T'变为Y
E -> TH
H -> +TH|e
T -> FY
Y -> *FY|e
F -> (E)|id
*/
char *str[5][6] = {
"E","T","H"," "," "," ",
"H","+","T","H","|","e",
"T","F","Y"," "," "," ",
"Y","*","F","Y","|","e",
"F","(","E",")","|","id",
};
typedef struct{
char firstData[15];
char followData[15];
char equalFirst;
char equalFollow;
}follow;
follow fE;
follow fH;
follow fT;
follow fY;
follow fF;
//获取找到的相同的在哪一行
int getindex(char c){
char N[5];
int num = 0;
for (int i = 0 ; i<5; i++) {
N[i] = *str[i][0];
}
for (int i = 0; i<5; i++) {
if(c == N[i]){
num = i;
}
}
return num;
}
//first文法,第一个参数传入所求的字母,第二个为在该首字母在哪一行,第三个为存储First的数组。
void getFirst(char c,int num,char *x){
int index = num;
int m;
for (int i = num; i<5; i++) {
for (int j = 1; j<6; j++) {
m = getindex(*str[i][j]);
if(m !=0){
index = m;
getFirst(*str[i][j], index,x);
}else{
m = index;
x[4] = *str[m][j];
if(*str[m][4] == '|'){
x[5] = ',';
x[6] = *str[m][5];
x[7] = '}';
}
}
break;
}
break;
}
}
//获取所有first文法,其实就是将代码封装了一下,方便打印输出
void getAllFirst(char c,char *First,int num){
First[0] = c;
First[1] = '-';
First[2] = '>';
First[3] = '{';
getFirst(First[0], num, First);
for (int i = 0; i<10; i++) {
printf("%c",First[i]);
}
printf("\n");
}
main函数实现:
int main(int argc, const char * argv[]) {
printf("公式:\n");
for (int i = 0; i<5; i++) {
for (int j = 0; j<6; j++) {
printf("%c",*str[i][j]);
if(j == 0){
printf("->");
}
}
printf("\n");
}
printf("\n");
printf("First:\n");
getAllFirst(*str[0][0], fE.firstData,0);
getAllFirst(*str[1][0], fH.firstData,1);
getAllFirst(*str[2][0], fT.firstData,2);
getAllFirst(*str[3][0], fY.firstData,3);
getAllFirst(*str[4][0], fF.firstData,4);
printf("\n");
return 0;
}
再次声明:此代码实现可能只适用于书上的案例,方法很取巧;
执行结果:
iShot2020-11-29 10.36.49.png
Follow文法代码实现太复杂,这边就不放出来了,只是为了完成实验报告,老师要求不高。。。。。
里面包含了Follow实现的部分代码,不需要的可以删除