编译原理——S属性文法实现自下而上的计算进而完成SDT

编译原理——S属性文法实现自下而上的计算进而完成SDT

首先要明确的是,如果一个S-SDD的基本文法可以使用LR分析技术,那么它的SDT可以在LR(SLR)语法分析过程中实现。

其中S-SDD就是具有S属性的语法指导定义,SDT就是相应的语法制导的翻译方案。所有的语法翻译的应用都可以由语法制导的翻译方案实现。

S属性定义的SDT实现

对于S-属性文法自下而上计算,我举个栗子:

对于一个S基本文法(只有综合属性)如下,中间是他的语义动作,右边是语义动作对应的栈操作。

在这里插入图片描述

下面是这个文法的SLR自动机,有了这个自动机,我们在进行规约时才有理可据。

SLR自动机

在这里插入图片描述

简单来说一下这个自动机的生成方式:

首先I0是初始状态及其推导出的等价状态组成的项目集闭包,可以看出来这个文法是含有左递归的,但是不妨碍它是一个SLR文法。

然后若输入E,那么将会进入状态I1,输入T进入状态I2,输入F进入状态I3,输入(进入状态I4,输入digit进入状态I5,以此类推…

现在我们假设输入的符号串为3*5+4

当I0状态遇到digit 3之后,会进入5号状态,于是符号d(对应的val属性为3)以及状态5进栈。从自动机中可以看到的是,5号状态必须要进行规约为F,由于F的属性值就等于d的属性值,所以F的val属性不需要做任何改变。并且d和5号状态出栈,F进栈。

在这里插入图片描述

在这里插入图片描述

当0号状态遇到F时需要进入3号状态(根据SLR自动机),所以3号状态进栈
在这里插入图片描述

巧了,3号状态也是一个规约状态,T->F,F规约为T,那么T的val属性等于F的val属性,和上面同理,F和3号状态出栈,T进栈

在这里插入图片描述

接下来0号状态遇到T进入2号状态

在这里插入图片描述
由于2号状态遇到接下来的号进入7号状态,所以*和7号状态入栈,同时因为没有val属性值,所以为空:
在这里插入图片描述
接下来,7号状态遇到一个digit符号5进入采取一个移进动作,也就是进入5号状态,所以d和5号状态入栈
在这里插入图片描述
随后又是老样子了,5号状态是一个规约状态,所以5和d出栈,规约为F,并且F的val属性是5,7号状态遇到F要进入10号状态
在这里插入图片描述
10号状态是一个规约状态,TF规约为T,并且根据相应的栈操作,规约出来的T处于新栈顶,其位置是top-2(目前的F是top),T的val属性等于T和F相乘(35).并且2,7,10号状态出栈。0号状态遇到新规约出来的T状态进入2号状态。
在这里插入图片描述
随后,2号状态的T遇到+号,由于+号在E的follow集中,那么采取把T规约为E的动作,并且2号状态出栈,E的val属性等于T的val属性,0号状态遇到新规约出来的E进入1号状态。

在这里插入图片描述
1号状态遇到下一个输入符号+号采取移进动作进入6号状态,即6号状态和+号进栈(只有当移进动作时才将符号入栈)。随后6号状态遇到下一个输入符号digit 4,应该采取移进动作进入状态5。相应的符号进栈(5和d),
并且

在这里插入图片描述
最后就应该指向$符号了,5号状态的d首先进行规约操作变成F(同时5号状态出栈),随后6号状态遇到F进入3号状态。
在这里插入图片描述

3号状态也是个规约状态($是T的follow集中的元素),和上面进行类似的操作,得到:
在这里插入图片描述
9号状态遇到$符号会采取规约动作,将E+T规约为E,新规约出来的E的val属性等于15+4=19,同时1,6,9,E,+,T全部出栈新规约出的E进栈。并且0号状态遇到E进入1号状态
在这里插入图片描述

1号状态遇到$符号采取规约操作,将E规约为开始符号E`,代表着这个句子成功接收。最后得到文法开始符号E`的语义属性val就是19。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

时光诺言

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

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

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

打赏作者

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

抵扣说明:

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

余额充值