编译原理
  • 编译原理
  • 一些简答题
  • 绪论
    • 编译器简介
    • 程序设计语言
    • 静态与动态
    • 参数传递机制
  • 词法分析
    • 词法单元、模式、词素
    • 串和语言
    • 正则表达式
    • 状态转换图
    • 不确定有穷自动机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
  1. 语法制导

语法树上的SDD求值

Previous综合属性和继承属性Next依赖图

Last updated 4 months ago

在分析树上求值有助于属性计算的可视化,便于理解。所以就有注释语法分析树(annotated parse tree),包含了各个节点的各属性值的语法分析树。

步骤:

  • 对于任意的输入串,首先构造出相应的分析树

  • 给各个节点(根据其文法符号)加上相应的属性

  • 按照语义规则计算这些属性的值

计算顺序:

定义:如果某个结点N的属性a为f(N1.b1,N2.b2,…,Nk.bk),那么我们需要先算出N1.b1,N2.b2,…,Nk.bk的值定义:如果某个结点 N 的属性 a 为 f\left(N_{1} . b_{1}, N_{2} . b_{2}, \ldots, N_{k}. b_{k}\right) ,\\那么我们需要先算出 N_{1} . b_{1}, N_{2} . b_{2}, \ldots , N_{k} . b_{k} 的值定义:如果某个结点N的属性a为f(N1​.b1​,N2​.b2​,…,Nk​.bk​),那么我们需要先算出N1​.b1​,N2​.b2​,…,Nk​.bk​的值

如果可以给各个属性值排出一个计算顺序,那么这个注释分析树就可以计算得到。S属性的SDD一定可以按照自底向上的顺序求值。

A→BA⋅s=B.iB.i=A⋅s+1A \rightarrow B \quad A \cdot s=B . i \quad B . i=A \cdot s+1A→BA⋅s=B.iB.i=A⋅s+1

上面的SDD不能计算。

注释分析树的例子