属性规则
- 语义描述
- 上下文相关文法:过于复杂
- 属性文法:上下文无关文法和属性规则的结合
- 综合属性(SA):通过 $N$ 的子结点或 $N$ 本身的属性值定义
- 继承属性(IA):依赖于父节点,本身和兄弟结点的属性值
- 语义规则的副作用:影响其它属性的求值
SDD
- 语法制导定义(SDD):将文法符号和某些属性关联,通过语义规则来描述如何计算属性值
- 属性文法:没有副作用的 SDD
- 适用于自顶向下分析的 SDD
- S 属性的 SDD:可以在语法分析过程中一起计算
- L 属性的 SDD
- L 属性:只拥有
- 综合属性
- 或继承属性,且 $A\rightarrow X_1X_2\cdots X_n$ 中计算 $X_i.a$ 的规则只用
- $A$ 的继承属性
- 或 $X_i$ 左边的文法符号 $X_j$ 的继承属性或综合属性
- 注释分析树
- 依赖图:描述某棵特定的分析树上各个属性之间的信息流
- 具有受控副作用的语义规则
抽象语法树
- 每个结点代表一个语法结构,对应于运算符
- 结点的每个子节点代表其子结构,对应于运算分量
- 表示这些子结构按照特定的方式组成了较大的结构
SDT
- 语义动作:程序片段
- 语法制导翻译(SDT):在产生式体加入语义动作的上下文无关文法
- 建立语法分析树
- 将语义动作看做为虚拟结点
- 从左到右深度优先遍历,在访问虚拟结点是执行相应语义动作
- 用 SDT 实现 SDD,在分析过程中可以实现的有
- 基本文法为 LR, SDD 为 S 属性
- 基本文法为 LL, SDD 为 L 属性
- 后缀 SDT:所有动作都在产生式最右端
- 文法可以 LR 分析, SDD 为 S 属性的
- 语法分析栈的实现
- L 属性对应的 SDT
- 消除左递归时 SDT 的转换
- 如果动作不涉及属性值,将动作当做终结符号处理
- 否则,将语义动作放到相应产生式的适当位置 $(A\rightarrow X_1X_2\cdots X_n)$:
计算 $X_i$ 的继承属性的动作插入到产生式体中 $X_i$ 的左边
计算产生头 $A$ 综合属性的动作放在最右边
- 边扫描边生成属性
- 条件
- 存在一个主属性为综合属性
- 主属性通过产生式体中各非终结符号的主属性连接得到
- 非终结符号的主属性的连接顺序与它们在产生式体中的顺序相同