第四章 语法制导的翻译
语义规则和产生式相联系的两种方式:语法制导的定义和语法执导的翻译方案(简称翻译方案)。语法制导定义是比较抽象的翻译规范,它隐蔽了一些实现细节;而翻译方案多陈述了一些实现细节,主要是指明各语义规则的计算时机。
4.1 语法制导的定义
4.1.1 语法制导定义的形式
- 基础文法
- 每个文法符号有一组属性
- 每个文法产生式A→α有一组形式为b := f(c1, c2, …, ck )的语义规则,其中f 是函数,b和c1, c2, …, ck 是该产生式文法符号的属性
- 构造输入的分析树,构造属性依赖图,对结点进行拓扑排序,按拓扑排序的次序计算属性
- 语义规则的计算方法
- 语法树是分析树的浓缩表示:算符和关键字是作为内部结点
- 语法制导翻译可以基于分析树,也可以基于语法树
4.2.2 构造语法树的语法制导定义
4.2.3 S属性的自下而上计算
4.3 L属性定义的自上而下计算
边分析边翻译的方式能否用于继承属性? - 属性的计算次序一定受分析方法所限定的分析树结点建立次序的限制
- 分析树的结点是自左向右生成
- 如果属性信息是自左向右流动,那么就有可能在分析的同时完成属性计算
4.3.1 L属性定义
- 如果每个产生式A →X1 X2 … Xn 的每条语义规则计算的属性是A的综合属性;或者是Xj 的继承属性,1 ≤ j ≤ n, 但它仅依赖:
- 该产生式中Xj左边符号X1 X2 … Xn 的属性;
- A的继承属性
- S属性定义属于L属性定义
- 变量类型声明的语法制导定义是一个L属性定义
4.3.2 翻译方案
4.3.3 预测翻译器的设计
把预测分析器的构造方法推广到翻译方案的实现4.3.4 用综合属性代替继承属性
4.4 L属性的自下而上计算
在自下而上分析的框架中实现L属性定义的方法 - 它能实现任何基于LL(1)文法的L属性定义
- 也能实现许多(但不是所有的)基于LR(1) 的L属性定义
4.4.1 删除翻译方案中嵌入的动作
4.4.2 分析栈上的继承属性
4.4.3 模拟继承属性的计算
4.5 递 归 计 算
语法制导定义的实现 - 分析树方法
- 边分析边进行属性计算,只能完成L属性计算(忽略规则的方法)
- 先分析后计算的方法,不局限于L属性计算(基于规则的方法)