编译原理学习笔记-CH5Syntax-Directed Translation-语法制导翻译

本章需要解决的问题:

  • 如何存储语义信息,
  • 以什么样的顺序计算语义信息,
  • 如何在语法分析的过程中同步地实施语义计算。(比较理想)

主要知识点:

  • 综合属性、继承属性、标记语法树(设计语法树)
  • 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属性-核心特征

  1. 只使用综合属性

    • S属性从子节点传递到父节点,值由子节点的属性值计算得出。
    • 没有继承属性,因此属性计算完全依赖于子节点的信息。
  2. 适合自底向上的属性计算

    • 属性值可以按照语法树的自底向上顺序计算(即从叶子节点到根节点)。
  3. 与LR分析器结合

    • LR分析器规约某个产生式时,可以即时计算综合属性,无需存储额外的上下文信息。
  4. 基于语法树的后序遍历

    • 属性值的计算可以通过语法树的后序遍历实现。
    • 在后序遍历中,先处理子节点,再计算当前节点的属性。

2.2.L-attributed Definition

在编译原理中,L-attributed Definition(L属性定义)是一种特殊的语法制导定义。它允许使用继承属性(Inherited Attributes)综合属性(Synthesized Attributes),但对继承属性的使用施加了严格限制,以确保属性可以按照从左到右的顺序计算。

L属性-核心概念

  1. 信息来源

    • 继承属性(Inherited Attributes):只能从父节点左侧兄弟节点获取信息。
    • 综合属性(Synthesized Attributes):从子节点向父节点传递,与 S属性相同。
    • 规则总结为一句话:不依赖右侧兄弟节点的属性
  2. L 的含义

    • “L” 表示 “Left”(左),强调属性计算时只允许从父节点或左侧兄弟节点获取必要的信息。
    • 这种限制避免了信息从右向左传播,确保属性计算顺序明确。
  3. 无循环依赖

    • 如果某个属性规则涉及到节点本身的属性,必须避免循环依赖(Dependency Graph 中无环)。

三.语法制导翻译应用

3.1.抽象语法树构造

3.2.类型构造

四.语法制导翻译方案框架(SDT)

 SDT scheme写法-————继承在左,综合在尾

4.1后缀翻译方案--S属性

所有动作(semantic rules)都在最右端,换句话说(没有继承属性) 

4.2L属性定义的SDT 

 五.SDT消除左递归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值