西北工业大学编译原理课件第五章 语法制导翻译及中间代码生成3.pptVIP

西北工业大学编译原理课件第五章 语法制导翻译及中间代码生成3.ppt

  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文档。上传文档
查看更多
5.4 简单算术表达式和赋值语句的翻译 约定 E中仅含简单变量; 全部变量同类型; 翻译时不做语义检查. 辅助定义 int NewTemp(void)?产生临时变量的函数,每次调用都定义一个新的临时变量。返回值为该变量的编号。 X.PLACE?文法符号X的属性,其值为整型(0表示在符号表中序号,0表示临时变量编号) int GEN(int Op,int Arg1,int Arg2,int Result)?根据所给实参产生一个四元式:(Op,Arg1,Arg2,Result),且送入四元式表中,返回值为该四元式的序号。Arg1或Arg2为零时表示该参数缺省 赋值语句的S-属性翻译文法 1.Statement→AssignSt {} 2.AssignSt→Varable : = Expr {GEN(:=,$4.PLACE, 0 , $1.PLACE);} 3.Expr→Expr ?+? Expr {$$.PLACE=NewTemp(); GEN(+,$1.PLACE,$3.PLACE,$$.PLACE);} 4. | Expr ?*? Expr {$$.PLACE=NewTemp(); GEN(*, $1.PLACE,$3.PLACE,$$.PLACE);} 5. | ?(? Expr ?)? {$$.PLACE=$2.PLACE;} 6. | identifier {$$.PLACE=Entry($1);} 7.Varable→ identifier {$$.PLACE=Entry($1);} 语义属性的表示 前面的语义动作中,Entry()的含义见5.2节。 终结符idetifier具有的属性为该变量的词文(标识符),由词法分析程序的yytext给出。 $$,$1,$2.…的含义同5.1节。 由于每个非终结符的属性不止一个,在C语言中往往用一个结构来描述它的全部属性。比如,Expr和Varable的属性至少有两个,故可定义 struct Attr_Of_Expr_Var{ int PLACE;//用于表示符号表中的序号或临时变量的编号 char Type;//表示该表达式的类型 } 优先关系和结合规则 不难看出,前面所给文法是二义性的,且不能刻画各运算符的优先关系和结合规则。 如果我们能按某种规定(参阅5.10 节),赋予各运算符优先顺序和结合规则,那么就能对它所产生的句子进行有效的语法分析和翻译。 从所给属性文法的语义动作可以看出,Expr代表了一个变量(产生式6)或一个子表达式(产生式5)的运算(四元式)序列,该序列的运算结果存放于一个临时变量中,这个变量的编号将作为Expr的PLACE属性被传递给了Expr。 表达式中的类型匹配问题 在上面的讨论中,我们未考虑表达式运算中的类型冲突问题。 许多语言允许混合运算,不过在运算前应先进行类型转换,使运算对象具有相同的类型。 因此,我们还应定义类型转换算符,以便产生对运算对象进行转换的四元式。例如,若我们仅考虑整型到实型的转换,则可定义运算符itr,相应的四元式(itr,A,0,T)的作用是把整型变量A转换为等值的实型量T。 另外,为阅读上的直观性,在书写语义子程序时,我们用+r,*r表示实型运算符,用+i,*i表示整型运算符。 Expr→Expr+Expr的语义动作 { int T=NewTemp(); if($1.Type==i $3.Type==i) {GEN(+i,$1.PLACE,$3.PLACE,T); $$.Type=i; }else if($1.Type==r $3.Type==r) {GEN(+r,$1.PLACE,$3.PLACE,T); $$.Type=r; } else if($1.Type==i) /* $3.Type==r*/ { int U=NewTemp(); GEN(itr,$1.PLACE,0,U); GEN(+r,U,$3.PLACE,T); $$.Type= r ; }else/*($1.Type==r $3.Type==i) */ { int U=NewTemp(); GEN(itr,$3.PLACE,0,U); GEN(+r,$1.PLACE,U,T); $$.Type=r; } $$.PLACE=T; } 5.5 布尔表达式的翻译 布尔表达式是布尔运算量和逻辑运算符按一定语法规则组成的式子。 逻辑运算符通常有∧、∨、﹃三种(在某些语言中,还有≡(等价)及→(蕴含)等等); 逻辑运算对象可以是逻辑值(True 或 False)、布尔变量、关系表达式以及由括号括起来的布尔表达式。 不论是布尔变量还是布

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档