编译原理
  • 编译原理
  • 一些简答题
  • 绪论
    • 编译器简介
    • 程序设计语言
    • 静态与动态
    • 参数传递机制
  • 词法分析
    • 词法单元、模式、词素
    • 串和语言
    • 正则表达式
    • 状态转换图
    • 不确定有穷自动机NFA
    • 确定有穷自动机DFA
    • 算法:正则表达式转NFA
    • 自动机到词法分析器
  • 语法分析
    • 语法分析器
    • 上下文无关文法
    • 二义性和左递归
    • 递归下降语法分析
    • 算法:求解FIRST集和FOLLOW集
    • 算法:LL(1)
    • 自底向上语法分析
    • 移入-归约语法分析
    • 算法:LR(0)
    • 算法:SLR(1)
    • 算法:LR(1)
    • 算法:LALR
    • LR分析器和LALR分析器
  • 语法制导
    • 语法制导定义(SDD)
    • 综合属性和继承属性
    • 语法树上的SDD求值
    • 依赖图
    • L属性的SDD
    • 类型
    • SDD的应用
  • 中间代码生成
    • 三地址代码
    • SSA(静态单赋值)
    • 类型和声明
    • 表达式的翻译
    • 类型检查
    • 控制流
    • 回填
  • 运行时刻环境
    • 存储组织
    • 栈式分配
    • 栈中非局部数据的访问
    • 堆管理
    • 垃圾回收
  • 代码生成
    • 代码生成器的设计
    • 目标语言
    • 目标代码中的地址
    • 基本块和流图
    • 基本块的优化
Powered by GitBook
On this page
  • 布尔表达式的控制流翻译
  • 布尔表达式的翻译
  • 布尔值和跳转代码
  1. 中间代码生成

控制流

Previous类型检查Next回填

Last updated 4 months ago

布尔表达式的控制流翻译

生成的代码执行时跳转到两个标号之一:

  • 表达式的值为真时,跳转到B.true

  • 表达式的值为假时,跳转到B.false

B.true和B.false是两个继承属性,根据B所在的上下文指向不同的位置

  • 如果B是if语句条件表达式,分别指向then和else分支;如果,则B.false指向if语句的下一个指令

  • 如果B是while语句的条件表达式,分别指向循环体的开头和循环体的出口处

控制流语句:

S→ if (B)S1S→ if (B)S1 else S2S→ while (B)S1\begin{array}{l} S \rightarrow \text { if }(B) S_{1} \\ S \rightarrow \text { if }(B) S_{1} \text { else } S_{2} \\ S \rightarrow \text { while }(B) S_{1} \end{array}S→ if (B)S1​S→ if (B)S1​ else S2​S→ while (B)S1​​

继承属性:

  • B.true:B为真时的跳转目标

  • B.false:B为假时的跳转目标

  • S.next:S执行完毕时的跳转目标

布尔表达式的翻译

布尔表达式可以用于改变控制流/计算逻辑值

文法:

B→B∥B∣B&&B∣!B∣(B)∣E rel E∣ true |false B \rightarrow B \| B|B \& \& B|!B|(B)| E \text { rel } E \mid \text { true |false }B→B∥B∣B&&B∣!B∣(B)∣E rel E∣ true |false 

语义:和布尔表达式的计算结果一致

短路求值:

  • 通过跳转指令实现控制流,逻辑运算符本身不出现

  • B1||B2中B1为真时,无需计算B2,整个表达式为真,因为,当B1为真时应该跳过B2的代码

  • B1&&B2中B1为假时,无需计算B2,整个表达式为假,因此,当B1为假时应该跳过B2的代码

布尔值和跳转代码

程序中出现布尔表达式也可能是求值:x = a < b

处理方法:建立表达式的语法树,根据表达式的不同角色来处理。

文法:

S→id=B;∣ if (B)S∣ while (B)S∣SSB→B∥B∣B&&B∣!B∣E rel E∣…\begin{array}{l} S \rightarrow \mathrm{id}=B ; \mid \text { if }(B) S \mid \text { while }(B) S \mid S S \\ B \rightarrow B \| B|B \& \& B|!B \mid E \text { rel } E \mid \ldots \end{array}S→id=B;∣ if (B)S∣ while (B)S∣SSB→B∥B∣B&&B∣!B∣E rel E∣…​

根据B的语法树结点所在的位置:

  • S->while(B) S1中的B,生成跳转代码

  • 对于S->id=B,生成计算右值的代码

短路代码的例子
布尔表达式代码的例子
例子