【编译原理】6—语法制导翻译Syntax-Directed Translation(SDD、SDT详细介绍)

这篇具有很好参考价值的文章主要介绍了【编译原理】6—语法制导翻译Syntax-Directed Translation(SDD、SDT详细介绍)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

6 语法制导翻译Syntax-Directed Translation

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
项目链接👉https://github.com/A-BigTree/college_assignment
⭐⭐⭐⭐⭐⭐文章来源地址https://www.toymoban.com/news/detail-792439.html

6.1 语法制导定义SDD

语法制导定义(Syntax-Directed Definition,SDD)是一个上文文无关文法和 属性及规则 的结合。

属性和文法符号相关联,而规则和产生式相关联。如果X是一个符号而a是X的一个属性,那么我们用X.a来表示a在某个标号为X的分析树结点上的值。属性可以有很多种类型,比如数字、类型、表格引用或串。

6.1.1 属性分类

  1. 综合属性(synthesized attribute)自下而上传递信息。在分析树节点N上的非终结符号A的综合属性是由N上的产生式所关联的语义规则来定义。

编译原理扩展sdd,编译原理,算法,学习,学习方法

  1. 继承属性(inherited attribute)自上而下传递消息。在分析树节点N上的非终结符号B的继承属性是由N的父节点上的产生式所关联的语义规则来定义。

编译原理扩展sdd,编译原理,算法,学习,学习方法

终结符只有综合属性,它由语法分析器提供。非终结符既可以有综合属性也可以有继承属性,但文法开始符号的继承属性作为属性计算前的初始值。

  • 一个只 包含综合属性 的SDD称为S属性(S-attribute)的SDD;
  • 一个S属性的SDD可以和一个LR语法分析器一起自然地实现;
  • 一个没有副作用的SDD有时也称为属性文法(attribute grammar);一个属性文法的规则仅仅通过其他属性值和常量值来定义一个属性值;

6.1.2 在语法分析树的结点上对SSD求值⭐

一个显示了它的各个属性的值的语法分析树称为 注释语法分析树(annotated parse tree)

我们对一棵语法分析树的某个结点的一个属性进行求值之前,必须首先求出这个属性值依赖的所有属性值

  • 对于综合属性,我们可以按照任何自底向上的顺序计算它们的值,比如对语法分析树进行后序遍历的顺序;
  • 对于同时具有继承属性和综合属性的SSD,不能保证有一个顺序来对各节点上的属性进行求值;
  • 从计算角度看,给定一个SDD,很难确定是否存在某棵语法分析树使得SDD属性值之间具有依赖关系。幸运的是,存在一个SDD的有用子类,它们能够保证对每棵语法分析树都存在一个求值顺序,后面将进一步讨论;

示例1:

对于如下文法:
编译原理扩展sdd,编译原理,算法,学习,学习方法

写出 3 ∗ 5 + 4 n 3*5+4n 35+4n的注释语法分析树。

自下而上

编译原理扩展sdd,编译原理,算法,学习,学习方法

示例2:

对于如下文法:

编译原理扩展sdd,编译原理,算法,学习,学习方法

写出 3 ∗ 5 3*5 35的注释文法分析树。

自顶向下

编译原理扩展sdd,编译原理,算法,学习,学习方法

6.2 SDD的求值顺序

6.2.1 依赖图

依赖图(dependency graph) 可以确定一棵给定的语法分析树中各个属性实例的求值顺序。注释语法分析树显示了各个属性的值,而依赖图可以帮助我们确定如何计算这些值。

依赖图描述了某个语法分析树中的属性实例之间的信息流。从一个属性实例到另一个实例的边表示计算第二个属性实例时需要第一个属性实例的值。图中的边表示语义规则所蕴含的约束。

实例2依赖图如下:

编译原理扩展sdd,编译原理,算法,学习,学习方法

6.2.2 属性求值的顺序

