本次笔记内容:
5-1 语法制导翻译概述
5-2 语法制导定义
5-3 SSD的求值顺序
5-4 S属性定义与L属性定义

本节课幻灯片,见于我的 GitHub 仓库:第8讲 语法制导翻译_1

文章目录

  • 语法制导翻译概述
    • 什么是语法制导翻译
    • 语法制导翻译的基本思想
    • 语法制导定义(SDD)
    • 语法制导翻译方案(SDT)
    • SDD与SDT
  • 语法制导定义SDD
    • 综合属性(synthesized attribute)
    • 继承属性(inherited attribute)
    • 例:带有综合属性的SDD
    • 例:带有继承属性L.in的SDD
    • 属性文法(Attribute Grammar)
  • SDD的求值顺序
    • 依赖图(Dependency Graph)
    • 属性值的计算顺序
  • S-属性定义与L-属性定义
    • S-属性定义
    • L-属性定义

语法制导翻译概述

什么是语法制导翻译


语法制导翻译使用上下文无关文法CFG来引导对语言的翻译,是一种面向文法的翻译技术。

语法制导翻译的基本思想

如何表示语义信息?

  • 为CFG中的文法符号设置语义属性,用来表示语法成分对应的语义信息

如何计算语义属性?

  • 文法符号的语义属性值是用与文法符号所在产生式(语法规则)相关联的语义规则来计算的
  • 对于给定的输入串x ,构建x的语法分析树,并利用与产生式(语法规则)相关联的语义规则来计算分析树中各结点对应的语义属性值

语义规则语法规则(产生式)联系起来要涉及两个概念:

  • 语法制导定义(Syntax-Directed Definitions, SDD )
  • 语法制导翻译方案(Syntax-Directed Translation Scheme , SDT )

语法制导定义(SDD)

SDD是对CFG的推广:

  • 将每个文法符号和一个语义属性集合相关联
  • 将每个产生式和一组语义规则相关联,这些规则用于计算该产生式中各文法符号的属性值

如果X是一个文法符号,a是X的一个属性,则用X.a表示属性a在某个标号为X的分析树结点上的值。


如上,我们为 L 设置了一个属性 inh ,为 T 定义了一个属性 type ;由第一个产生式可以看出,L 的 inh 属性是由 T 的 type属性定义的。对于第四个产生式,用下角标区分两个规则。

语法制导翻译方案(SDT)

SDT是在产生式右部嵌入了程序片段的CFG,这些程序片段称为语义动作。按照惯例,语义动作放在花括号内。

可见,一个语义动作在产生式中的位置决定了这个动作的执行时间。

SDD与SDT

SDD

  • 是关于语言翻译的高层次规格说明
  • 隐蔽了许多具体实现细节,使用户不必显式地说明翻译发生的顺序

SDT

  • 可以看作是对SDD的一种补充,是SDD的具体实施方案
  • 显式地指明了语义规则的计算顺序,以便说明某些实现细节

语法制导定义SDD

语法制导定义 SDD 是对 CFG 的推广:

  • 将每个文法符号和一个语义属性集合相关联
  • 将每个产生式和一组语义规则相关联,用来计算该产生式中各文法符号的属性值

文法符号的属性

  • 综合属性(synthesized attribute)
  • 继承属性(inherited attribute)

综合属性(synthesized attribute)

在分析树结点N上的非终结符A的综合属性只能通过N的子结点N本身的属性值来定义。


如上,E的val属性值是由其两个子结点来定义的,因此,val是E的一个综合属性。

终结符可以具有综合属性。终结符的综合属性值是由词法分析器提供的词法值,因此在SDD中没有计算终结符属性值的语义规则。

继承属性(inherited attribute)

在分析树结点N上的非终结符A的继承属性只能通过N的父结点N的兄弟结点N本身的属性值来定义。

如上,L的inh是其兄弟结点T的type属性定义的,因此inh是一个继承属性。

终结符没有继承属性。终结符从词法分析器处获得的属性值被归为综合属性值。

例:带有综合属性的SDD


这里的 digit 是一个终结符,其属性由词法分析给出F.val = digit.lexval

例:带有继承属性L.in的SDD

属性文法(Attribute Grammar)

