语法制导翻译

语法制导翻译是通过向一个文法的产生式附加一些规则或程序片段而得到的。

语法制导翻译的两个概念

下面是与语法制导翻译相关的两个概念:

  • 属性(attribute) : 表示与某个程序构造相关的量。这个属性就是我们平常所理解的 属性,可以是表达式的数据类型,指定数据类型的字节大小,生成的代码中的指令数目,等等等。
  • (语法制导的)翻译方案:翻译方案是一种将程序片段附加到一个文法的各个产生式上的表示法。这个程序片段就是你用来翻译这个产生式的翻译程序。将这些翻译程序的输出结果(翻译结果)按照一定的顺序组合起来,就成了最终的翻译结果。

综合属性与继承属性

综合属性即“自底向上”求值的属性,综合属性的值是由属性值所在结点及其子结点确定的。对(语法分析树的)某个结点的综合属性的值只需要对(语法分析树的)该结点做自底向上遍历就可得到。

相对于“自底向上”求值的综合属性,编译原理里还有一种重要的“自顶向下”求值的属性,叫做 继承属性 ,继承属性的值是由属性所在结点及其父节点、兄弟结点决定的。

语法制导定义
① 每个文法符号和一个属性集合相关联。
② 每个产生式和一组 语义规则相关联。这些规则用于计算该产生式的相关属性值。

如果将语法分析树的各个结点的属性标记在语法分析树上,那么这棵语法分析树我们称之为注释语法树

我们通过深度优先遍历整棵注释语法树,可以自底向上计算整棵树所拥有的所有综合属性。假设我们对于每一个结点有属性t,表示该结点的翻译结果,当我们遍历完毕整棵树,每个结点的属性t都计算完毕,那么这棵树就翻译完成了—我们只需要取得树的根节点的t属性即可。

下面是一个例子,该例子演示了将中缀表达式9+5转换为后缀表达式95+的过程。
我们假设expr和term有属性t,表示该产生式对应的翻译结果:

编号 产生式 语义规则
1 expr -> term + expr1 expr.t = term.t || expr1.t || ‘+’
2 expr -> term expr.t = term.t
3 term -> 0 term.t = ‘0’
4 term -> 1 term.t = ‘1’
12 term -> 9 term.t = ‘9’

(注意上面的||代表字符串连接符)

我们可以得到如下语法分析树:

5
9
expr
expr
+
term
term

最初的注释分析树上属性都为空,故上图没有画出属性部分。
我们开始深度优先遍历这棵树。
当我们遍历到左边第一颗term结点时,我们发现其下有一个结点9.刚好符合上表中编号为12的产生式。于是我们根据12号产生式对应的语义规则给左边的term结点赋予值为’9’的属性t。当遍历到右边的expr结点时,继续深度遍历到右边的term,根据相应的语义规则赋予完右边的term、expr之后注释语法树如下图所示:

5
9
expr
expr.t='9'
+
term.t='5'
term.t='9'

当我们遍历到根结点expr时,发现符合1号产生式。于是我们按照对应的语义规则赋予根节点的属性expr.t:

5
9
expr.t='95+'
expr.t='9'
+
term.t='5'
term.t='9'

我们可以从根节点的属性t得到最终的翻译结果,如此一来,我们就完成了这棵语法树的翻译工作。下面,我们来看另一种翻译方法:

我们可以在文法产生式里附加上一些程序片断,用于输出产生式对应的语法树的节点的翻译结果,当我们遍历这颗语法树时,就可以逐步输出整棵语法树的翻译结果了。这是不同于注释语法树的翻译方法,我们称之为语法制导翻译方案。用于翻译的程序片段我们称之为语义动作。一个语义动作用花括号括起来,并写入产生式的体中。如下面所示是一个镶嵌了语义动作的产生式例子,这个例子同样是将中缀表达式翻译成后缀表达式的例子:
rest -> term + term {print ('+')}
term -> 0 {print ('0')} | 1 {print ('1')} | 2 {print ('2')} | ... | 9 {print ('9')}
语句1+2对应的镶嵌了语义动作的语法分析树如下所示。

1
2
rest
term
+
term
{print ('+')}
{print ('1')}
{print ('2')}

我们在翻译时,按深度优先遍历这棵树,没有镶嵌了语义动作的不予以输出,只输出镶嵌了语义动作的结点的运行结果。当遍历完成,我们就得到了翻译结果:12+

