本章需要解决的问题:
-
如何存储语义信息,
-
以什么样的顺序计算语义信息,
-
如何在语法分析的过程中同步地实施语义计算。(比较理想)
主要知识点:
- 综合属性、继承属性、标记语法树(设计语法树)
- S属性文法、L属性文法,及其对于计算顺序的意义
- Translation scheme
- 综合属性的语义节点在translation scheme中的位置
- 继承属性在translation scheme中的位置
- L属性的translation scheme
引言
语法制导翻译(Syntax-Directed Translation, SDT)是编译原理中的一种技术,用于将源语言的语法结构与语义信息结合起来,以实现从源语言到目标语言或中间表示的转换。它通过在上下文无关文法(CFG)的基础上,为文法的每个产生式关联一组语义规则或动作,来指导翻译过程。
零.语义规则-semantic rules
0.1注释解析树
数字标号表示依赖图中的节点,箭头表示值传递。
一.语法制导定义-Syntax-Directed Definiti SDD
语法制导定义
语法制导定义是一种扩展的上下文无关文法,其中每个文法符号和产生式都带有属性和语义规则。
1.1.属性:
表示语义信息,可以分为以下两类:
1. 综合属性(Synthesized Attributes):
通过子节点计算得到,向上传递信息。
2. 继承属性(Inherited Attributes):
通过父节点或兄弟节点传递,向下或横向传播信息。
1.2. 几个关于Synthesized 和 inherited 属性的值得思考的问题:
1. 终结符没有继承属性,没必要
-
原因: 终结符是语法分析树的叶子节点,它们的值(如词法单元的类型、字面值)是由词法分析器直接提供的。既然这些值已经明确,没有从父节点或兄弟节点传递额外信息的需求,就不需要继承属性。
-
例子: 对于一个整数
int = 5
,终结符int
的值由词法分析器提供,如int.val = 5
,这是一个综合属性,而不是继承属性。
2. 终结符可以有综合属性
-
综合属性是从叶子节点或子节点向上传递的属性,终结符的值(如其字面量或标识符的名字)正是其综合属性的表现。
-
例子: 终结符
int
的综合属性可以是val
:T → int { T.val = int.lexval; }
这里
int.lexval
是由词法分析器提供的值,而T.val
是综合属性,向上传递。
3. 非终结符的综合属性可以由自己的继承属性定义
-
含义: 对于非终结符,一个综合属性可以使用同一节点的继承属性作为其定义的依据。这种设计是合理的,因为语义规则允许不同属性之间的关系是同一个节点内的。
-
例子:
S → A { S.val = A.inherit; }
假设
A.inherit
是通过父节点S
传递下来的继承属性,而S.val
是一个综合属性,这种属性关系不会形成问题。
4. 如果综合属性反过来定义继承属性,就可能形成循环依赖
-
问题: 如果一个节点的综合属性和继承属性互相依赖,可能导致循环依赖问题,编译器在计算这些属性时无法收敛。
-
循环依赖的例子:
A.inherit = A.synthesized + 1;
A.synthesized = A.inherit * 2;
A.inherit
依赖于A.synthesized
。A.synthesized
又依赖于A.inherit
。 这样会形成无解的循环。
-
在这种情况下:
-
避免办法: 通常规定属性值的计算要有明确的依赖方向:继承属性从父节点传递下来,综合属性从子节点计算而来,不能形成自引用。
5. 总结
- 终结符:不需要继承属性,因为词法分析器直接提供值,但可以有综合属性(如词法单元的值)。
- 非终结符:
- 综合属性可以依赖于自己的继承属性。
- 不能让综合属性和继承属性之间形成循环依赖,否则会导致翻译过程中的矛盾。
- 语义规则:定义如何通过属性计算目标代码或中间表示。
二. SDD求值顺序-Evaluation Orders for SDD's
2.0.依赖图
2.1. S-attributed Definition
A syntax-directed definition that uses synthesized attributes exclusively.(只使用综合属性)
这个语言的所有semantic rules只使用synthesized attributes (综合属性)
S属性-核心特征
-
只使用综合属性:
- S属性从子节点传递到父节点,值由子节点的属性值计算得出。
- 没有继承属性,因此属性计算完全依赖于子节点的信息。
-
适合自底向上的属性计算:
- 属性值可以按照语法树的自底向上顺序计算(即从叶子节点到根节点)。
-
与LR分析器结合:
- LR分析器规约某个产生式时,可以即时计算综合属性,无需存储额外的上下文信息。
-
基于语法树的后序遍历:
- 属性值的计算可以通过语法树的后序遍历实现。
- 在后序遍历中,先处理子节点,再计算当前节点的属性。
2.2.L-attributed Definition
在编译原理中,L-attributed Definition(L属性定义)是一种特殊的语法制导定义。它允许使用继承属性(Inherited Attributes)和综合属性(Synthesized Attributes),但对继承属性的使用施加了严格限制,以确保属性可以按照从左到右的顺序计算。
L属性-核心概念
-
信息来源:
- 继承属性(Inherited Attributes):只能从父节点或左侧兄弟节点获取信息。
- 综合属性(Synthesized Attributes):从子节点向父节点传递,与 S属性相同。
- 规则总结为一句话:不依赖右侧兄弟节点的属性。
-
L 的含义:
- “L” 表示 “Left”(左),强调属性计算时只允许从父节点或左侧兄弟节点获取必要的信息。
- 这种限制避免了信息从右向左传播,确保属性计算顺序明确。
-
无循环依赖:
- 如果某个属性规则涉及到节点本身的属性,必须避免循环依赖(Dependency Graph 中无环)。
三.语法制导翻译应用
3.1.抽象语法树构造
3.2.类型构造
四.语法制导翻译方案框架(SDT)
SDT scheme写法-————继承在左,综合在尾
4.1后缀翻译方案--S属性
所有动作(semantic rules)都在最右端,换句话说(没有继承属性)