文档详情

编译原理课程设计报告---集合LASTVT(P)构造算法的程序实现.docx

发布:2020-12-10约3.05千字共9页下载文档
文本预览下载声明
计算机与信息学院 编译原理课程设计实验报告 专业班级 学生姓名及学号 课程教学班号 任课教师 实验指导教师 实验地点 学年第学期 设计目的及要求: 集合LASTVT(P构造算法的程序实现 设计内容及要求:构造一程序,实现教材 P.91的LASTVT(P)集合的构造算法。对任 一给定的算符文法 G,程序输出所有非终结符 P的LASTVT(P)。 设计内容: 实现教材上的算法,对于任意给定的算符文法,输出算符文法中所有的非终结符 P的 LASTV(P); 主要算法描述: 对于输入的文法,使用一个 char型二维数组进行存储,依次对每个非终结符求 LASTVT 输入输出形式: 输入:程序运行后从控制台输入算符文法,要指定输入的文法规则数目,且形式与教材文法 相同。 输出:在控制台输出每个非终结符的 LASTVT集,且将带有T的文法转换成多个文法。 总结: 本次课程设计我借鉴了第四学期编译原理课程的课程实验,通过本次课程设计我对编译原理 课程的相关内容有了复习和巩固,对当时没有弄清楚的问题有了更深的认识,更加掌握了 LASTVT集的生成原理,帮助我更好地理解了算符优先分析算法。 程序运行结果: a 旦 r\Wi nd m 3 ex rll 程序源码: #inelude stdio.h #inelude stdlib.h #include iostream using namespace std; char lable[20]; //文法终极符集 char Strin g[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) // 求 LASTVT集 { int i, j, k, m, n; for (i = 0; ir; i++) if (st[i][0] == c) break; } if (lflag[i] == 0) n = last[i][0] + 1; m = 0; do { if (st[i][m + 1] == \0 || st[i][m + 1] == |) { if (zh on gjie(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; jr; j++) for (t = 0; tn; t++) }| x++; x++; } m++; } while (st[i][m] != \0); las t[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; ir; i++) { text[x][y] = st[i][0]; y++; for (j = 1; st[i][j] != \0; j++) { if (st[i][j] == T) { text[x][y] = \0; text [ x][y++]=- text [ x][y++]= text[x][y] = \0; y = 0; } r1 = x; printf(“转化后的文法为:\n); for (i = 0; ix; i++) //输出转化后的文法规则串 { } prin tf( %s\n, text[i]); for (i = 0; ix; i++) /*求每个终结符的推导结果(去掉- 后的转化文法)*/ { Stri ng[i][0] = text[i][0]; for (j = 3, l = 1; text[i][j] != \0; j++, l++) Strin g[i][l]= text[i][j]; String[i][l]
显示全部
相似文档