第五章 语法制导翻译

5.1 语法制导翻译概述

将语义分析和中间代码生成统称为语义翻译,而语义翻译和语法分析统称为语法制导翻译

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

语法制导翻译的基本思想包括1)如何表示语义信息?2)如何计算语义属性?

Q1:如何表示语义信息?

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

比如说一个变量,它的属性包括变量的类型、存放位置和值等。

Q2:如何计算语义属性?

文法符号的语义属性值是用与文法符号所在产生式 (语法规则)相关联的语义规则来计算的 。

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

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

语法制导定义( Syntax-Directed Definitions, SDD )

语法制导翻译方案( Syntax-Directed Translation Scheme , SDT )

语法制导定义(SDD)

SDD是对CFG的推广:

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

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

上述基础规则为一个定义变量的产生式,T的属性包括type,L和L1表示同一个符号,由第一个语义规则得出L的inh属性由T的type属性定义。

语法制导翻译方案(SDT)

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

第一句表示:当我们分析出T的时候,我们就可以利用T的type值来计算L的inh属性值。

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

SDD与SDT

SDD

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

SDT

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

5.2 SDD——语法制导定义

5.2.1 综合属性和继承属性

SDD可以将每个文法符号和一个语义属性集合相关联,而文法符号的属性可以分为两种:(1)综合属性(synthesized attribute) ;(2)继承属性(inherited attribute)

(1)综合属性(synthesized attribute) **
在分析树结点N上的非终结符A的综合属性只能通过
N的子结点N本身的属性值来定义
产生式 E → E1 + T
语义规则 E.val =E1.val + T.val

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

**(2)继承属性(inherited attribute) **

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

产生式 D →T L

语义规则 L.inh= T.typeL

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

例:带有综合属性的SDD

其中print(E.val) 为副作用,只是表示打印当前E的值,并不进行属性传递。

一个没有副作用的SDD有时也称为属性文法,属性文法的规则仅仅通过其它属性值和常量来定义一个属性值。

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

其中L.inh=real由兄弟节点传递过来,又传递给子节点。

5.2.2 SDD的求值顺序

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

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

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

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

如上图中的依赖图,节点右边的属性为综合属性,节点左边的为继承属性。

对于只具有综合属性的SDD,可以按照任何自 底向上的顺序计算它们的值;对于同时具有继承属性和综合属性的SDD,不 能保证存在一个顺序来对各个节点上的属性进 行求值;

如:

此时产生了环就无法保证有一个顺序对属性进行推导,如果图中没有环,那么至少存在一个拓扑排序,存在拓扑序列的才可以分析。

从计算的角度看,给定一个SDD,很难确定是否存在某 棵语法分析树,使得SDD的属性之间存在循环依赖关系,幸运的是,存在一个SDD的有用子类,它们能够保证对每棵语法分析树都存在一个求值顺序,因为它们不允 产生带有环的依赖图,不仅如此,接下来介绍的两类SDD可以和自顶向下及自 底向上的语法分析过程一起高效地实现 :

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

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

S-属性

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

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

L-属性

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

一个SDD是L-属性定义,当且仅当它的每个属性要 么是一个综合属性,要么是满足如下条件的继承属 性:假设存在一个产生式A→X1X2…Xn,其右部符 号Xi (1≤i≤n)的继承属性仅依赖于下列属性:

  • A的**继承属性 **
  • 产生式中Xi左边
  • Xi本身的属性,但Xi 的全部属性不能在依赖图中形成环路

每个S-属性定义都是L-属性定义

5.3 SDT——语法制导翻译方案

语法制导翻译方案(SDT)是在产生式右部中嵌入了 程序片段(称为语义动作)的CFG。SDT可以看作是SDD的具体实施方案,本节主要关注如何使用SDT来实现两类重要的SDD, 因为在这两种情况下,SDT可在语法分析过程中实现 :

  • 基本文法可以使用LR分析技术,且SDD是S属性的
  • 基本文法可以使用LL分析技术,且SDD是L属性的

5.3.1 S-SDD转换为SDT

将一个S-SDD转换为SDT的方法:将每个语义动作 都放在产生式的最后。例如:

即在规约的时候执行语义动作

如果一个S-SDD的基本文法可以使用LR分析技术, 那么它的SDT可以在LR语法分析过程中实现 。

为了在进行LR分析的同时进行语义分析,需要将语义动作中的抽象定义式改写成具体可执行的栈操作
先将top-2给A,然后将top-2,top-1,top的值相加后给到top-2,最终把top-2的设置为top的操作。

下图是一个SLR自动机以及相应的语义动作:

之所以第二个语义动作中使用top-2,是因为+号也算一个符号,而并不是作为一个数参与到其中,所以没有top-1。

假设输入为3*5+4,则分析过程如下:

5.3.2 L-SDD转换为SDT

将L-SDD转换为SDT的规则:

  • 将计算某个非终结符号A的继承属性的动作插入到产生式右部中紧靠在A的本次出现之前的位置上
  • 将计算一个产生式左部符号的综合属性的动作置在这个产生式右部的最右端


如果一个L-SDD的基本文法可以使用LL分析技术, 那么它的SDT可以在LL或LR语法分析过程中实现 :

  • 在非递归的预测分析过程中进行语义翻译
  • 在递归的预测分析过程中进行语义翻译
  • 在LR分析过程中进行语义翻译

