属性文法和语法制导翻译

前言

前面通过词法分析,语法分析,DFA最后接受了一个输入实际上是理解了某一句编程语句,编译器的角色是将高级程序语言编译(翻译)为汇编代码,通过词法、语法分析编译器可以理解高级程序语言了,那么如何实现输出汇编代码和创建变量等等这一系列动作?属性文法,通过为产生式配备属性的计算规则,通过计算和传递属性处理语义,实现这一系列动作。

依赖图

在这里插入图片描述

依赖图是DAG图,每个节点是一个属性,这样可以按照拓扑序计算属性。下面是一个跟踪(动作)数据类型的例子,最后可以确定 i d 1 , i d 2 , i d 3 id_1,id_2,id_3 id1,id2,id3的类型为real。

在这里插入图片描述

一遍扫描的处理方法

在这里插入图片描述

对于DAG,非常直观地,按照拓扑序进行属性的计算即可,关键是根据继承属性之间的依赖关系,确定兄弟节点的计算次序。S-属性文法,没有继承属性;L-属性文法,产生式右侧的非终结符号已经是拓扑序了,即兄弟节点的计算次序已经合适。

语法制导翻译

在这里插入图片描述

两个属性文法的例子

在这里插入图片描述

动作:建立抽象语法树,这里的属性是指向节点的指针。

在这里插入图片描述
在这里插入图片描述

动作:构建正规式对应的NFA。
NewState代表创建一个新状态。可以看到节点之间除了赋值、传递操作外还有mknode,mkleaf,AddArc等(绘图)实际动作,影响到属性之外的事物,最终输出的是图。

L-属性文法

在这里插入图片描述

翻译模式

在这里插入图片描述

引入翻译模式的概念,使得动作更加丰富(产生式中间有动作,实际上可以通过引入 ϵ \epsilon ϵ,使得动作永远在产生式右部末尾)。

消除翻译模式的左递归

在这里插入图片描述

原先,是递归计算儿子节点的综合属性,再返回计算自身的综合属性;修改后增加非终结符R,通过层层计算继承属性R.i,再通过综合属性R.s传回来。

reference
山东大学编译原理郑艳伟老师ppt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

u小鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值