声明:本系列文章,是根据中国大学MOOC网 哈工大的编译原理 这门课学习而成的学习笔记。
一、类型表达式 (Type Expressions)
类型表达式
- 基本类型是类型表达式
- integer
- real
- char
- boolean
- type_error (出错类型)
- void (无类型)
- 可以为类型表达式命名,类型名也是类型表达式
- 将类型构造符(type constructor)作用于类型表达式可以构成新的类
型表达式
数组构造符array
若T是类型表达式,则array ( I, T )是类型表达式( I是一个整数)
指针构造符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 )) 是一个类型表达式
二、声明语句的翻译
局部变量的存储分配
对于声明语句,语义分析的主要任务就是收集标识符的类型等属性信息,并为每一个名字分配一个相对地址
- 从类型表达式可以知道该类型在运行时刻所需的存储单元数量称为类型的宽度(width)
- 在编译时刻,可以使用类型的宽度为每一个名字分配一个相对地址
名字的类型和相对地址信息保存在相应的符号表记录中
变量声明语句的SDT
三、简单赋值语句的翻译
赋值语句翻译的任务
赋值语句的SDT
增量翻译
四、数组引用的翻译
数组引用的翻译
数组元素寻址 (Addressing Array Elements )
带有数组引用的赋值语句的翻译
数组引用的SDT
五、控制流语句及其SDT
控制流语句的基本文法
控制流语句的代码结构
控制流语句的SDT
六、布尔表达式及其SDT
布尔表达式的基本文法
- 在跳转代码中,逻辑运算符&&、|| 和 ! 被翻译成跳转指令。运算符本身不出现在代码中,布尔表达式的值是通过代码序列中的位置来表示的
布尔表达式的SDT
七、控制流翻译的例子
控制流语句的SDT
SDT的通用实现方法
- 任何SDT都可以通过下面的方法实现
首先建立一棵语法分析树,然后按照从左到右的深度优先顺序来执行这些动作
七、布尔表达式的回填
回填 (Backpatching)
非终结符B的综合属性
函数
布尔表达式的回填
八、控制流语句的回填
控制流语句的回填
九、switch语句的翻译
switch语句的翻译
增加一种case指令
十、过程调用语句的翻译
过程调用语句的翻译
过程调用语句的代码结构