编译原理
  • 编译原理
  • 一些简答题
  • 绪论
    • 编译器简介
    • 程序设计语言
    • 静态与动态
    • 参数传递机制
  • 词法分析
    • 词法单元、模式、词素
    • 串和语言
    • 正则表达式
    • 状态转换图
    • 不确定有穷自动机NFA
    • 确定有穷自动机DFA
    • 算法:正则表达式转NFA
    • 自动机到词法分析器
  • 语法分析
    • 语法分析器
    • 上下文无关文法
    • 二义性和左递归
    • 递归下降语法分析
    • 算法:求解FIRST集和FOLLOW集
    • 算法:LL(1)
    • 自底向上语法分析
    • 移入-归约语法分析
    • 算法:LR(0)
    • 算法:SLR(1)
    • 算法:LR(1)
    • 算法:LALR
    • LR分析器和LALR分析器
  • 语法制导
    • 语法制导定义(SDD)
    • 综合属性和继承属性
    • 语法树上的SDD求值
    • 依赖图
    • L属性的SDD
    • 类型
    • SDD的应用
  • 中间代码生成
    • 三地址代码
    • SSA(静态单赋值)
    • 类型和声明
    • 表达式的翻译
    • 类型检查
    • 控制流
    • 回填
  • 运行时刻环境
    • 存储组织
    • 栈式分配
    • 栈中非局部数据的访问
    • 堆管理
    • 垃圾回收
  • 代码生成
    • 代码生成器的设计
    • 目标语言
    • 目标代码中的地址
    • 基本块和流图
    • 基本块的优化
Powered by GitBook
On this page
  • S属性的SDD的局限
  • L属性的SDD
  • L属性SDD和自顶向下语法分析
  1. 语法制导

L属性的SDD

Previous依赖图Next类型

Last updated 4 months ago

S属性的SDD每个属性都是综合属性,都是根据子构造的属性计算出父构造的属性。在依赖图中,总是通过子节点的属性值来计算父节点的属性值,可以与自底向上或自顶向下的语法分析过程一起计算。

  • 自底向上:在构造分析树结点的同时计算相关的属性(此时子节点的属性必然已经计算完毕)

  • 自顶向下:在递归子程序法中,在过程A()的最后计算A的属性,此时A调用的其他过程(对应于其子结构)已经计算完毕。

在分析树上计算SDD,按照后序遍历的顺序计算属性值即可。在LR分析过程中,实际上不需要构造分析树结点。

S属性的SDD的局限

S属性的SDD中每个属性都是综合属性,便于计算。但是无法计算同时需要继承和综合属性的语义信息。

L属性的SDD

每个属性是综合属性或继承属性,且

 且 A→X1X2…Xn 中计算 Xi⋅a 的规则只用A的继承属性,或Xi左边的文法符号Xj的继承属性或综合属性(j<i)\text { 且 } A \rightarrow X_{1} X_{2} \ldots X_{n} \text { 中计算 } X_{i} \cdot a \text { 的规则只用}A的继承属性,或\\X_i左边的文法符号X_j的继承属性或综合属性(j<i) 且 A→X1​X2​…Xn​ 中计算 Xi​⋅a 的规则只用A的继承属性,或Xi​左边的文法符号Xj​的继承属性或综合属性(j<i)

特点:依赖图中的边,综合属性是从下到上,继承属性是从上到下或从左到右。计算一个属性值时,它所依赖的属性值已计算完毕。

L属性SDD和自顶向下语法分析

  • 在递归程序法中实现L属性:对于每个非终结符号A,调用其对应过程前计算继承属性,从过程返回前计算综合属性。

L属性SDD其属性总可以按照如下方式计算:

非L属性的例子:

A→BC A.s =B.b;B.i=f(C.c,A.s)A \rightarrow B C \quad \text { A.s }=B . b ; \quad B . i=f(C . c, A . s)A→BC A.s =B.b;B.i=f(C.c,A.s)

L属性的例子:基本类型和数组类型的L属性定义

a的类型仅仅依赖自身和子节点的属性无法确定,必须依赖父节点和兄弟节点