中间代码生成实验指导简介.docVIP

  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.文法及LR(1)分析表 文法使用包含加法、乘法及括号的文法,如图1.1所示(未消除左递归)。 该文法的拓广文法已存入文件Bnf.txt中,供语法分析程序调用,读取产生式信息。其Action表已存入LR1.lr1。 产生式对应语义动作: E(E(1)+T: {E.Place=NewTemp; Gen(+, E(1).Place, T.Place, E.Place);} E(T: {E.Place=T.Place;} T(T(1)*F: {T.Place=NewTemp; Gen(*, T(1).Place, F.Place, T.Place);} T(F: {T.Place=F.Place;} F((E): {F.Place=E.Place;} F(i: {F.Place=Entry(i);} 2.总控程序 编程在语法分析基础上完成,在用产生式进行归约时,根据所用产生式,产生一定的动作。 请将语法分析时所作程序的LR1Analysis()函数中的内容拷贝到新程序中相应位置,然后增加语义动作部分代码。 3.数据结构说明 从编程角度考虑,数据结构与语法分析的数据结构相比没有变化。 4.可能调用的函数 4.1 产生临时变量 在main()函数中,增加了临时变量链表WORDNODE *pTemp,该链表在调用LR1Analysis()时传入该函数,用于存放产生的临时变量。 函数WORDNODE *NewTemp(WORDNODE *pTempTail)用于产生一个临时变量,入口参数pTempTail是链表pTemp的尾节点,返回值是新创建的节点。 4.2 压入符号的变化 语法分析中,符号栈的每个元素应为如下结构: struct CHARNODE { char cCur; // 当前符号 WORDNODE *pWord; // 单词节点 }; 在中间代码生成中,该结构没有变化,但意义略有变化。语法分析中,当cCur为VN时,pWord为NULL,即不对应任何单词,这是通过调用PushChar()函数,第二个参数传入NULL实现的。 但在语法制导翻译中,文法中的VN有属性Place,这是一个指向单词值的指针。该指针可能指向词法分析器中分析出的单词,也可能指向一个临时变量。因此,在调用PushChar()时第二个参数有所变化。 如在用r1归约时,第二个参数应为新产生的临时变量的指针;在用r2进行归约时,第二个参数应为符号栈弹出的栈顶元素的单词指针;用r5归约时,则应该是弹出的第二个符号对应的单词指针(第一个和第三个是左括号和右括号,第二个是E的单词指针)。 4.3 四元式 InitMidCode():四元式初始化,在语法分析前初始化时调用。 void Gen(char Op, WORDNODE *pArg1, WORDNODE *pArg2, WORDNODE *pResult):生成一个四元式。 void PrintMidCode():打印出所产生的四元式,这个函数在main()函数中已经调用。 图1.1 实验所用文法

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档