编译原理课程设计报告 PL0语言编译程序扩展.docVIP

编译原理课程设计报告 PL0语言编译程序扩展.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
设计任务 1.给PL/0语言增加带else子句的条件语句和exit语句。exit语句作为while语句的非正常出口语句。若处于多层while语句中,则它只作为最内层while语句的非正常出口。若它没有处于任何while语句中,则是一个错误。(实现) 2.给PL/0语言增加实数类型。(思路,代码上暂未实现) 设计思想和实现方法 PL/0语言以赋值语句为基础,有顺序、条件和循环三种结构。PL/0有子程序概念,包括过程定义(可以嵌套)与调用且有局部变量说明。PL/0中唯一的数据类型是整型,可以用来说明该类型的常量和变量。同时,PL/0也具有算术运算和关系运算。 增加else语句功能:PL/0语言只有if-then结构,这里我们要增加if-then-else形式的语言结构。在对PL/0语言进行分析时,每当遇到if-then结构,就继续进行下一步判断,识别then语句结束后是否还有else语句,最后根据if条件的结果来处理程序的执行路径。故在then语句后加入相应代码进行相关判断。具体实现为在then语句判断结束时暂时不进行跳转,然后通过关键字识别,若有else存在则转入else的处理函数进行处理,若不存在则正常跳转结束。 增加exit语句功能:在这里我们要实现exit语句的出口功能。每当我们遇到exit时,由需求可知首先判断exit是否处于while循环中,也就是是否合法的问题。而题目中要求还能实现多层循环中仅执行最里层出口操作,我采用设置一个计数器的方式实现,每当进入一个while循环中的时候计数器加1,每退出一个while循环时计数器减1,这样通过检测计数器是否为0就能判断exit语句的合法与否,且多层循环也能实现在最里层跳出而不影响外层循环。 增加实数类型(思路):首先增加一个枚举类型如type,然后设置两种枚举元素如realNo和integerNO来表示实数和整数类型。这里实数主要用来实现的是小数的加入,因为整数原本PL0语言就已经能够识别。然后在符号表中增加一个枚举类型type的成员,增加之后再加入相应的符号类似于realsym用来处理那个识别出来带小数的数字类型,同时扩大norw的宏定义至合理值。然后再main函数初始化中加入相应的保留字和保留字符号,按二分查找的规则进行添加,以方便查找。最后在词法分析的时候,如果读入字符是一个数字的话,我们先假设是整数类型,继续读取下一个字符,假如遇到’.’,那么就设置为实数类型,并再次读入字符添加到原来的字符串后边,所后进行相应的判断处理另外在语句处理中,当我们遇到realNo类型要转换为integerNo的时候,做出错误处理,integerNo转换为realNo的时候我们默认做出转换不改变原先值,只进行小数点添加和精确度扩大。 3.程序说明 给PL/0增加带else的子条件语句(主要代码) else if(sym==ifsym) { getsym(); condition(fsys|thensym|dosym); if(sym==thensym) //遇到then语句进入 { getsym(); //读取下一个字符 } else { error(16); } cx1=cx; gen(jpc,0,0); //记录代码的分段位置,转移地址暂定为0 statement(fsys|semicolon|endsym|elsesym); //调用处理then语句后边的语句 code[cx1].a=cx+1; //将jpc转移地址改为当前位置+1 cx2=cx; gen(jmp,0,0); //记录代码分段位置 if(sym==semicolon) getsym(); if(sym==elsesym) //进入else语句处理 { getsym(); statement(fsys|semicolon|endsym); code[cx2].a=cx; //将jmp的转移位置改变为当前代码的位置 } else statement(fsys); } 给PL/0增加带exit语句(主要代码) else if(sym==whilesym) { circleNo++; //设置计数器计算while循环的层数 cx1=cx; getsym(); condition(fsys|dosym); cx2=cx; gen(jpc,0,0); if(sym==dosym)

文档评论(0)

1243595614 + 关注
实名认证
文档贡献者

文档有任何问题,请私信留言,会第一时间解决。

版权声明书
用户编号:7043023136000000

1亿VIP精品文档

相关文档