如果依赖图中有一条从结点M到结点N的边,那么要先对M对应属性求值,再对N对应的属性求值。因此,所有的可行求值顺序就是满足下列条件的结点顺序 N 1 , N 2 , … , N k N_1,N_2,\dots,N_k N1,N2,,Nk:如果有一条从结点 N i N_i Ni N j N_j Nj的依赖图的边,那么 i < j i<j i<j。这样的排序将一个有向图变成了一个线性排序,这个排序称为这个图的拓扑排序(topological sort)。

如果图中存在任意一个环,那么就不存在拓扑排序。也就是说,没有办法在这棵语法分析树上对相应的SDD求值。然而,如果图中没有环,那么总是至少存在一个拓扑排序。

6.2.3 S属性的定义⭐

第一种SDD类型的定义如下:

  • 如果一个SDD的每个属性 都是综合属性,它就是S属性的(S-attribute)。

S属性的定义可以在自底向上语法分析的过程中实现,因为一个自底向上的语法分析过程对应一次后序遍历。

6.2.4 L属性的定义⭐

第二种SDD称为L属性定义(L-attributed definition)。这类SDD的思想是在一个产生式体所关联的各个属性之间,依赖图的边总是从左到右,而不能从右到左。每个属性必须是:

  • 综合属性;
  • 继承属性,但是它的规则具有如下限制。假设存在一个产生式 A → X 1 X 2 … X n A\rightarrow X_1X_2\dots X_n AX1X2Xn,并且有一个通过这个产生式所关联的规则计算得到的继承属性 X i . a X_i.a Xi.a。那么这个规则只能使用:
    • 和产生式头A关联的继承属性;
    • 位于 X i X_i Xi左边文法的文法符号实例 X 1 , X 2 , … , X i − 1 X_1,X_2,\dots,X_{i-1} X1,X2,,Xi1相关的继承属性或者综合属性;
    • 和这个 X i X_i Xi的实例本身相关的继承属性或综合属性,但是在由这个 X i X_i Xi的全部属性组成的依赖图中不存在环;

结点使用信息“来自上边或左边,要么是综合属性。

6.2.5 具有受控副作用的语义规则

对于SDD,我们在属性文法和翻译方案之间找到一个平衡点。属性文法没有副作用,并支持任何与依赖图一致的求值顺序。翻译方案要求按从左到右的顺序求值。

控制SDD中的副作用:

  • 支持那些不会对属性求值产生约束的附带副作用;
  • 对允许的求值顺序添加约束,使得以任何允许的顺序求值都会产生相同的翻译结果;

6.3 语法制导的应用

6.3.1 抽象语法树的构造

我们将使用具有适当数量的字段的对象来实现一棵语法树的各个结点。每个对象将有一个op字段,也就是这个结点的标号。这些对象将具有如下所述的字段:

  • 如果结点是一个叶子,那么对象将有一个附加的域来存放这个这个叶子结点的词法值。构造函数 L e a f ( o p , v a l ) Leaf(op,val) Leaf(op,val)创建一个叶子对象。我们也可以把结点看作记录,那么 L e a f Leaf Leaf就会返回一个指向与叶子节点对应的新纪录的指针;
  • 如果结点是内部结点,那么它的附加字段的个数和结点在语法树中的子节点个数相同。构造函数的 N o d e Node Node带有两个或多个参数: N o d e ( o p , c 1 , c 2 , … , c k ) Node(op,c_1,c_2,\dots,c_k) Node(op,c1,c2,,ck),该函数创建一个对象,第一个字段的值为op,其余k个字段的值为 c 1 , … , c k c_1,\dots,c_k c1,,ck

下面为S属性定义为一个简单的表达式文法构造出语法树:

编译原理扩展sdd,编译原理,算法,学习,学习方法

下面为 a − 4 + c a-4+c a4+c的抽象语法树:

编译原理扩展sdd,编译原理,算法,学习,学习方法

6.3.2 类型结构

当语法分析树的结构和输入的抽象语法树的结构不同时,继承属性是很有用的。在这种情况下,继承属性可以用来将信息从语法分析树的 一部分传递到另一部分。

下图为数组类型的语法制导的翻译:

编译原理扩展sdd,编译原理,算法,学习,学习方法

