北邮编译原理-语义的分析文档和程序.docxVIP

北邮编译原理-语义的分析文档和程序.docx

  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文档。上传文档
查看更多
北邮编译原理-语义的分析文档和程序

实验报告班级:2011211314姓名:oneseven学号:一.题目:语义分析程序的设计与实现。二.实验内容:编写语义分析程序,实现对算术表达式的类型检查和求值。要求所分析算术表达式由如下的文法产生。E-E+T|E-T|T T-T*F|T/F|F F-num.num|(E)|num三.实验要求:用自底向上的语法制导翻译技术实现对表达式的分析和翻译。(1)写出满足要求的语法制导定义或翻译方案。(2)编写分析程序,实现对表达式的类型进行检查和求值,并输出:1.分析过程中所有产生式。2.识别出的表达式的类型。3.识别出的表达式的值。(3)实验方法:可以选用以下两种方法之一。1.自己编写分析程序。2.利用YACC自动生成工具。四.实验分析:1.步骤:(1)根据题目所给出的文法构造相应的拓广文法,并求出该文法各非终结符的FIRST、FOLLOW集合;(2)构造拓广文法的项目集规范族,并构造出识别所有前缀的DFA;(3)构造文法的LR分析表;(4)由此构造LR分析程序。(5)写出满足要求的翻译方案。(6)实现对表达式的类型进行检查和求值,并输出。2.实现方法:1.输入缓冲区为一个字符型数组,读入输入的算术表达式并保存在此,以’$’结束;2.定义两个二维整形数组,goto和action,其值大于零代表移进操作,小于零代表规约操作,引进的状态或规约用到的产生式又绝对值表示。等于零代表出现错误。等于特殊值-10代表acc.状态。3.处理输入表达式中代表id和num的子串,分别将它们转化为i和n进行分析;4.根据分析表,相应进行语法分析,移近或规约,按算法4.3的步骤完成过程。5.由于要求进行类型检查和求值,所以可以定义两个综合属性,一个记录值一个记录类型,存放在结构中,一并传入传出。输出的产生式可以作为虚拟综合属性,在产生式的最后打印出来。将类型检查和求值归于一次扫描,把类型和值赋给相应的表达式。由于只具有综合属性,故可以用S属性的自底向上翻译实现,利用LR分析程序来实现,只需扩充分析站和改造分析程序。本次实验是基于语法分析方法3,因此相关的代码和文档类似于上次实验。3.翻译方案:E-E’+T{E.val=E’.val+T.val}{if(E’.type==real||T.type==real)E.type=real;elseE.type=integer;}E-E’-T{E.val=E’.val-T.val}{if(E’.type==real||T.type==real)E.type=real;else E.type=integer;}E - T{E.val= T.val}{E.type=T.type}T-T’*F{T.val=T’.val*F.val}{if(T’.type==real||F.type==real)T.type=real;elseT.type=integer;}T-T’/F{T.val=T’.val/F.val}{if(T’.type==real||F.type==real)T.type=real;else T.type=integer;}T - F{T.val=F.val}{T.type=F.type}F - num.num{F.val=num.num.val} {F.type=real}F - (E){F.val=E.val}{F.type=E.type}F - num{F.val=num.val} {F.type=integer}3.计算过程:文法对应的拓广文法为:(0)E’-E (1) E - E+T (2)E - E-T (3) E - T (4)T - T*F(5)T - T/F(6)T - F (7)F - num.num (8)F - (E)(9)F - num求的各个非终结符的FIRST、FOLLOW集合为:ETFFIRST(, num(, num (, numFOLLOW$, ), +, -$, ), +, -, *, /$, ), +, -, *, /4.SLR(1)分析表为:状态+-*/().Num$ETF0S5S41231S6S7acc2R3R3S8S9R3R33R6R6R6R6R6R64R9R9R9R9R9S10R95S5S411236S5S41237S5S41338S5S4149S5S41510S1611S6S7S1712R1R1S9S10R1R113R2R2S9S10R2R214R4R4R4R4R4R415R5R5R5R5R5R516R7R7R7R7R7R717R8R8R8rR8R8R85.主程序说明:void Get_str(void) //获取待分析输入表达式intJudge_num(char ch) //判断字符是否为构成num的数字intGet_ternum(cha

文档评论(0)

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

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档