《教妹学编译原理》(五)语法制导(中)

hello大家好,教妹学编译原理,没见过这么酷炫的标题吧?“语不惊人死不休”,没错,标题就是这么酷炫。

我的妹妹小埋18岁,校园中女神一般的存在,成绩优异体育万能,个性温柔正直善良。然而,只有我知道,众人眼中光芒万丈的小埋,在过去是一个披着仓鼠斗篷,满地打滚,除了吃就是睡和玩的超级宅女。而这一切的转变,是从那一天晚上开始的。从此之后,小埋经常让我帮她辅导功课。

之前她想了解语法制导翻译。由于语法制导部分内容较多所以分成了三部分,上次她学习了语法制导的第一部分(点击复习):SDD( S-属性定义与L-属性定义)。今天我给她讲解学习语法制导翻译第二部分:SDD转换为SDT。本篇教程通过我与小埋的对话的方式来谈一谈如何将SDD转换为SDT

博客还在持续更新中,想看同系列的其他博客。欢迎访问我的专栏《教妹学编译原理》希望大家能够关注我,一起学编译原理。

SDT

语法制导翻译方案(SDT )是在产生式右部中嵌入了程序片段(称为语义动作)的CFG。
在这里插入图片描述

SDT可以看作是SDD的具体实施方案。

  • 基本文法可以使用LR分析技术,且SDD是S属性

  • 基本文法可以使用LL分析技术,且SDD是L属性

将S-SDD转换为SDT

将一个S-SDD转换为SDT的方法:将每个语义动作都放在产生式的最后
在这里插入图片描述

S-属性定义的SDT 实现

如果一个S-SDD的基本文法可以使用LR分析技术,那么它的SDT可以在LR语法分析过程中实现
在这里插入图片描述

扩展的LR语法分析栈
在这里插入图片描述

将语义动作中的抽象定义式改写成具体可执行的栈操作
在这里插入图片描述

例:在自底向上语法分析栈中实现桌面计算器
在这里插入图片描述
在这里插入图片描述

将L-SDD转换为SDT

  1. 将L-SDD转换为SDT的规则
  • 将计算某个非终结符号A的继承属性的动作插入到产生式右部中紧靠在A的本次出现之前的位置上

  • 将计算一个产生式左部符号的综合属性的动作放置在这个产生式右部的最右端
    在这里插入图片描述

  1. 如果一个L-SDD的基本文法可以使用LL分析技术,那么它的SDT可以在LL或LR语法分析过程中实现
    在这里插入图片描述

在非递归的预测分析过程中进行翻译

扩展语法分析栈

在这里插入图片描述

例子

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

分析栈中的每一个记录都对应着一段执行代码

  1. 综合记录出栈时,要将综合属性值复制给后面特定的语义动作

  2. 变量展开时(即变量本身的记录出栈时),如果其含有继承属性,则要将继承属性值复制给后面特定的语义动作

  3. 例子(SDT如下图)

1) T → F { a1} T′ {a2 }
2) T′→ *F {a3 } T1′ {a4 }
3) T′→ ε {a5 }
4) F → digit {a6 }

a1 : T′.inh = F.val
a2: T.val = T′.syn
a3: T1′.inh = T′.inh× F.val
a4 : T′.syn = T1′.syn
a5 : T′.syn = T′.inh
a6 : F.val = digit.lexval

T → F {a1:T′.inh=F.val} T′ {a2:T.val=T′.syn}对应的执行代码
在这里插入图片描述
'T′ → *F{a3:T1′.inh=T′.inh× F.val}T1′{a4:T′.syn=T1′.syn}对应的执行代码
在这里插入图片描述
T′ → ε {a5:T′.syn = T′.inh }对应的执行代码
在这里插入图片描述
F → digit {a6:F.val = digit.lexval}对应的执行代码
在这里插入图片描述

总结

咱们玩归玩,闹归闹,别拿学习开玩笑。

SDD转换为SDT可以分为两类:S-SDD的转换和L-SDD的转换。两者可以对比记忆。S-SDD使用LR分析技术,是自底向上的过程,构造SLR自动机,并扩展的LR语法分析栈。

L-SDD使用LL分析技术,扩展语法分析栈,是自顶向下的过程。L-SDD的分析方法有三种:在非递归的预测分析过程中进行语义翻译、在递归的预测分析过程中进行语义翻译和在LR分析过程中进行语义翻译。今天只介绍了非递归部分,其他两部分将在下篇进行讲解。

发布了117 篇原创文章 · 获赞 1306 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/JAck_chen0309/article/details/105046319