一个没有副作用的SDD有时也称为属性文法

  • 属性文法的规则仅仅通过其它属性值和常量来定义一个属性值

    对之前的用于算术表达式求值的SDD进行修改,如上为L设置了属性值val,并消去了副作用,变为属性文法。

SDD的求值顺序

SDD为CFG中的文法符号设置语义属性。对于给定的输入串x,应用语义规则计算分析树中各结点对应的属性值。

按照什么顺序计算属性值?

  • 语义规则建立了属性之间的依赖关系,在对语法分析树节点的一个属性求值之前,必须首先求出这个属性值所依赖的所有属性值

依赖图(Dependency Graph)

  • 依赖图是一个描述了分析树中结点属性间依赖关系的有向图;
  • 分析树中每个标号为X的结点的每个属性a都对应着依赖图中的一个结点;
  • 如果属性X.a的值依赖于属性Y.b的值,则依赖图中有一条从Y.b的结点指向X.a的结点的有向边。

举例如下。

习惯上,将综合节点放在左边,继承属性放在右边。

此外,为了方便表示,途中最下面的两个 L 为虚属性结点。

属性值的计算顺序

可行的求值顺序是满足下列条件的结点序列N1, N2, … , Nk :如果依赖图中有一条从结点Ni到Nj的边(Ni→Nj), 那么i < j(即:在节点序列中,Ni 排在 Nj 前面)。

  • 这样的排序将一个有向图变成了一个线性排序,这个排序称为这个图的·拓扑排序(topological sort)·。


对于依赖图的拓扑排序举例如上。此外,还存在其他形式的拓扑排序。比如1,2,3,4互不依赖,因此其顺序可以随意对调。

对于只具有综合属性的SDD ,可以按照任何自底向上的顺序计算它们的值。

对于同时具有继承属性综合属性的SDD,不能保证存在一个顺序来对各个节点上的属性进行求值。


如果图中没有环,那么至少存在一个拓扑排序。

从计算的角度看,给定一个SDD,很难确定是否存在某棵语法分析树,使得SDD的属性之间存在循环依赖关系。

幸运的是,存在一个SDD的有用子类,它们能够保证对每棵语法分析树都存在一个求值顺序,因为它们不允许产生带有环的依赖图

不仅如此,接下来介绍的两类SDD可以和自顶向下及自底向上的语法分析过程一起高效地实现:

  • S-属性定义(S-Attributed Definitions, S-SDD)
  • L-属性定义(L-Attributed Definitions, L-SDD)

S-属性定义与L-属性定义

S-属性定义

仅仅使用综合属性的SDD称为S属性的SDD,或S-属性定义、S-SDD。


如果一个SDD是S属性的,可以按照语法分析树节点的任何自底向上顺序来计算它的各个属性值。

S-属性定义可以在自底向上的语法分析过程中实现。

L-属性定义

L-属性定义(也称为L属性的SDD或L-SDD)的直观含义:在一个产生式所关联的各属性之间,依赖图的边可以从左到右,但不能从右到左(因此称为L属性的,L是Left的首字母)

其正式定义如下。

其中,为什么右部符号的继承属性只能依赖于A的继承属性,而不能是综合属性呢?

这是因为,父节点的综合属性A.s可以依赖与字节的的属性;当然就包括子节点的继承属性X.i;如果子节点的继承属性再依赖于父节点的综合属性,就会造成循环依赖。



如上,用于定义所在产生右部属性的,是继承属性;左部属性的,是综合属性。

SDD是不是L属性定义,主要通过继承属性所依赖的属性值看出。

对于Q.i = q(R.s)中,Q依赖于右边的兄弟的属性值;因此,整个SDD不是L-SDD。

