编译原理-14-回填技术

IR3-回填技术

  1. B 还不知道S.next的指令地址,如何跳转?
  2. 再扫描一遍中间代码,将标号替换成指令(相对) 地址
  3. 可否在生成中间代码的时候就填入指令地址?

子节点挖坑、祖先节点填坑

  1. 目前的方法是通过一边扫描得到包含Label的中间代码,然后我们可以通过再次扫描一遍中间代码来生成每一个Label的指令地址,我们的目标是一次扫描完成了上述的两部分工作。
  2. 比如if (B) S:这时候我们得到的是L: goto B.false,我们替换为指令地址,则为100: goto ___,并且放入B.false中,然后向上传递,直到一个有父节点指导目标位置,然后填充进去即可。

1. 针对布尔表达式的回填技术

M的作用是得到 B 2 B_2 B2这段代码的第一条指令地址。

  1. 综合属性B.truelist 保存需要跳转到B.true 的指令地址

  1. 综合属性B.f alselist 保存需要跳转到B.f alse 的指令地址
  2. 是个数组

100 : i f   E 1   r e l   E 2   g o t o   _ 101 : g o t o   _ \begin{aligned} &100: if\ E_1\ rel\ E_2\ goto\ \_ \\ &101:\qquad goto\ \_ \\ \end{aligned} 100:if E1 rel E2 goto _101:goto _

注意100和101指令对应nextinstr

  1. 回填: b a c k p a t c h backpatch backpatch函数, M . i n s t r M.instr M.instr代表的是M的第一个地址,也就是我们要将 B 1 . t r u e l i s t B_1.truelist B1.truelist中的所有的坑都填为 M . i n s t r M.instr M.instr
  2. n e x t i n s t r nextinstr nextinstr代表的是计数器+1

2. 例子

x < 100 || x > 200 && x != y


3. 具体语句使用填坑技术的生成式

3.1. if/else控制流语句翻译


3.2. while控制流语句翻译

注意N的跳转位置和next属性
nextinstr:是生成的过程中的地址的计数器,表示的是gen(“goto _”)的地址

3.3. 不包含跳转的语句翻译

3.4. switch语句翻译


switch-case先把标签生成好


  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
⒈ 题目 分析对象的BNF定义如下: 〈算术表达式〉∷=〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉 〈项〉∷=〈因式〉|〈项〉*〈因式〉|〈项〉/〈因式〉 〈因式〉∷=〈变量〉│(〈算术表达式〉) 〈变量〉∷=〈字母〉 〈字母〉∷=A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z (a)总程序过程 (b) ( E过程)算术表达式处理 (c)项处理(T过程) (d)因式处理过程)(F过程) (e) (f) 图2-7-5 递归下降法分析表达式之框图 (a) ZC 过程;(b) E 过程;(c) T 过程; (d) F 过程;(e) 函数过程 SYM ;(f) 过程 ADVANCE ⒉ 算法 用递归下降法分析上述算术表达式的框图,如图2-7-5所示。这里,ZC过程为总控程序,主要完成: ⑴ 通知外界键入算术表达式; ⑵ 控制E过程分析算术表达式; ⑶ 根据分析结果之正误,分别通知外界不同的信息。 ZC过程被设计成可以分析无穷多个算术表达式。E、T和F三个过程分别对应〈算术表达式〉、〈项〉和〈因式〉三个产生式的处理。它们用到两个公共过程。一个是函数过程SYM,它负责从输入字符串ST中取出下一个字符,并存入SYM中等待分析。另一个过程ADVANCE负责剔除ST中的首字符。 算法的书写和实现也请参考课堂教学所给出的方法和实例,不一定照搬以上的框图。 ⒋ 小结 ⑴ 实习前的准备 按实习目的和要求,用PASCAL语言编写一个语法分析程序,同时考虑相应的数据结构。 ⑵ 调试 调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若干错例。 ⑶ 输出 对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。 ⑷编写上机实习报告。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值