- 1、本文档共81页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
属性文法 语法制导翻译概论 中间代码的形式 简单赋值语句的翻译 布尔表达式的翻译 四元式 为了直观,有时也把四元式的形式写成简单赋值形式或更易于理解的形式。比如把上述四元式序列写成如下形式: (1)t1:=b*c (2)t2:=b*d (3)t3:=t1+t2 (4)a:=t3 把(jump,-,-,L)写成goto L 把(jrop,B,C,L)写成if B rop C goto L 至于如何用四元式表示各种语句,以及翻译各种语句的语义描述,在后面我们会给出一些讨论。 简单赋值语句的翻译 在编译程序的实际实现中,四元式中的运算对象和结果,或者是一个指针,指向符号表的某一登录项,或者是一个临时变量的整数码。 在对赋值语句翻译为四元式的描述中,将会表明怎样查找这样的符号表登录项。首先对id表示的单词定义一属性id.name,用做语义变量,用Lookup(id.name)表示审查id.name是否出现在符号表中,如在,则返回一指向该登录项的指针,否则返回nil。语义过程emit表示输出四元式到输出文件上。语义过程newtemp表示生成一临时变量,每调用一次生成一个新的临时变量。语义变量E.palce表示存放E值的变量名在符号表的登录项或一整数码(如此变量是一个临时变量)。 例 简单赋值语句的翻译 实际上,在一个表达式中可能出现各种不同类型变量或常数,而不是象上例中的id假定为都是同一类型。即编译程序还应执行类型检查的语义动作,如不能接受不同类型运算对象的混合运算,应指出错误;如能接受混合运算,则应执行类型转换的语义处理。假定上例中的表达式可以有混合运算,id可以是实型或整型,且当两个不同类型的量进行运算时,规定首先将整型量转换为实型量。为进行类型转换的语义处理,增加语义变量,用E.type表示E的类型信息,E.type的值为int或real。此外,为区别整型加/乘和实型加/乘,把+、*分别写成+i(*i)和+r(*r)。用一目运算符itr表示将整型运算对象转换成实型。 例 在上例中,与非终结符号E相联的语义值有E.place,还有E.type。语义值的设计是与语义处理的描述相关的。赋值语句的语义处理,对左部的标识符,检查它的种类(kind),若不是变量名,则指出错误,若是变量名,才生成赋值运算的代码。对右部表达式中作为运算对象的标识符,检查是否变量名或常量名,是则生成相应代码,不是(即是过程名),则指出错误。这一点若用语义规则描述的话,还应增加一语义值,与非终结符相联,比如用E.kind表示。 赋值语句中含有复杂数据类型,如数组元素或记录的引用,这种情况的翻译工作更复杂。 布尔表达式的翻译 程序设计语言中的布尔表达式有两个作用:计算逻辑值和用做改变控制流语句中的条件表达式。为简单,这里只考虑如下文法生成的布尔表达式: E-E and E| E or E| not E|id rop id|true|false 按习惯,布尔算符的优先顺序从高到低为:非、与、或,并且与、或运算服从左结合。 布尔表达式的翻译 通常,计算布尔表达式的值有两种方法,一是如同计算算术表达式一样,一步步计算出各部分的真假值,最后计算出整个表达式的值。例 另一种方法是,采取某种优化措施,只计算部分表达式,例如要计算A or B,若计算出A的值为1,那么B的值就无需再计算了。 上述两种方法对于不包含布尔函数调用的表达式没什么差别。但是,若一个布尔表达式中会有布尔函数调用,并且这种调用引起副作用(如对全局变量的赋值)时,这两种方法未必等价。采用哪种方法取决于程序设计语言的语义,有语言规定,函数过程调用应不影响这个调用处环境的计值,或说函数过程的工作不许产生副作用,在这种规定下,可任选其中一种。 布尔表达式的翻译 若按第一种方法计算布尔表达式,则布尔表达式a or b and not c翻译成的四元式序列如下图。 对于ab这样的关系表达式,可看成等价的条件语句if ab then 1 else 0,它翻译成的四元式序列如下图。 下图给出了按第一种方法计算布尔表达式的值,将布尔表达式翻译成四元式的描述,其中nextstat给出在输出序列中下一四元式序号。emit过程每被调用一次,nextstat增加1。 控制语句中布尔表达式的翻译 这里讨论出现在if-then、if-then-else和while-do等语句中的布尔表达式的翻译。这三种语句的语法为: S-if E then S1 | if E then S1 else S2 | while E do S1 这些语句的代码结构示意分别如下图的(a),(b),(c) 所示,其中使用‘.’和‘
文档评论(0)