第四的章 语义分析和中间代码生成.ppt

  1. 1、本文档共57页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四的章 语义分析和中间代码生成

【例】 赋值语句a=b*(c+d)相应的四元式代码为: (1) (+,c,d,t1) (2) (*,b,t1,t2) (3) (=,t2,_,a) 除前面所述的抽象语法树、逆波兰式、四元式外,常见的中间语言还有接近PASCAL形式的P-代码,接近C格式的C-代码等等。 4、其它表示法 4.4 简单算术表达式和赋值语句的翻译 相关的语义处理说明 对非终结符E定义语义变量E.place,即用E.place表示存放E值的变量名在符号表中的入口地址或临时变量名的整数码。 定义语义函数newtemp(),即每次调用newtemp()时都回送一个代表新临时变量的整数码;临时变量名按产生的顺序可设为T1、T2… 定义语义函数emit(op,arg1,arg2,result),emit的功能是产生一个四元式。 定义语义函数lookup(i.name),其功能是查找i.name是否出现在符号表中,是则返回i.name在符号表中的入口指针,否则返回null。 (1)S→i=E {p=lookup(i.name); if( p= =null) then error(); else emit(=, E.place,_,p);} (2) E→E1+E2 {E.place=newtemp( ); emit(+,E1.place,E2.place,E.place);} (3)E→E1*E2 {E.place=newtemp( ); emit(*,E1.place,E2.place,E.place);} 写出每个产生式对应的语义处理过程 (4) E →-E1 { E.place=newtemp( ); emit(uminus, E1.place ,_,E.place); } (5) E→(E1) {E.place=E1.place;} (6) E→i {p=lookup(i.name); if (p!=null) then E.place=p; else error( );} 表达式翻译中的其它问题 临时变量空间的统计 了解需求、及时释放 运算合法性检查 利用符号表保存的名字类型 类型自动转换 添加专用指令 两种方法:1)类似于算术表达式计算布尔表达式的值,用“1”表示“真”,用“0”表示“假”。2)“短路”计算的方法,用表达式的真、假出口表示运算后转移的地址。 真假出口表示法 给出两个表示语义的属性: E.tc,E为真时控制到达的位置; E.fc,E为假时控制到达的位置。 思考:布尔表达式如何翻译? 则有示例如下: a<b if a<b goto E.tc (j<,a,b,E.tc) goto E.fc (j,_,_,E.fc) E→E1 ∨ E2 如果E1为真,则立即可知E为真,即E1.tc与E.tc相同; 如果E1为假,则必须计算E2的值,令E1.false为E2的开始位置; E2的真假出口分别与E的真假出口相同 (1)E→i {E.tc=nxq;E.fc=nxq+1; emit(jnz, entry(i),_,0); emit(j, _,_,0);} (2) E→i1 rop i2 {E.tc=nxq;E.fc=nxq+1; emit(jrop, entry(i1),entry(i2),0); emit(j, _,_,0);} 写出每个产生式对应的语义处理过程 真出口,有待回填 假出口,有待回填 (3)E→(E1) {E.tc=E1.tc; E.fc=E1.fc;} (4)E→┐E1 {E.tc=E1.fc; E.fc=E1.tc;} (5)EA→E1 {Backpatch(E1.tc,nxq); EA.fc=E1.fc} (6)E→EAE2 {E.tc=

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档