声明:本系列文章,是根据中国大学MOOC网 哈工大的编译原理 这门课学习而成的学习笔记。

一、类型表达式 (Type Expressions)

类型表达式

  1. 基本类型是类型表达式
  • integer
  • real
  • char
  • boolean
  • type_error (出错类型)
  • void (无类型)
  1. 可以为类型表达式命名,类型名也是类型表达式
  2. 将类型构造符(type constructor)作用于类型表达式可以构成新的类
    型表达式
  • 数组构造符array
    若T是类型表达式,则array ( I, T )是类型表达式( I是一个整数)
    编译原理(6):中间代码生成

  • 指针构造符pointer
    若T 是类型表达式,则 pointer ( T ) 是类型表达式,它表示一个指针类型。

  • 笛卡尔乘积构造符
    若T1 和T2是类型表达式,则笛卡尔乘积T1×T2 是类型表达式

  • 函数构造符→
    若T1、T2、…、Tn和R是类型表达式,则T1×T2 ×…×Tn→ R是 类型表达式

  • 记录构造符record
    若有标识符N1、N2、…、Nn 与类型表达式T1、T2、…、Tn , 则 record ( ( N1× T1 )×( N2×T2 )×…× ( Nn×Tn )) 是一个类型表达式
    编译原理(6):中间代码生成

二、声明语句的翻译

局部变量的存储分配

对于声明语句,语义分析的主要任务就是收集标识符的类型等属性信息,并为每一个名字分配一个相对地址

  • 从类型表达式可以知道该类型在运行时刻所需的存储单元数量称为类型的宽度(width)
  • 在编译时刻,可以使用类型的宽度为每一个名字分配一个相对地址

名字的类型相对地址信息保存在相应的符号表记录中

变量声明语句的SDT

编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成

三、简单赋值语句的翻译

赋值语句翻译的任务

编译原理(6):中间代码生成

赋值语句的SDT

编译原理(6):中间代码生成

增量翻译

编译原理(6):中间代码生成

编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成

四、数组引用的翻译

数组引用的翻译

编译原理(6):中间代码生成

数组元素寻址 (Addressing Array Elements )

编译原理(6):中间代码生成

编译原理(6):中间代码生成

带有数组引用的赋值语句的翻译

编译原理(6):中间代码生成
编译原理(6):中间代码生成

数组引用的SDT

编译原理(6):中间代码生成

编译原理(6):中间代码生成

五、控制流语句及其SDT

控制流语句的基本文法

编译原理(6):中间代码生成

控制流语句的代码结构

编译原理(6):中间代码生成

控制流语句的SDT

编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成

六、布尔表达式及其SDT

布尔表达式的基本文法

编译原理(6):中间代码生成

  • 在跳转代码中,逻辑运算符&&、|| 和 ! 被翻译成跳转指令。运算符本身不出现在代码中,布尔表达式的值是通过代码序列中的位置来表示的

编译原理(6):中间代码生成

布尔表达式的SDT

编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成

七、控制流翻译的例子

控制流语句的SDT

编译原理(6):中间代码生成

SDT的通用实现方法

  • 任何SDT都可以通过下面的方法实现
    首先建立一棵语法分析树,然后按照从左到右的深度优先顺序来执行这些动作

编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成

七、布尔表达式的回填

回填 (Backpatching)

编译原理(6):中间代码生成

非终结符B的综合属性

编译原理(6):中间代码生成

函数

编译原理(6):中间代码生成

布尔表达式的回填

编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成

编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成

编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成

八、控制流语句的回填

控制流语句的回填

编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成

编译原理(6):中间代码生成
编译原理(6):中间代码生成

九、switch语句的翻译

switch语句的翻译

编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成
编译原理(6):中间代码生成

增加一种case指令

编译原理(6):中间代码生成

十、过程调用语句的翻译

过程调用语句的翻译

编译原理(6):中间代码生成

过程调用语句的代码结构

编译原理(6):中间代码生成
编译原理(6):中间代码生成

过程调用语句的SDD

编译原理(6):中间代码生成

编译原理(6):中间代码生成

相关文章: