news 2026/3/28 22:36:52

布尔表达式的文法与代码结构在编译原理中属于**中间代码生成**阶段的重要内容

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
布尔表达式的文法与代码结构在编译原理中属于**中间代码生成**阶段的重要内容

布尔表达式的文法与代码结构在编译原理中属于中间代码生成阶段的重要内容,主要用于将高级语言中的逻辑判断(如ifwhile中的条件)转换为带有控制流信息的中间表示(如四元式),并利用“短路求值”机制优化执行效率。


一、布尔表达式的上下文无关文法(CFG)

常见的布尔表达式文法可定义如下(经过左递归消除以适用于自顶向下分析):

E → E1 or T { E.tc = Merge(E1.tc, T.tc); E.fc = T.fc; } | T { E.tc = T.tc; E.fc = T.fc; } T → T1 and F { T.tc = F.tc; T.fc = Merge(T1.fc, F.fc); } | F { T.tc = F.tc; T.fc = F.fc; } F → not F1 { F.tc = F1.fc; F.fc = F1.tc; } | ( E ) { F.tc = E.tc; F.fc = E.fc; } | rel { F.tc = NewLabel(); F.fc = NewLabel(); Gen('if', rel.op, 'goto', F.tc); Gen('goto', '', '', F.fc); }

其中:

  • rel表示关系表达式(如a < b
  • tc:真出口(true chain),当表达式为真时跳转的目标标签链
  • fc:假出口(false chain),当表达式为假时跳转的目标标签链
  • NewLabel():生成新的标签
  • Gen(op, arg1, arg2, result):生成一条四元式
  • Merge(c1, c2):合并两个出口链,返回合并后的链头
  • Backpatch(chain, label):将链中所有待填地址回填为label

二、关键概念解析

1.短路计算(Short-Circuit Evaluation)
  • A and B:若 A 为假,则不计算 B
  • A or B:若 A 为真,则不计算 B
  • 编译时通过控制流跳转实现,无需实际求值
2.真出口(tc)与假出口(fc)

每个非终结符(如 E、T、F)携带两个属性:

  • tc:指向“应跳往真分支”的标签链(即该子表达式为真时需跳转的位置)
  • fc:指向“应跳往假分支”的标签链

这些不是立即确定的地址,而是待回填的跳转链表(拉链法)

3.拉链与回填技术
  • 拉链(Chaining):将尚未确定目标地址的跳转指令组织成链(通过链接字段指向下一条待填指令编号)
  • 回填(Backpatch):当目标地址确定后,遍历链中所有指令并填写正确地址

例如:

defBackpatch(chain,label):whilechain:instruction[chain.index].target=label chain=chain.next

三、翻译示例:E → E¹ and E²

语义动作:

E.tc=.tc E.fc=Merge(.fc,.fc)Backpatch(.tc,.begin_label)# 若E¹为真,继续计算E²

说明:

  • 只有当为真时才需要评估
  • 所以要把的真出口(tc)回填到的起始位置
  • E整体为真的出口是为真的出口
  • E整体为假的出口是为假的出口合并而成

四、常见语句的翻译

1.if (B) S1
  • B.true_chain回填到S1起始
  • B.false_chain是整个if结束后的出口
  • 无 else 时,直接回填B.fcnext_instruction
2.if (B) S1 else S2
  • B.tcS1.begin
  • B.fcS2.begin
  • S1.chainS2.chain合并为后续语句入口
3.while (B) S
  • 生成循环开始标签L1
  • Btc指向S.begin
  • Bfc指向循环结束L2
  • S.chain回填到L1实现循环
  • 使用Gen('goto', '', '', L1)S后跳回

五、四元式示例(基于GEN函数)

假设表达式:(a < b) or (c > d)

生成的四元式可能如下:

100: if a < b goto 102 101: goto 103 102: goto 105 ; // 真出口直接跳过整个or的假分支 103: if c > d goto 105 104: goto 106 105: ... ; // 真出口汇聚点 106: ... ; // 假出口

注意:实际中使用链式管理,避免立即指定具体标号。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 1:18:49

内容创作者在生成式AI搜索时代的生存与繁荣策略

引言&#xff1a;内容价值的重新定义当生成式AI能够瞬间综合全网信息生成看似完美的答案时&#xff0c;许多内容创作者面临生存危机&#xff1a;如果用户不再访问原始来源&#xff0c;创作者如何获得认可和回报&#xff1f;然而&#xff0c;危机中蕴含转机——AI无法替代人类的…

作者头像 李华
网站建设 2026/3/27 10:20:43

嵌入式知识篇---74LS192

1. 一句话概括它是什么74LS192 是一个“可逆、可预置的十进制同步计数器”。 听起来很复杂&#xff1f;别怕&#xff0c;我们拆开看&#xff1a;计数器&#xff1a;它会自动数数&#xff08;0,1,2,3...&#xff09;。十进制&#xff1a;它从0数到9&#xff0c;然后归零&#xf…

作者头像 李华
网站建设 2026/3/27 11:53:27

Java开发裸辞狂刷两个月面试题,终于拿到某独角兽offer,分享还愿!

前言 今天给大家分享下我整理的Java架构面试专题及答案&#xff0c;其中大部分都是大企业面试常问的面试题&#xff0c;可以对照这查漏补缺&#xff0c;当然了&#xff0c;这里所列的肯定不可能覆盖全部方式。 很多Java开发者面试之前&#xff0c;可能没有较长的工作时间或者…

作者头像 李华
网站建设 2026/3/28 2:01:28

12款常见降ai率工具大汇总(含免费降ai率版)

“论文降ai”是2025年毕业生面临的新挑战。它指的是一个过程&#xff1a;我们使用专门的降ai工具&#xff0c;去修改另一篇由AI&#xff08;如GPT、Kimi&#xff09;生成的文本&#xff0c;目的是为了“消除AI痕迹”&#xff0c;让文章看起来更像人类原创。 这个过程通常利用深…

作者头像 李华
网站建设 2026/3/28 8:32:41

2款常见降ai率工具大汇总(含免费降ai率版,还有免费ai查重!)

“论文降ai”是2025年毕业生面临的新挑战。它指的是一个过程&#xff1a;我们使用专门的降ai工具&#xff0c;去修改另一篇由AI&#xff08;如GPT、Kimi&#xff09;生成的文本&#xff0c;目的是为了“消除AI痕迹”&#xff0c;让文章看起来更像人类原创。 这个过程通常利用深…

作者头像 李华
网站建设 2026/3/27 18:26:49

12款常见降ai率工具大汇总(含免费降ai率版,5个有效方法推荐)

“论文降ai”是2025年毕业生面临的新挑战。它指的是一个过程&#xff1a;我们使用专门的降ai工具&#xff0c;去修改另一篇由AI&#xff08;如GPT、Kimi&#xff09;生成的文本&#xff0c;目的是为了“消除AI痕迹”&#xff0c;让文章看起来更像人类原创。 这个过程通常利用深…

作者头像 李华