【编译原理笔记09】语法制导翻译:语法制导翻译方案,在非递归的预测分析过程中进行翻译
本次笔记内容:
5-5 语法制导翻译方案
5-6 在非递归的预测分析过程中进行翻译
本节课幻灯片,见于我的 GitHub 仓库:第9讲 语法制导翻译_2
文章目录
- 语法制导翻译方案
- 语法制导翻译方案 SDT
- 将S-SDD转换为SDT
- S-属性定义的SDT 实现
- 扩展的LR语法分析栈
- 将语义动作中的抽象定义式改写成具体可执行的栈操作
- 例:在自底向上语法分析栈中实现桌面计算器
- 将L-SDD转换为SDT
- L-属性定义的SDT 实现
- 在非递归的预测分析过程中进行翻译
- 扩展语法分析栈
- 分析栈中的每一个记录都对应着一段执行代码
语法制导翻译方案
语法制导翻译方案 SDT
语法制导翻译方案 (SDT)
是在产生式右部
中嵌入了程序片段
(称为语义动作
)的CFG
。
如上,大括号括起的部分就是一些语义动作
。
SDT可以看作是SDD的具体实施方案。
本节主要关注如何使用SDT来实现两类重要的SDD,因为在这两种情况下,SDT可在语法分析过程中实现:
- 基本文法可以使用LR分析技术,且SDD是S属性的
- 基本文法可以使用LL分析技术,且SDD是L属性的
将S-SDD转换为SDT
将一个S-SDD转换为SDT的方法:将每个语义动作都放在产生式的最后。
S-属性定义的SDT 实现
如果一个S-SDD的基本文法可以使用LR分析技术,那么它的SDT可以在LR语法分析过程中实现。
如上,只有当归约时,才执行相应的语义动作。
扩展的LR语法分析栈
如果一个属性值的大小没有限制,最好将其存在栈外,在栈内存指针。
将语义动作中的抽象定义式改写成具体可执行的栈操作
如上,A的综合属性由其子节点X,Y,Z来定义的。左边为归约前分析栈的格局。
归约后,X、Y、Z出栈,A入栈。
例:在自底向上语法分析栈中实现桌面计算器
如上,语义动作中的抽象定义式,已经被改写成了具体的栈操作。没有给出符号栈和状态栈对应的栈操作。
初始时,输入指针指向3,状态I0遇到数字,进入I5,将5 d 3
入栈。
然后,输入指针指向*
。I5是一个归约状态,其对应第 7 个产生式,不需要改属性,只需要将 d 出栈, F 入栈,并且进入状态I3。
对于I5,需要将F出栈,T入栈。并且进入状态I2。
状态I2遇到*
,进入状态I7,无事可干。将指针指向5。
I7遇到数字,采取移入动作,将5移到栈中,进入状态I5。
I5是一个归约状态,将d出栈,F状态进栈。
因此,I7遇到F,则进入状态I10。
I10是一个归约状态,是对第4条产生式的应用。第4条产生式对应着语义动作,将[栈顶]与[栈顶-2]的值相乘,放到[栈顶-2]。
之后进行归约,将T
、*
、F
出栈,将T
进栈。
得到如上。
将L-SDD转换为SDT
将L-SDD转换为SDT的规则:
- 将计算某个非终结符号A的
继承属性
的动作插入到产生式右部中紧靠在A的本次出现之前
的位置上 - 将计算一个产生式左部符号的
综合属性
的动作放置在这个产生式右部的最右端
L-属性定义的SDT 实现
如果一个L-SDD的基本文法可以使用LL分析技术,那么它的SDT可以在LL或LR语法分析过程中实现。
如上,2)、3)具有相同左部,但是其SELECT集不相交,因此其是LL文法。
之后我们将:
- 在非递归的预测分析过程中进行语义翻译;
- 在递归的预测分析过程中进行语义翻译;
- 在LR分析过程中进行语义翻译。
在非递归的预测分析过程中进行翻译
扩展语法分析栈
A的继承属性放在其本身的记录中,A的综合属性产生的时间不同,因此,放在Asyn中。此外,还有用于记录语义动作代码
的指针。
如上,用a1...a6a_1 ... a_6a1...a6来替代如上的语义动作。我们成为“动作符号”。
因为采用自顶向下的分析方法,因此分析栈的栈底在右侧、栈顶在左侧。
初始时刻,分析栈中有文法的开始符号TTT,T没有继承属性,T有综合属性,val。
根据第1条产生式,将T替换成F {a_1} T' {a_2}
,但是,Tsyn不能出栈,因为Tsyn对应的T的综合属性val的值,要等即将进栈的T的子节点都分析完毕,才能计算出来。
如上,因为F、T’、都有综合属性,因此,其综合属性syn一起进栈。
此外,根据第4条产生式,将F替换成digit {a_6}
。
digit 是一个终结符,其只有综合属性,是由词法分析器提供的词法值。
栈顶的 digit 与 指针指向的 3 匹配成功,digit 可以出栈了。此外,a_6
将进行动作。因此,digit出栈前,要把自己的综合属性值备份到 a_6
中。
指针后移。
此时,a_6
执行自己的动作。F之前存在时,所在的位置就是a_6
所在的位置。因此将Fsyn对应的val设为3。这时 a_6
出栈。
F的综合属性 Fsyn 记录后,就看出栈了,但是根据F其后面的动作属性 a_1
,Fsyn 要在出栈前把其属性被分到 a_1
对应的字段中。
然后 a_1
执行自己的动作,则 T’ 的 inh 属性值就计算出来了。a_1
出栈。
此时,栈顶是非终结符 T’ ,当前的输入符号是 *
,因此选择第 2 个产生式进行替换。并且根据第 2 个产生式的 a_3
动作,其要使用 T’ 的 inh 值,因此要将 T’ 的 inh 值备份到 a_3
的动作记录中。
可以推算,a_3
进栈后,应处于 top+3 的位置,因此有如下的向左的箭头。
如上,a_3
已经备份好了 T’ 的 inh 属性值。
此时,指针指向的*
与栈顶匹配成功。
*
出栈。
指针指向 5 ,将栈顶的 F 替换为 digit {a_6}
。
此时,5 与 digit
匹配,digit
可以出栈,出栈前,要把其属性值备份到 {a_6}
中。
此时输入指针指向 $
。
如上,最后将获得文法开始符号的 Tsyn
的 val 的属性为 15 。
分析栈中的每一个记录都对应着一段执行代码
- 综合记录出栈时,要将综合属性值复制给后面特定的语义动作;
- 变量展开时(即变量本身的记录出栈时),如果其含有继承属性,则要将继承属性值复制给后面特定的语义动作
如上,这一个产生式对应着六个符号。
【编译原理笔记09】语法制导翻译:语法制导翻译方案,在非递归的预测分析过程中进行翻译相关推荐
- 【编译原理笔记05】语法分析:FIRST集和FOLLOW集的计算,[非]递归的预测分析法,预测分析中的错误处理
本次笔记内容: 4-4 FIRST集和FOLLOW集 4-5 递归的预测分析法 4-6 非递归的预测分析法 4-7 预测分析法中的错误处理 本节课幻灯片,见于我的 GitHub 仓库:第5讲 语法分析 ...
- 【编译原理笔记14】中间代码生成:布尔表达式的回填,控制流语句的回填,switch语句的翻译,过程调用语句的翻译
本次笔记内容: 6-8 布尔表达式的回填 6-9 控制流语句的回填 6-10 SWITCH语句的翻译 6-11 过程调用语句的翻译 本节课幻灯片,见于我的 GitHub 仓库:第14讲 中间代码生成_ ...
- 【编译原理笔记10】语法制导翻译:在递归预测过程中进行翻译,L属性定义的自底向上翻译
本次笔记内容: 5-7 在递归预测过程中进行翻译 5-8 L属性定义的自底向上翻译 本节课幻灯片,见于我的 GitHub 仓库:第10讲 语法制导翻译_3 文章目录 在递归的预测分析过程中进行翻译 算 ...
- 编译原理笔记(二)之词法分析
编译原理笔记(二)之词法分析 1. 词法分析中的若干问题 1.1 基本概念 1.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...
- 【编译原理笔记07】语法分析:SLR、LR(1)、LALR、二义性分析与错误处理
本次笔记内容: 4-12 SLR 4-13 LR1分析 4-14 LALR分析法 4-15 二义性文法的LR分析 4-16 LR分析中的错误处理 本节课幻灯片,见于我的 GitHub 仓库:第7讲 语 ...
- 【编译原理笔记06】语法分析,移入-归约分析:自底向上的分析,LR(0)分析法,LR(0)分析表的构建(基于自动机)
本次笔记内容: 4-8 自底向上的分析概述 4-9 LR分析法概述 4-10 LR0分析 4-11 LR0分析表构造 本节课幻灯片,见于我的 GitHub 仓库:第6讲 语法分析_3.pdf 本节课介 ...
- zucc 编译原理 笔记
zucc 编译原理 笔记 lec02 lec03 lec04
- 编译原理学习笔记(二十九)~习题:分析句子 id--id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系。
题目 分析句子 id–id*id的 最右推导过程,画出分析树,找出和分析过程中每一步的对应关系. 语法如下: E → E - T (1) E → T (2) T → T * F (3) T → F(4 ...
- 【编译原理笔记08】语法制导翻译:语法制导定义,SSD的求值顺序,S属性定义与L属性定义
本次笔记内容: 5-1 语法制导翻译概述 5-2 语法制导定义 5-3 SSD的求值顺序 5-4 S属性定义与L属性定义 本节课幻灯片,见于我的 GitHub 仓库:第8讲 语法制导翻译_1 文章目录 ...
最新文章
- ArcGis10安装步骤
- python如何测试仪器_使用python检测一个设备是否ping的通
- 怎么查看父子级目录linux,如何查找linux中特定父目录的所有文件?
- 有赞零售财务中台架构设计与实践
- (六)api网关服务 zuul-过滤器
- 六石管理学:发现自己确实错了,怎么办
- split函数 在oracle,oracle的split函数
- 数字图像处理-知识点总结
- Pico Neo3 VR Pro 开发新手入门有感(避坑与心得,新手学习必备,瞬移射线传送,移动,射线传送光圈效果,传送指定区域)
- i.mx6ull uboot移植
- Apache 绿色版本官方版本下载
- 10个Excel最经典的小技巧,关键时能救急!
- python期权定价公式_期权及 Black-Scholes模型的python实现
- 大家小心 日本公司淘宝天猫阿里巴巴行为异常 我购买的业务已经被关闭
- D. Harmonious Graph【并查集】
- 高德地图导航功能审核被拒
- 传统图像去噪方法(一)
- Java语言西安交大高起专_2018年西安交大网络学院高起专/本英语入学考试复习题...
- Lua 入门详情讲解
- 智慧农业,现代农业,数字农业-大数据应用,智慧农业方案,智慧农业-智能畜牧,智慧农业设施农业(大棚) 树形结构图,高标准农田(大田)树形结构图分为4层架构;
热门文章
- 解决bootstrap模态框居中问题
- Android 使用JSON格式与服务器交互 中文乱码问题解决
- Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法。
- IDEA使用@Data注解,类调用get、set方法标红的解决办法
- Polymer元素和AngularJS指令有什么区别?
- 如何计算列表项的出现?
- 流放者柯南rust_《流放者柯南》玩法前瞻 奴隶助你生活奔小康
- linux驱动程序文件,急,linux驱动程序是对的为什么生成不了.o驱动程序文件
- ❤️MVC三层架构及相关文档(建议收藏)❤️
- 模拟京东按s键选中输入框