编译原理复习六:依赖图、注释语法树上节点的求值讲解(附题目与答案 超详细)

简介: 编译原理复习六:依赖图、注释语法树上节点的求值讲解(附题目与答案 超详细)

需要原卷和答案请点赞关注收藏后评论区留言私信~~~

一、依赖图

依赖图是用来描述相应语法树中属性的信息流;从一个属性的边到另一个需要通过计算第一个属性得到第二个属性。边的表达要遵循语法规则。

1.对于每一个分析树的节点而言,假设有一个节点定义为语法符号X,依赖图就存在与X相关的每一个属性的节点。

2.假设一个与产生式P相关的语义规则根据X.c的值定义了综合属性A.b的值。然后,依赖图从X.c到A.b出现了一条边。更准确地说,在每一个节点N标记了与产生式P相关的A,在节点N生成属性b的边,从N的子节点属性b对应着产生式中符号X的实例。

3.假设一个与产生式P相关的语义规则根据X.a的值定义了继承属性B.c的值。之后,依赖图从X.a到B.c出现了一条边。对于每一个节点N标记了产生式P中的B,生成从节点N属性c到节点M属性a的边。

所以我们可以明确这类题目的做题步骤

1:根据输入串构造对应语法树

2:根据语义规则找出各个节点的综合属性和继承属性,然后在语法树上画出依赖图

3:根据依赖图顺序求值

二、注释语法树的求值

语法分析树和语法树不是一种东西。习惯上,我们把前者叫做“具体语法树”,其能够体现推导的过程;后者叫做“抽象语法树”,其不体现过程,只关心最后的结果。

语法分析树

语法分析树是语言推导过程的图形化表示方法。这种表示方法反映了语言的实质以及语言的推导过程。

定义:对于 CFG G 的句型,分析树被定义为具有下述性质的一棵树:

注释语法树可以简单的理解为各个节点带有属性和值的语法树

注释语法树的求值步骤如下:画出依赖图后找出各个属性间的依赖关系,求一个节点的值时需要求出这个节点所依赖的节点的值,即可以用拓扑排序来给出一种求值顺序,下面以具体题目进行讲解

Consider the attribute grammar, where h is the attribute of S and L

S(L) {S.h=L.h×2}

  1. 根由开始符号所标记;
  2. 每个叶子由一个终结符、非终结符或 ε 标记;
  3. 每个内部节点都是非终结符;
  4. 若 A 是某节点的内部标记,且 X1、X2...Xn 是该节点从左到右的所有孩子的标记。则:A→X1X2...Xn 是一个产生式。若 A→ε,则标记为 A 的节点可以仅有一个标记为 ε 的孩子。若 A→ε ,则标记为 A 的节点可以仅有一个标记为 ε 的孩子。
  5. 每一直接推导(每个产生式),对应一颗仅有父子关系的子树,即产生式左部非终结符“长出”右部的孩子;
  6. 分析树的叶子,从左到右构成 CFG G 的一个句型(T、N两掺的串)。若叶子仅由终结符标记(+ 、- 、* 之类的运算符号也算是终结符),则构成一个句子。

Sa {S.h=1}

LL(1), S {L.h=L(1).h+S.h}

LS {L.h=S.h}

Draw the dependency graph for string (a,a). What’s final value of S.h for string (a,a)

答案如下

箭头指向表示各个之间的依赖关系,然后节点对应属性的值标上去即可

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
自然语言处理 编译器
编译原理复习五:属性文法与三地址码的生成(附题目与答案 超详细)
编译原理复习五:属性文法与三地址码的生成(附题目与答案 超详细)
1413 0
|
网络安全
编译原理复习二:Top-Down分析LL(1)文法的判断与LL(1)分析表的构造(附题目与答案 超详细)
编译原理复习二:Top-Down分析LL(1)文法的判断与LL(1)分析表的构造(附题目与答案 超详细)
1268 1
|
算法 C语言 C++
二叉树三种遍历(动态图+代码深入理解)
二叉树三种遍历(动态图+代码深入理解)
3836 3
二叉树三种遍历(动态图+代码深入理解)
|
消息中间件 存储 安全
聊聊 Kafka:Kafka 如何保证可靠性
聊聊 Kafka:Kafka 如何保证可靠性
1136 0
|
自然语言处理 前端开发 算法
编译原理 (二)词法分析、语法分析、语义分析以及中间代码生成器的基本概念
编译原理 (二)词法分析、语法分析、语义分析以及中间代码生成器的基本概念
1572 0
|
编译器
区分LR(0),SLR(1),LR(1)和LALR(1)
区分LR(0),SLR(1),LR(1)和LALR(1)
2438 1
|
固态存储 IDE 开发工具
手把手教你安装Keil MDK5:官方网盘资源+芯片支持包配置详解(附调试实战)
Keil是一款专为嵌入式系统开发设计的集成开发环境(IDE),由德国Keil Software公司开发,后被ARM收购整合为MDK-ARM工具链的一部分。本文详细介绍Keil MDK541的安装步骤、系统要求、运行环境配置及首次使用指南,包括许可证管理、芯片支持包安装和工程模板设置等。同时提供新建STM32工程、编写测试代码的具体操作,并解答常见问题,如缺少DLL文件、语言设置及编译错误处理。附延伸学习资源与版权声明,帮助用户高效上手Keil开发环境。
8221 24
|
关系型数据库 MySQL 数据库
图解MySQL【日志】——两阶段提交
两阶段提交是为了解决Redo Log和Binlog日志在事务提交时可能出现的半成功状态,确保两者的一致性。它分为准备阶段和提交阶段,通过协调者和参与者协作完成。准备阶段中,协调者向所有参与者发送准备请求,参与者执行事务并回复是否同意提交;提交阶段中,若所有参与者同意,则协调者发送提交请求,否则发送回滚请求。MySQL通过这种方式保证了分布式事务的一致性,并引入组提交机制减少磁盘I/O次数,提升性能。
1333 5
图解MySQL【日志】——两阶段提交
|
存储 算法 Java
【DFS(深度优先搜索)详解】看这一篇就够啦
本文介绍了深度优先搜索(DFS)算法及其应用。DFS从某个顶点出发,深入探索图的每条路径,直到无法前进为止,然后回溯。文章详细解释了DFS的基本思想,并通过示例图展示了其执行过程。此外,文中还探讨了三种枚举方式:指数型枚举、排列型枚举和组合型枚举,并提供了具体的代码实现。最后,文章通过几道练习题帮助读者更好地理解和应用DFS算法。
10891 19
【DFS(深度优先搜索)详解】看这一篇就够啦