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

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

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

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

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

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

  1. 为每个非终结符A构造一个函数, A的每个继承属性对应该函数的一个形参,函数的返回值是A的综合属性值。对出现在A产生式中的每个文法符号的每个属性都设置一个局部变量

  2. 非终结符A的代码根据当前的输入决定使用哪个产生式

  3. 与每个产生式有关的代码执行如下动作:从左到右考虑产生式右部的词法单元、非终结符及语义动作

  • 对于带有综合属性x的词法单元 X,把x的值保存在局部变量X.x中;然后产生一个匹配 X 的调用,并继续输入

  • 对于非终结符B,产生一个右部带有函数调用的赋值语句c := B(b1 , b2 , …, bk),其中, b1 , b2 , …, bk是代表B的继承属性的变量, c是代表B的综合属性的变量

  • 对于每个动作,将其代码复制到语法分析器,并把对属性的引用改为对相应变量的引用

在这里插入图片描述

L-属性定义的自底向上翻译

给定一个以LL文法为基础的L-SDD,可以修改这个文法,并在LR语法分析过程中计算这个新文法之上的SDD。

将语义动作改写为可执行的栈操作

例子

在这里插入图片描述

步骤

  1. 给定一个以LL文法为基础的L-属性定义,可以修改这个文法,并在LR语法分析过程中计算这个新文法之上的SDD。

  2. 首先构造SDT,在各个非终结符之前放置语义动作来计算它的继承属性,并在产生式后端放置语义动作计算综合属性

  3. **对每个内嵌的语义动作,向文法中引入一个标记非终结符来替换它。**每个这样的位置都有一个不同的标记,并且对于任意一个标记M都有一个产生式M→ε。
    在这里插入图片描述

  4. 如果标记非终结符M在某个产生式A→α{a}β中替换了语义动作a,对a进行修改得到a’ ,并且将a’关联到M→ε 上。动作a’:

  • (a) 将动作a需要的A或α中符号的任何属性作为M的继承属性进行复制

  • (b) 按照a中的方法计算各个属性,但是将计算得到的这些属性作为M的综合属性
    在这里插入图片描述

总结

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

SDD分为两类:S-SDD和L-SDD,S-SDD基本文法可以使用LR分析技术,L-SDD基本文法可以使用LL分析技术。 本篇博客中讲解的L-属性定义的自底向上翻译,是使用LR分析技术分L-属性定义的SDD

发布了129 篇原创文章 · 获赞 1793 · 访问量 31万+

猜你喜欢

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