语法制导翻译和中间代码生成概要
* * * * * * * * * * * 直观上看,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:… 8.6.3 for循环语句 除了while do语句外,很多程序设计语言具有下面形式的循环语句: for i∶=E1 step E2 until E3 do S1 为了简单起见,假定E2总是正的。在这种假定下,上述循环句的意义等价于: i∶=E1; goto OVER; AGAIN: i∶=i+E2; OVER: if i≤E3 then begin S1; goto AGAIN end; i∶=E1; OVER: if i≤E3 then begin S1; i∶=i+E2; goto OVER end; 或: 属性文法的定义见书P191 8.6.4 goto语句 多数程序语言中的转移是通过标号和goto语句实现的。带标号语句的形式是L∶S;goto语句的形式是goto L。 当L∶S;语句被处理之后,标号L是定义了的。即在符号表中,将登记L的项的地址栏中登上语句S的第一个四元式的地址。 如果goto L是一个向上转移的语句,那么,当编译程序碰到这个语句时,L必是已定义了的。通过对L查找符号表获得它的定义地址p,编译程序可立即产生出相应于这个goto L的四元式如(j,-,-,p)。 如果goto L是一个向下转移的语句,也就是说,标号L尚未定义,那么,若L是第一次出现,则把它填进符号表中并标志上未定义。由于L尚未定义,对goto L只能产生一个不完全的四元式(goto ,-,-,- ),它的转移目标须待L定义时再回填进去。 在这种情况下,必须把所有那些以L为转移目标的四元式的地址全都记录下来,以便一旦L定义时就可对这些四元式进行回填。 我们将采用如图8.28所示的拉链办法,把所有以L为转移目标的四元式串在一起。链的首地址放在符号表中L的地址栏中。 建链的方法是:若goto L中的标号L尚未在符号表中出现,则把L填入表中,置L的定义否标志为未,把nextstat填进L的地址栏中作为新链首,然后,产生四元式(goto 0),其中0为链尾标志。若L已在符号表中出现(但定义否标志为未),则把它的地址栏中的编号(记为q)取出,把nextstat填进该栏作新链首,然后,产生四元式(goto q)。 图8.31 未定义标号的引用链 名字 类型 … 定义否 地址 L 标号 … 未 r · · · (r)(goto q) (q)(goto p) … (p)(goto 0) … … 符号表 四元式 一旦标号L定义时,我们将根据这条链回填那些待填转移目标的四元式。 一般而言,假定用下面的产生式来定义标号语句: S→label S label→i: 那么,当用label→i:进行归约时,应做如下的语义动作: 若i所指的标识符(假定为L)不在符号表中,则把它填入,置类型为标号,定义否为已,地址为nextstat。 若L已在符号表中但类型不为标号或定义否为已,则报告出错。 若L已在符号表中,则把标志未改为已,然后,把地址栏中的链首(记为q)取出,同时把nextstat填在其中,最后,执行回填。 翻译goto语句时,还有两点必须注意, 第二:可能有些转移标号是非法的,如下例: (1) for i∶=1 to 10 do (2) begin goto L; (3) for j∶=1 to
您可能关注的文档
最近下载
- ISO9001 质量管理体系全套(质量手册+程序文件+表格记录全套).doc VIP
- 深度解析(2026)SYT 5794-2010《钻井液用沥青类评价方法》:从标准解读到未来油田化学智能化应用的战略前瞻.pptx VIP
- 2025-2030中国化学镀镍行业市场发展趋势与前景展望战略研究报告.docx
- 深度解析(2026)《SYT 7377-2017钻井液设计规范》.pptx VIP
- 《船体振动学》教学课件.pdf
- 操作系统Windows操作系统模型.pptx VIP
- 2025年山东省选调公务员考试真题汇编附答案解析(夺冠).docx VIP
- Windows操作系统翻译词汇.pdf
- 基于灰色关联理论的广西农产品供应链影响因素分析.docx
- 关于绑架的小故事-绑架关起来的故事.docx VIP
原创力文档

文档评论(0)