已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深 圳 大 学实 验 报 告课程名称:编译原理实验名称:文法的化简和改造姓 名:学 号:班 级:实验日期:第6周、第8周实验课一.实验目的1) 编写文法的化简和改造程序;二.实验环境1) 硬件环境:计算机;2) 软件环境:C/C+编译器;三.实验内容1. 用C/C+语言编写方法的化简和改造程序,实现以下功能之一(如实现两个功能,则满分为110分;如实现三个功能,则满分为120分):(1) 无用符号和无用产生式的删除,参考课本中算法2.1和算法2.2。(2) -产生式的消除,参考课本中算法2.3、2.4和2.5。(3) 单产生式的消除,参考课本中算法2.6。从文件或终端中读入文法,并将化简和改造后的文法输出到另一文件或终端中。文法的表示如下:S-aSS-WS-UU-aV-bV V-acW-aW用空字符表示用大写的拉丁字母表示文法的非终结符号,用小写的拉丁字母表示文法的终结符号,每个产生式占一行,第一个产生式的左部为开始符号。在下面写出代码,并用课本2.4节中相应的例子进行验证,提供相应的截图(对窗口截图时先同时按alt和prtscn键,再按ctrl+v粘贴)答:课本中的结果为:S-aS S-U U-a而在实验中输出结果为:S-aS S-a下面是书本中算法的主要代码:/algorithm21, algorithm22用于消除无用产生式/算法2.1void algorithm21()SymbolSet VN1;ProductionSet P1;struct Lnode *left = NULL;struct Rnode *right = NULL;int flag = 0, added = 1;VN1.next = NULL;P1.next = NULL;P1.num = 0;/第一步left = Productions.next;while(left)flag = 1;right = left-right;while(right)if(strcmp(right-name, ) = 0)break;if(IsInSet(&Terminators, right-name) = 0)flag = 0;break;right = right-next;if(flag = 1)/如果原来不存在则添加if(IsInSet(&VN1, left-name) = 0)AddSym(&VN1, left-name);left = left-next;/第二步added = 1;while(added)added = 0;left = Productions.next;while(left)flag = 1;right = left-right;while(right)if(strcmp(right-name, ) = 0)break;if(IsInSet(&Terminators, right-name) = 0) & ( IsInSet(&VN1, right-name) = 0)flag = 0;break;right = right-next;if(flag = 1)/如果原来不存在则添加if(IsInSet(&VN1, left-name) = 0)AddSym(&VN1, left-name);added = 1;left = left-next;/第三步left = Productions.next;while(left)flag = 1;right = left-right;while(right)if(strcmp(right-name, ) = 0)break;if(IsInSet(&Terminators, right-name) = 0) &( IsInSet(&VN1, right-name) = 0)flag = 0;break;right = right-next;if(flag = 1)AddPro(&P1, left);left = left-next;/转移到系统链表集合/删除原有的ClearProductionSet(&Productions);DestroySymbolSet(&NonTerminators);/转移Productions.num = P1.num;Productions.next = P1.next;NonTerminators.next = VN1.next;/算法2.2void algorithm22()SymbolSet VN1, VT1;ProductionSet P1;struct Lnode *left = NULL;struct Rnode *right = NULL;int flag = 0, added = 1;VN1.next = NULL;VT1.next = NULL;P1.next = NULL;P1.num = 0;/开始符号放入VN1AddSym(&VN1, Start);/第一步added = 1;while(added)added = 0;left = Productions.next;while(left)if(IsInSet(&VN1, left-name) = 1)right = left-right;while(right)if(IsInSet(&NonTerminators, right-name) = 1)added = AddSym(&VN1, right-name);else if(IsInSet(&Terminators, right-name) = 1 | strcmp(right-name, ) = 0)added = AddSym(&VT1, right-name);right = right-next;left = left-next;/第二步left = Productions.next;while(left)flag = 1;if(IsInSet(&VN1, left-name) = 1)right = left-right;while(right)if(IsInSet(&VN1, right-name) = 0 & IsInSet(&VT1, right-name) = 0)flag = 0;break;right = right-next;if(flag = 1)AddPro(&P1, left);left = left-next;/转移到系统链表集合/删除原有的ClearProductionSet(&Productions);DestroySymbolSet(&NonTerminators);DestroySymbolSet(&Terminators);/转移Productions.num = P1.num;Productions.next = P1.next;NonTerminators.next = VN1.next;Terminators.next = VT1.next;/algorithm23,algorithm24用于消除-产生式/算法2.3void algorithm23()struct Lnode *left = NULL;struct Rnode *right = NULL;int flag = 0, added = 1;W1.next = NULL;W2.next = NULL;/第一步left = Productions.next;while(left)right = left-right;/如果是空产生式if(right-next = NULL) & strcmp(right-name, ) = 0)AddSym(&W1, left-name);left = left-next;/第二步added = 1;while(added)added = 0;left = Productions.next;while(left)flag = 1;right = left-right;while(right)if(IsInSet(&W1, right-name) = 0)flag = 0;break;right = right-next;if(flag = 1)added = AddSym(&W1, left-name);left = left-next;/algorithm23结束,等待算法2.4/算法2.4void algorithm24()ProductionSet P1;struct Symbol *sym = NULL;struct Lnode *left = NULL, *ltmp = NULL, *tmpNew = NULL;struct Rnode *right = NULL, *rtmp = NULL;int flag = 0, added = 1;P1.next = NULL;P1.num = 0;/第一步sym = NonTerminators.next;while(sym)if(IsInSet(&W1, sym-name) = 0)AddSym(&W2, sym-name);sym = sym-next;/第二步left = Productions.next;while(left)tmpNew = (struct Lnode *)malloc(sizeof(struct Lnode);tmpNew-name = (char *)malloc(strlen(left-name) + 1);strcpy(tmpNew-name, left-name);tmpNew-next = NULL;tmpNew-right = NULL;forAlgo24(&P1, left, left-right, tmpNew);left = left-next;/转移ClearProductionSet(&Productions);Productions.next = P1.next;Productions.num = P1.num;/递归添加产生式void forAlgo24(ProductionSet *Set, struct Lnode *left, struct Rnode *tail, struct Lnode *p)struct Lnode *ltmp = NULL, *new1 = NULL, *new2 = NULL;struct Rnode *rtmp = NULL, *rt1 = NULL, *rt2 = NULL, *tailTmp = NULL;if(tail = NULL)rtmp = p-right;if(strcmp(rtmp-name, ) = 0 & rtmp-next = NULL)return;elseAddPro(Set, p);else if(IsInSet(&W1, left-name) = 0)/复制pnew1 = (struct Lnode *)malloc(sizeof(struct Lnode);new1-name = (char *)malloc(strlen(p-name) + 1);strcpy(new1-name, p-name);new1-next = NULL;new1-right = NULL;rt1 = p-right;while(rt1)rt2 = (struct Rnode *)malloc(sizeof(struct Rnode);rt2-name = (char *)malloc(strlen(rt1-name) + 1);strcpy(rt2-name, rt1-name);rt2-next = NULL;if(new1-right = NULL)new1-right = rt2;tailTmp = new1-right;elsetailTmp-next = rt2;tailTmp = tailTmp-next;rt1 = rt1-next;rt2 = (struct Rnode *)malloc(sizeof(struct Rnode);rt2-name = (char *)malloc(strlen(tail-name) + 1);strcpy(rt2-name, tail-name);rt2-next = NULL;if(tailTmp = NULL)new1-right = rt2;elsetailTmp-next = rt2;forAlgo24(Set, left, tail-next, new1);else/复制p,1new1 = (struct Lnode *)malloc(sizeof(struct Lnode);new1-name = (char *)malloc(strlen(p-name) + 1);strcpy(new1-name, p-name);new1-next = NULL;new1-right = NULL;rt1 = p-right;while(rt1)rt2 = (struct Rnode *)malloc(sizeof(struct Rnode);rt2-name = (char *)malloc(strlen(rt1-name) + 1);strcpy(rt2-name, rt1-name);rt2-next = NULL;if(new1-right = NULL)new1-right = rt2;tailTmp = new1-right;elsetailTmp-next = rt2;tailTmp = tailTmp-next;rt1 = rt1-next;rt2 = (struct Rnode *)malloc(sizeof(struct Rnode);rt2-name = (char *)malloc(strlen(tail-name) + 1);strcpy(rt2-name, tail-name);rt2-next = NULL;if(tailTmp = NULL)new1-right = rt2;elsetailTmp-next = rt2;forAlgo24(Set, left, tail-next, new1);new1 = NULL;rt1 = rt2 = tailTmp = NULL;/复制p,2new2 = (struct Lnode *)malloc(sizeof(struct Lnode);new2-name = (char *)malloc(strlen(p-name) + 1);strcpy(new2-name, p-name);new2-next = NULL;new2-right = NULL;rt1 = p-right;while(rt1)rt2 = (struct Rnode *)malloc(sizeof(struct Rnode);rt2-name = (char *)malloc(strlen(rt1-name) + 1);strcpy(rt2-name, rt1-name);rt2-next = NULL;if(new2-right = NULL)new1-right = rt2;tailTmp = new1-right;elsetailTmp-next = rt2;tailTmp = tailTmp-next;rt1 = rt1-next;forAlgo24(Set, left, tail-next, new2);ClearLNode(p);/算法2.5void algorithm25()struct Lnode *left = NULL;struct Rnode *right = NULL;int flag = 0, added = 1;char tempMAXLEN = 0;memset(temp, 0, MAXLEN);/首先判断开始符号是否出现在产生式右部left = Productions.next;flag = 0;while(left & flag = 0)right = left-right;while(right)if(strcmp(Start, right-name) = 0)flag = 1;break;right = right-next;left = left-next;/算法2.6void algorithm26()ProductionSet P1;SymbolSet W;struct Lnode *left = NULL, *ltmp = NULL;struct Rnode *right = NULL, *rtmp = NULL;struct Symbol *sym = NULL;int flag = 0, added = 1;P1.next = NULL;P1.num = 0;W.next = NULL;left = Productions.next
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新能源行业氢能应用水平考试-氢燃料电池氢气循环系统设计考核试卷
- 2026中水淮河规划设计研究有限公司新员工招聘考试笔试备考题库及答案解析
- 2025山西太原学院第二批招聘博士研究生10人考试笔试参考题库附答案解析
- 2025广东广州市卫生健康委员会直属事业单位广州医科大学附属中医医院招聘13人(第一批)笔试考试备考题库及答案解析
- 2025安徽六安经济技术开发区消防救援大队政府专职消防队员招聘6人笔试考试备考题库及答案解析
- 2025天津市河北区产业发展集团有限公司面向社会招聘人力资源部部长1人笔试考试备考题库及答案解析
- 2025广西河池市罗城仫佬族自治县大数据发展局招聘1人考试笔试参考题库附答案解析
- 2025年山东省精神卫生中心公开招聘人员(6人)笔试考试参考试题及答案解析
- 2026年中国铁路昆明局集团有限公司招聘普通高校毕业生1321人(一)笔试考试备考题库及答案解析
- 2025广东“百万英才汇南粤”-惠州市第一人民医院招聘卫生专业技术人员52人考试笔试备考试题及答案解析
- 学前教育职业生涯人物访谈
- 心衰病慢性心力衰竭中医诊疗方案
- (11.4)-专题三 世界的图景及其存在 第七讲 五种必备的思维能力(下)
- 实际问题与反比例函数课件省名师优质课赛课获奖课件市赛课一等奖课件
- (完整版)10G409预应力管桩图集
- 《思想道德与法治》课件第四章明确价值要求践行价值准则第三节积极践行社会主义核心价值观
- 富氧节能环保燃烧技术介绍
- PCBA来料检验标准
- NB/T 10726-2021煤矿膏体充填管道输送工艺要求
- GB/T 3821-2015中小功率内燃机清洁度限值和测定方法
- 危害识别与风险评价
评论
0/150
提交评论