输入串 i n t [ 2 ] [ 3 ] int[2][3] int[2][3]翻译如下图:

编译原理扩展sdd,编译原理,算法,学习,学习方法

6.4 语法制导的翻译方案

语法制导的翻译方案(syntax-directed translation scheme,SDT)是在其产生式体中嵌入了程序片段的一个上下文无关文法。这些程序片段称为 语义动作,它们可以出现在产生式体中的任何地方。

任何SDT都可以通过下面的方法实现:首先建立一棵语法分析树,然后按照从左到右的深度优先顺序来执行这些动作,也就是说在一个前序遍历过程中执行。我们主要关注如何使用SDT来实现两类重要的SDD:

  1. 基本文法可以用LR技术分析,且SDD为S属性;
  2. 基本文法可以用LL技术分析,且SDD为L属性;

可以在语法分析过程中实现的SDT可以按照如下的方式识别:将每个内嵌的语义动作替换成一个独有的标记非终结符号(marker nonterminal)。每个标记非终结符M只有一个产生式 M → ε M\rightarrow \varepsilon Mε。如果带有标记非终结符号的文法可以使用某个方法进行语法分析,那么这个SDT就可以在语法分析过程中实现。

6.4.1 后缀翻译方案

至今为止,最简单的实现SDD的情况是文法可以用自底向上方法来分析且该SDD是S属性定义。在这种情况下,我们可以构造出一个SDT,其中的每个动作都放在产生式的最后,并且在按照这个产生式将产生式体归约为产生式头的时候执行这个动作。所有动作都在产生式最右端的SDT称为后缀翻译方案

下图为桌上计算器的后缀SDT:

编译原理扩展sdd,编译原理,算法,学习,学习方法

6.4.2 产生式内部带有语义动作的SDT

动作可以放置在产生式体中的任何位置上。当一个动作左边的所有符号都被处理过后,该动作立刻执行。因此,如果我们有一个产生式 B → X { a } Y B\rightarrow X\{a\}Y BX{a}Y,那么当我们识别到X(如果X是终结符号)或者所有从X推导出的终结符号(如果X是非终结符号)之后,动作a就会只自行。

  • 如果语法分析过程是自底向上的,那么我们在X的此次出现位于语法分析栈的栈顶时,我们立刻执行动作a;
  • 如果语法分析过程是自顶向下的,那么我们在试图展开Y的本次出现(如果Y是非终结符号)或者在输入中检测Y(如果Y是非终结符号)之前执行语义动作a;

6.4.3 从SDT中消除左递归

核心方法:在转换文法的时候,将动作当作终结符号处理

实例:
E → E 1 + T { p r i n t ( ′ + ′ ) ; } ∣ T E\rightarrow E_1+T\{print('+');\}|T EE1+T{print(+);}T
引用R表示E的余部,消除左递归后为:
E → T R R → + T { p r i n t ( ′ + ′ ) } R ∣ ε \begin{aligned} &E\rightarrow TR\\ &R\rightarrow +T\{print('+')\}R|\varepsilon \end{aligned} ETRR+T{print(+)}Rε

6.4.4 L属性定义的SDT

将一个L属性的SDD转换为一个SDT的规则如下:

  1. 把计算某个非终结符号A的继承属性的动作插入到产生式体中紧靠在A的本次出现之前的位置上。如果A的多个继承属性以无环的方式相互依赖,就需要对这些属性的求值动作进行排序,以便先计算需要的属性;
  2. 将计算一个产生式头的综合属性的动作放置在这个产生式体的最右端;

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
项目链接👉https://github.com/A-BigTree/college_assignment
⭐⭐⭐⭐⭐⭐