【编译原理笔记08】语法制导翻译:语法制导定义,SSD的求值顺序,S属性定义与L属性定义相关推荐

  1. 编译原理笔记(二)之词法分析

    编译原理笔记(二)之词法分析 1. 词法分析中的若干问题 1.1 基本概念 1.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...

  2. 编译原理—中间代码生成、布尔表达式翻译、短路计算、控制流语句翻译、条件语句、循环语句

    编译原理-中间代码生成.布尔表达式翻译.短路计算.控制流语句翻译.条件语句循环语句 1.布尔表达式的翻译 1.1 数值表示法 1.2举例 1.3短路计算 1.4回填技术 1.5短路计算及回填的翻译方案 ...

  3. zucc 编译原理 笔记

    zucc 编译原理 笔记 lec02 lec03 lec04

  4. 【编译原理笔记10】语法制导翻译:在递归预测过程中进行翻译,L属性定义的自底向上翻译

    本次笔记内容: 5-7 在递归预测过程中进行翻译 5-8 L属性定义的自底向上翻译 本节课幻灯片,见于我的 GitHub 仓库:第10讲 语法制导翻译_3 文章目录 在递归的预测分析过程中进行翻译 算 ...

  5. 【编译原理笔记09】语法制导翻译:语法制导翻译方案,在非递归的预测分析过程中进行翻译

    本次笔记内容: 5-5 语法制导翻译方案 5-6 在非递归的预测分析过程中进行翻译 本节课幻灯片,见于我的 GitHub 仓库:第9讲 语法制导翻译_2 文章目录 语法制导翻译方案 语法制导翻译方案 ...

  6. 【编译原理笔记03】词法分析:正则表达式、有穷自动机(FA)、DFA与NFA及RE的相互转换、DFA识别单词、语法检测

    本次笔记内容: 3-1 正则表达式 3-2 正则定义 3-3 有穷自动机 3-4 有穷自动机的分类 3-5 从正则表达式到有穷自动机 3-6 从NFA到DFA的转换 3-7 识别单词的DFA 文章目录 ...

  7. 【编译原理笔记11】中间代码生成:类型表达式,声明语句的翻译

    本次笔记内容: 6-1 类型表达式 6-2 声明语句的翻译 本节课幻灯片,见于我的 GitHub 仓库:第11讲 中间代码生成_1.pdf 文章目录 类型表达式 Type Expression 举例 ...

  8. 《编译原理》实验报告——递归下降语法分析器的构建

    一.实验要求 运用递归下降法,针对给定的上下文无关文法,给出实验方案.预估实验中可能出现的问题. 二.实验方案 1.构造LL(1),通过设计.编制.调试递归下降语法分析程序,对输入的符号串进行分析匹配 ...

  9. 【编译原理笔记12】中间代码生成:简单赋值语句的翻译,数组引用的翻译

    本次笔记内容: 6-3 简单赋值语句的翻译 6-4 数组引用的翻译 本节课幻灯片,见于我的 GitHub 仓库:第12讲 中间代码生成_2.pdf 文章目录 简单赋值语句的翻译 赋值语句翻译的任务 赋 ...

最新文章

  1. 知识图谱学习笔记-非结构化数据处理
  2. vtk读取文件并显示的几种方法
  3. mysql中insert into select from的使用
  4. AlexNet 和 VGG-Net的区别
  5. 高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)
  6. a标签如何链接php文件路径,HTML的a标签href属性指定相对路径与绝对路径的用法讲解...
  7. matlab画简谐振动图,简谐振动合成matlab
  8. 图像渲染测试软件,3D渲染参数(测试图及光子图)
  9. 微信小程序登陆/注册界面及接口开发实战(二)
  10. 前端工程化之前端静态资源缓存优化和部署
  11. Input和Output
  12. 一道疯狂bypass的题目
  13. 信息系统安全等级保护一些实施难点
  14. 「拓数派(OpenPie)2022 发布会实录 」PieCloudDB Database 社区版与商业版产品总览
  15. 键盘各个键所对应的键值
  16. 【计算机毕业设计】034学生请假系统设计与实现
  17. 【PS技巧】如何校正倾斜的图片
  18. 嵌入式工控机在舞台灯光控制中的应用
  19. python回调廖雪蜂_Python 廖雪峰教程《三》
  20. NHibernate Mapping Attribute实现复合主键映射

热门文章

  1. 20-21-2网络管理quiz3
  2. 解决jquery下checked取值问题...
  3. 安装mysql数据库及问题解决方法
  4. Call to localhost/127.0.0.1:9000 failed on connection exception:java.net.ConnectException的解决方案
  5. Linux系统centos7+VMwareWorkstation创建共享文件夹错误解决方法集锦
  6. postgresql查看死锁及解决方法
  7. 解决新电脑的系统安装问题:针对BIOS的UEFI模式
  8. localStorage.getItem得到的是[object Object] 的解决方案
  9. 你如何删除ActiveRecord对象?
  10. 自定义js 延时函数调用延时函sleep();