- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
宇传华 第8章 语法制导翻译和中间代码生成 8.1 属性文法 8.2 语法制导翻译概论 直观上,case语句所翻译成如下的一连串条件转移语句。 t:=E; L1: if t≠V1 goto L2; S1; Goto next; L2 : if t≠V2 goto L3; S2; Goto next; … Ln-1: if t≠Vn-1 goto Ln; Sn-1; Goto next; Ln: Sn; Next; 也可以按照另外一种方式: switch E of case V1:S1 case V2:S2 … case Vn-1:Sn-1 default:Sn end 翻译为图8.15中的中间代码的过程大致如下: (1)当看见关键字switch时,产生新的标号test、next和一个临时变量t。 (2)在分析产生式E时,产生计算E值的代码,并把E的结果放到临时变量t中. (3)见到E后的of则产生四元式 goto test。 (4)每当看见关键字case时,则产生一个标号Li,填进符号表中,把它在符号表中的位置(不妨假定为Pi)连同case语句后的Vi值,即(Vi,Pi)对存放于某一存储区(用QUEUE)中;接着,按通常方式产生相应的语句Si 的代码,紧跟在Si之后是 goto next 代码。 (5)当看见关键字end之后,则能够产生形成n个分支的(对t的测试)代码了。 一般在翻译开关语句的分支的代码时,常常将 (if t=Vi goto Li)写成行如(case,Vi,Li,-)四元式形式。而将四元式(label,next,-,-)加在该四元式序列最后,即形成如下序列: (case,Vi,Li,-) (case,V2,L2,-) … (case,Vn-1,Ln-1,-) (case,Vn,Ln,-) (label,next,-,-) 用case做为四元式操作码的目的在于提示目标代码生成程序对它进行特别处理(优化)。 提请注意的是,当某个Si本身又是开关语句时,即开关语句嵌套情况下,存放不同层次case后的(Vi,Pi)对需要不同层次的队或栈 。 8.6.3 for循环语句 除了while-do语句外,很多程序设计语言具有下面形式的循环语句: for i:=E1 step E2 until E3 do S1 我们按ALGOL的意义来翻译这种循环句。为了简单起见,假定E2总是正的。在这种假定下,上述循环句的ALGOL意义等价于: i:= E1; goto OVER; AGAIN: i:=i+ E2; OVER: if i≤E3 then begin S1; goto AGAIN end; 注意,在这段程序中有几处用到循环控制变量i,因此,ENTRY(i)必须被保存下来。为了按上述顺序产生四元式,必须改写文法。为此,我们使用如下的产生式: F1→for i:= E1 F2→F1 step E2 F3→F2 until E3 S→F3 do S1 下面是这些产生式相应的语义动作: 例如,循环语句 for I:=1 step 1 until N do M:=M+1 将被翻译成如下的四元式序列: 100 I:=1 101 goto 103 102 I:=I+1 103 if I≤N goto 105 104 goto 108 105 T:=M+1 106 M:=T 107 goto 102 108 有些语言中,for语句的语法和语义的一些细节与上述不同,在翻译时要予以考虑。比如Ada语言中,当一个for循环打开时,必须为循环参数生成一个新的作用域和数据对象。编译程序必须考虑何时生成循环参数,何时它使用。而Pascal这样的语言中,循环变量在循环外也是可见的,显然编译的处理不同。又比如,有的语义规定,循环步长和循环终值不得在循环体中改变,这样的for语句必须解释为: i:= E1; incr:= E2; incr:=E3; goto OVER; AGAIN: i:=i+ incr; OVER: if i≤limit then begin S; goto AGAIN end; 其中,incr和limit时编译程序为翻译该循环语句引进的两个变量。这种解释下,每循环一次,E2和E3都不重新计值。如下面的for语句将重复10次执行A:=3。 A:=10; For i:=1 step 1 unti A do A:=3 8.6.4 出口语句 本节所讨论的出口语句是指exit(如Ada语言中的)或break(如C语言),是一种结构化的方式跳出循环而设置的语句,它们的作用是引起外层循环
原创力文档


文档评论(0)