到了这里,关于【编译原理】6—语法制导翻译Syntax-Directed Translation(SDD、SDT详细介绍)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译原理-6-LR语法分析器

    自顶向下的、不断归约的、基于句柄识别自动机的、适用于LR(∗) 文法的、LR(∗) 语法分析器 只考虑无二义性的文法 自底向上 构建语法分析树 根节点 是文法的起始符号 S S S 每个中间 非终结符节点 表示 使用它的某条产生式进行归约 叶节点 是词法单元$w$$ 仅包含终结符号与

    2024年02月05日
    浏览(35)
  • 【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

    本实验基于词法分析程序实现,可参考本人前面的文章。 目录 一、目标任务 二、程序功能描述 三、主要数据结构描述 四、程序结构描述 设计方法 First集和Follow集 递归子程序框图 函数定义及函数之间的调用关系 五、程序测试 测试用例1 测试结果1 测试用例2 测试结果2 测试

    2023年04月21日
    浏览(37)
  • 编译原理PL0语法分析实验1

    1,待分析的简单语言的词法 相同点:都是分析种别码 不同点:词法分析器分析的是字符串中的单词的种别码(单词) 语法分析器分析的是字符串的文法是否正确(句子) 待分析的简单语言的语法 BNF: (1)程序::=begin语句串end (2)语句串::=语句{;语句} (3)语句::=赋值语

    2024年04月28日
    浏览(25)
  • 编译原理——语法分析器(C/C++代码实现)

    编写一个简单的LL(1)语法分析器。(注意:此实验是简化版的LL(1)文法,已给出预测分析表,不需要求FIRST和FOLLOW集,直接根据预测分析表编写程序即可) 根据编译原理理论课中学习的算术表达式文法,以及该文法LL(1)分析表,用C语言编写接受算术表达式为输入的语法

    2023年04月26日
    浏览(31)
  • [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现

    初始条件: ​ 理论:完成编译原理,数据结构、高级编程语言、汇编语言等相关课程的学习,基于计算机专业知识进行课程设计。 ​ 实践:计算机实验室提供计算机及软件环境。如果自己有计算机及环境也可以在其上进行设计任务。 要求完成的主要任务: (包括课程设计工

    2024年02月03日
    浏览(32)
  • 编译原理实验三:预测分析法语法分析器的设计

    ​ 根据文法编制预测分析法语法分析程序,以便对输入的符号串进行语法分析。通过编写预测分析法语法分析程序掌握预测分析法的基本原理、FIRST和FOLLOW集的计算、预测分析表的构造方法以及语法分析法主控程序的设计。 对于给定的上下文无关文法,编程完成以下功能:

    2024年02月05日
    浏览(37)
  • 编译原理语法分析器(C/C++)(LR1文法)

            来写语法分析器了,有可能是老师不一样也有可能是学校不一样,我要做的语法分析器复杂一点,额,现在想来也不复杂(可能)。         这一次的实验是要进行语法分析,是要用LL1或者递归下降分析法或LR分析法(LR0、LR1)设计语法分析程序。这次我也是先去百

    2024年02月07日
    浏览(27)
  • 编译原理——SLR(1)语法分析器(C/C++代码实现)

    设计、编制、实现并调试SLR(1)语法分析器,加深对语法分析的理解。 根据编译原理理论课中学习的算术表达式文法以及该文法的LR分析表,用C语言编写接受算术表达式为输入的语法分析器,以控制台(或文本文件,也可以结合词法分析器完成)为输入,控制台(或文件)

    2024年02月11日
    浏览(32)
  • 编译原理之LL(1)语法分析实验(附完整C/C++代码与测试)

    先从键盘读入要分析的文法,由程序自动构造FIRST、FOLLOW 集以及SELECT集合,判断是否为LL (1)文法。 分析文法为G[E]: (0)E→ TE’   (1)E’→ +TE’ (2)E’→ε    (3)T→ FT’ (4)T’→ *FT’   (5)T’→ε     (6)F→ (E)    (7)F→a 若符合LL (1)文法,由程序自动构

    2024年02月04日
    浏览(33)
  • 编译原理笔记11:自上而下语法分析(1)基础概念、左递归和公共左因子处理、递归下降分析(咕咕咕)

    词法分析,是把源程序分析成记号流,识别其中的单词。 语法分析,是要分析词法分析产生的记号流中的语法结构是否正确——对词法分析得到的记号流进行分析,以确认其是不是一个可以由我们定义好的文法推出来的句子。如果语法结构正确,语法分析器最终要为输入序列

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包