logo资料库

合肥工业大学编译原理课程设计报告.docx

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
计算机与信息学院 编译原理课程设计 实验报告 专 业 班 级 学生姓名及学号 课 程 教 学 班 号 任 课 教 师 实 验 指 导 教 师 实 验 地 点 学年第 学期
设计目的及要求: 集合 LASTVT(P)构造算法的程序实现 设计内容及要求:构造一程序,实现教材 P.91 的 LASTVT(P)集合的构造算法。对任 一给定的算符文法 G,程序输出所有非终结符 P 的 LASTVT(P)。 设计内容: 实现教材上的算法,对于任意给定的算符文法,输出算符文法中所有的非终结符 P 的 LASTV(P); 主要算法描述: 对于输入的文法,使用一个 char 型二维数组进行存储,依次对每个非终结符求 LASTVT 集。 输入输出形式: 输入: 程序运行后从控制台输入算符文法,要指定输入的文法规则数目,且形式与教材文法 相同。 输出:在控制台输出每个非终结符的 LASTVT 集,且将带有‘|’的文法转换成多个文法。 总结: 本次课程设计我借鉴了第四学期编译原理课程的课程实验,通过本次课程设计我对编译原理 课程的相关内容有了复习和巩固,对当时没有弄清楚的问题有了更深的认识,更加掌握了 LASTVT 集的生成原理,帮助我更好地理解了算符优先分析算法。
程序运行结果:
程序源码: #include #include #include using namespace std; char lable[20]; //文法终极符集 char String[20][10]; //用于输入串的分析 int r; int r1; //文法规则个数 //转化后文法规则个数 char st[10][30]; //用来存储文法规则 char last[10][10]; //文法非终结符 LASTVT 集 int lflag[10] = { 0 }; //标志第 i 个非终结符的 LASTVT 集是否已求出 //判断是否是终结符 int zhongjie(char c) //判断字符 c 是否是终极符 { } int i; for (i = 0; lable[i] != '\0'; i++) { } if (c == lable[i]) return 1; return 0; //求 lastvt 集 void lastvt(char c) { int i, j, k, m, n; for (i = 0; i
} if (lflag[i] == 0) { n = last[i][0] + 1; m = 0; do { if (st[i][m + 1] == '\0' || st[i][m + 1] == '|') { if (zhongjie(st[i][m])) last[i][n] = st[i][m]; n++; { } else { if (zhongjie(st[i][m - 1])) { } last[i][n] = st[i][m - 1]; n++; if (st[i][m] != c) { lastvt(st[i][m]); for (j = 0; j
} } } } } m++; } while (st[i][m] != '\0'); last[i][n] = '\0'; last[i][0] = --n; lflag[i] = 1; } } //转换 “|” void transform() // 转换 带"|"的文法 { char text[20][10]; int i, j, l, x = 0, y = 0; x = 0; for (i = 0; i
} } text[x][y] = '\0'; x++; y = 0; } r1 = x; printf("转化后的文法为:\n"); for (i = 0; i" 后的转化文法)*/ String[i][0] = text[i][0]; for (j = 3, l = 1; text[i][j] != '\0'; j++, l++) String[i][l] = text[i][j]; String[i][l] = '\0'; { } } //每个非终结符求 lastvt void table2() { } for (int i = 0; i
/*last[i][0]表示 LASTVT 集中元素的个数*/ last[i][0] = 0; } for (i = 0; i'Z') { } printf("不是算符文法!\n"); exit(-1); if (st[i][j] >= 'A'&&st[i][j] <= 'Z') { } if (st[i][j + 1] >= 'A'&&st[i][j + 1] <= 'Z') { } printf("不是算符文法!\n"); exit(-1); } } for (i = 0; i'Z') && st[i][j] != '-'&&st[i][j] != '>'&&st[i][j] != '|') lable[k++] = st[i][j]; } } } //输出结果 void output() { int i = 0, j = 0; printf("每个非终结符的 LASTVT 集为:\n"); //输出每个非终结符的 LASTVT 集 for (i = 0; i
分享到:
收藏