编译原理 -- 语法制导翻译相关推荐

  1. 编译原理—语法制导翻译、S属性、L属性、自上而下、自下而上计算

    编译原理-语法制导翻译.S属性.L属性.自上而下.自下而上计算 1.语法制导翻译 1.1属性文法 1.2算术表达式的计数器 1.3属性的分类 1.4属性依赖图 继承属性的计算 1.5语义规则的计算方法 ...

  2. 编译原理——语法制导翻译并产生中间代码(布尔表达式和控制语句)

    语法制导翻译并产生中间代码: 概述: 语法分析之后,编译的任务是由已识别成功的正确源程序生成一组规格一致,便于计算加工的指令形式. 中间代码的生成方法: 语法制导翻译,属性文法制导翻译 中间代码: 不 ...

  3. 编译原理-语法制导翻译

    文章目录 概念 语法制导翻译的基本思想 SDD && SDT 语义规则 文法属性(S,L) SDD 注释分析树(注释语法树) 副作用 抽象语法树( AST ) SDD的实现方法 SDT ...

  4. 编译原理-语法制导翻译、后缀表达式、三元、四元

    此时的每条规则后面会对应一条语义动作,即制导翻译. 一.中间语言 中间语言就是和源程序等价的一种编码方式,复杂性也是介于源程序和机器语言中间. 为什么要中间语言? 我们经常可能会遇到过代码优化的选项, ...

  5. 编译原理-语法制导翻译 课后习题+笔记

    语法制导翻译 来源:龙书(厚),南大课后作业 p198 5.1.2 注:对以n为结尾标记的表达式求值 Answer E,T:表达式(也可看做一个数) E':后+一个表达式 T':后*一个表达式 F:因 ...

  6. 编译原理——语法制导翻译并产生中间代码(while,复合语句和过程调用语句的翻译)

    while,复合语句和过程调用语句的翻译 while: S的chain可以理解为回填while语句之后的第一个四元式,对于之前的if--else也可以这样理解 W的语义子程序需要保留四元式号,Wd需要 ...

  7. 【最新合集】编译原理习题(含答案)_8-10语法制导翻译_MOOC慕课 哈工大陈鄞

    [最新合集]MOOC哈工大陈鄞 编译原理答案全集-->传送门 1 文法G[S]及其语法制导翻译定义如下: 产生式 语义动作 S' → S print( S.num) S → ( L) S.num ...

  8. 编译原理学习笔记 5.1 翻译文法和语法制导翻译

    前言 参考课上PPT内容. 该学习笔记目前仅打算个人使用. 后续会进一步整理,包括添加笔记内容,标明参考资料. 更新中... 跳过目录 目录 导言 一.翻译文法和语法制导翻译 输入文法 翻译文法 活动 ...

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

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

最新文章

  1. 将sqlite查询结果导入到文本文件
  2. 【正一专栏】卡卡退役-送别了多少人的青春和初恋
  3. linux系统正常停机的命令,Linux系统重启命令大全
  4. javascript --- 实战中体会jsonp
  5. 深圳电子地图 深圳高清电子地图 来自谷歌电子地图 最高19级地图
  6. Tengine新增nginx upstream模块的使用
  7. 背地砖上楼的机器人_德国发明铺地砖机器人,效率大幅度上升,节省千万!
  8. 485通讯线是几芯的_RS485协议 电脑与stm32单片机通信 keil编程 在485的硬件错误中徘徊...
  9. 打开网页出现运行脚本错误的解决技巧
  10. 甘肃教师学苑2020文章代码_【重磅通知】甘肃省电化教育中心 关于聘任教育信息化研究员的通知...
  11. profinet远程IO总线模块IP67防护等级的优势
  12. 韦根协议及IO模拟韦根34接口
  13. 利用智能ABC漏洞关闭网吧驱动防火墙
  14. 飞思卡尔RTI实时中断模块
  15. 后台提示登录失败----YYC松鼠短视频开源
  16. 固定资产盘点常用的方法,你了解多少?
  17. Python开发技术—面向对象程序设计2
  18. iphone及ipad屏幕尺寸参考
  19. Dev C++ 下载地址和安装教程
  20. 2048小游戏HTML网页版源码共享

热门文章

  1. 计算机组成实验,利用虚拟平台
  2. (超详细保姆级教程)CISCN_2023--Web-Unzip(内有做题网站)
  3. 【附源码】Java计算机毕业设计校园摄影爱好者交流网站(程序+LW+部署)
  4. 移动测试基础 测试之道--阿里巴巴八年测试专家
  5. Activity的UEL 表达式
  6. 基于NSURLSession写一个下载工具
  7. linux查看文件字节数
  8. simulink中固定大小矩阵和可变大小矩阵创建的几个陷阱
  9. PyQt教程一 HelloWorld
  10. Git切换远程分支,以及后续的pull和push操作