5.3.3 在非递归的预测分析过程中进行语义翻译

扩展语法分析栈:

例:

语义翻译过程为:

5.3.4 在递归的预测分析过程中进行语义翻译

为每个非终结符A构造一个函数,A的每个继承属性对应该函数的一个形参, 函数的返回值是A的综合属性值 。对出现在A产生式右部中的 每个文法符号的每个属性 都设置一个局部变量。

上图为非终结符T’的函数,T’inh为继承属性,所以作为形参,对出现在A产生式右部中的 每个文法符号的每个属性 都设置一个局部变量。

类似的非终结符T的函数为:

主函数为:

非终结符A的代码根据当前的输入决定使用哪个产 生式

5.3.5 在LR分析过程中进行语义翻译

如果一个文法是LL的,则可以进行转化。给定一个以LL文法为基础的L-SDD,可以 修改这个文法,并在LR语法分析过程中计 算这个新文法之上的SDD。

修改后的SDT, 所有语义动作都 位于产生式末尾,此时分析过程为:

【编译原理】第五章 语法制导翻译相关推荐

  1. 编译原理(十)语法制导翻译

    语法制导定义 Syntax-Driect Definition SDD 语法制导的翻译方案Syntax-driected translation scheme SDT,可以看作SDD的具体实现方案,S ...

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

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

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

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

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

    本次笔记内容: 5-1 语法制导翻译概述 5-2 语法制导定义 5-3 SSD的求值顺序 5-4 S属性定义与L属性定义 本节课幻灯片,见于我的 GitHub 仓库:第8讲 语法制导翻译_1 文章目录 ...

  5. 编译原理第五章课程总结

    自下而上语法分析方法: 自下而上语法分析方法,就是从输入串开始,逐步归约,直至归约到文法的开始符号. 各种不同的自下而上分析法的共同特点是,边输入单词符号,边归约.核心问题是,识别可归约串. 对于规范 ...

  6. 编译原理|第7章|布尔表达式的翻译

    数值表示法 如同计算算数表达式一样,一步步计算(先算括号,后外面) 例子: a or b and not c 翻译成: T1=not c T2=b and T1 T3=a and T2 2.   a& ...

  7. 编译原理(5):语法制导翻译

    声明:本系列文章,是根据中国大学MOOC网 哈工大的编译原理 这门课学习而成的学习笔记. 一.语法制导翻译概述 什么是语法制导翻译 语法制导翻译的基本思想 两个概念 语法制导定义(SDD) 语法制导翻 ...

  8. 三万五千字长文!让你懂透编译原理(六)——第六章 属性文法和语法制导翻译

    三万五千字长文!让你懂透编译原理(六)--第六章 属性文法和语法制导翻译 长文预警 系列文章传送门: 万字长文+独家思维导图!让你懂透编译原理(一)--第一章 引论 万字长文!让你懂透编译原理(二)- ...

  9. 【编译原理复习】第六章---- 属性文法和语法制导翻译

    第六章 属性文法和语法制导翻译 本章主要掌握下面一些内容. 1.语义规则的两种描述方法:语法制导的定义和翻译方案.语法制导的定义没有指明语义规则的计算次序,而翻译方案显式给出语义规则( 或叫语义动作) ...

最新文章

  1. ASP.NET Web开发技术的深入总结
  2. 电脑微信多开方法_微信电脑端多开方法
  3. linux命令之tee,技术|为初学者介绍的 Linux tee 命令(6 个例子)
  4. python运行时修改代码会怎样_python运行时修改代码的方法——monkey patch
  5. pycharm在运行TensorFlow时出现如下信息
  6. 扫雷android源代码,Android实现扫雷小游戏
  7. C语言复习 -- 知识点总结(全)
  8. 计算机图形学与图像处理图形学的研究内容
  9. 草木有本心,何求美人折
  10. 【毕业设计】深度学习动物识别系统 - python 卷积神经网络 机器视觉
  11. 用Java写一个五子棋小游戏
  12. 如何让笔记获得更多曝光量?小红书曝光机制是怎样的
  13. [Windows]删除我的电脑WPS网盘等盘符
  14. abaqus Tie python脚本报错 原因令人震惊
  15. 惹某第8周周记(习题+感悟)
  16. 树莓派3B使用tensorflow的classify_image进行物体识别
  17. Cobar Client的使用
  18. matlab中的motion,matlab-ego-motion 基于 实现的自身运动估计仿真程序。通过对视频图 分析,快速 摄像机 的 263万源代码下载- www.pudn.com...
  19. Matlab数学建模(九):机理建模方法
  20. 思科、华为、H3C、锐捷等四大厂商的交换机基础配置命令全收录

热门文章

  1. [教你做小游戏] 《五子棋》怎么判断输赢?你能5分钟交出代码吗?
  2. php运维知识,分享一些linux运维的基础知识
  3. 如何一键免费压缩PDF文件?最好的 PDF 阅读器免费下载!
  4. SSD固态盘已坏的数据就恢复不了吗?
  5. Photoshop教程|ps渐变如何使用?如何给图片制作出渐变效果?
  6. 物体长度测量---------C#+Emgucv
  7. 消息中心(系统消息)实现
  8. 网上教务评教管理系统(教学评价系统)
  9. ElementUI 的 el-select 设置值后显示value而不是label
  10. IPS,LED,LCD,TFT简介