属性规则

  • 语义描述
    • 上下文相关文法:过于复杂
    • 属性文法:上下文无关文法和属性规则的结合
  • 综合属性(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$ 综合属性的动作放在最右边
  • 边扫描边生成属性
    • 条件
      • 存在一个主属性为综合属性
      • 主属性通过产生式体中各非终结符号的主属性连接得到
      • 非终结符号的主属性的连接顺序与它们在产生式体中的顺序相同

边扫描边生成属性