核心逻辑是基于上下文无关文法的产生式规则,在语法分析过程中结合语义动作动态生成四元式

核心逻辑是基于上下文无关文法的产生式规则,在语法分析过程中结合语义动作动态生成四元式,并利用回填技术处理控制流语句中的未定跳转地址。具体实现如下:

  1. 四元式的结构:每个四元式形如 (op, arg1, arg2, result),其中:

    • op 是操作符(如 +, <, j<, j, := 等);
    • arg1, arg2 是两个源操作数;
    • result 可以是目标变量或跳转目标标号。
  2. 从产生式到四元式的映射示例

    • 对于 E → a < b,语义动作为:

      E.code = [
          ('<', 'a', 'b', 't1'),        # t1 = (a < b)
          ('jnz', 't1', '', L1)         # if t1 != 0 goto L1
      ]
      E.truelist = [当前四元式编号 + 1]  # 下一条可能跳转的位置
      E.falselist = [当前四元式编号 + 2]  # 否则跳转到这里?
      

      实际中常使用布尔短路与三地址码结合的方式,更常见的是直接生成条件跳转指令。

    • 更典型的处理方式是将比较表达式用于控制流,例如在 if E then S 中:

      • 先生成 E 的代码,得到真链(truelist)和假链(falselist);
      • S 的起始地址回填到 E.truelist 指向的待填跳转位置;
      • 构造出口并处理后续跳转。
  3. 回填机制(Backpatching)

    • 在遇到 whileif 时,某些跳转目标尚未确定,因此先留空,记录这些待填位置的列表(如 quad_list)。
    • 当目标地址已知后,调用 backpatch(list, target) 函数,将列表中所有待填四元式的跳转字段设为 target
  4. 典型控制结构的四元式生成流程

    • If-Then 语句

      if E then S
      

      步骤:

      1. 生成 E 的代码,得到 E.trueE.false 链表;
      2. backpatch(E.true, nextquad()):让真分支跳转到 S 的开始;
      3. 生成 S 的代码;
      4. 最终连接出口。
    • While 循环

      while E do S
      

      步骤:

      1. 记录循环开始位置 L_begin = nextquad()
      2. 生成 E 的代码;
      3. backpatch(E.true, S_start) 进入循环体;
      4. 生成 S 的代码;
      5. 添加无条件跳转回 L_begin
      6. backpatch(E.false, nextquad()) 处理退出路径。
  5. 最终四元式序列示例(简化版):

    (1)  (<, a, b, t1)
    (2)  (jz, t1, _, 4)      // 若 a<b 不成立,则跳转到 4
    (3)  (j, _, _, 6)        // 成立则跳转到 then 分支
    (4)  ...                 // else 或后续代码
    

这种机制使得编译器可以在不预先知道目标地址的情况下构造控制流结构,通过延迟绑定地址实现灵活的中间代码生成。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值