本次笔记内容:
5-7 在递归预测过程中进行翻译
5-8 L属性定义的自底向上翻译

本节课幻灯片,见于我的 GitHub 仓库:第10讲 语法制导翻译_3

文章目录

  • 在递归的预测分析过程中进行翻译
    • 算法
  • L-属性定义的自底向上翻译
    • 将语义动作改写为可执行的栈操作
    • 总结

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


如上,先来考虑SDT的非终结符 T’ ,上图右侧为 T’ 对应的扩展后的函数,其中:

  • 黑色字体部分,表示原有的语法分析器中 T' 对应的过程
  • 蓝色的就是扩展之后的部分。

为每个非终结符A构造一个函数,A的每个继承属性对应该函数的一个形参,函数的返回值是A的综合属性值。

对出现在A产生式右部中的每个文法符号的每个属性都设置一个局部变量

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



如上,是分析器对应的主函数。T有一个综合属性val,因此,为T的val声明一个局部变量 Tval ,并且将函数的返回值赋给这个局部变量。

算法

  • 为每个非终结符A构造一个函数,A的每个继承属性对应该函数的一个形参,函数的返回值是A的综合属性值。对出现在A产生式中的每个文法符号的每个属性都设置一个局部变量
  • 非终结符A的代码根据当前的输入决定使用哪个产生式;
  • 与每个产生式有关的代码执行如下动作:从左到右考虑产生式右部的词法单元、非终结符及语义动作:
    • 对于带有综合属性x的词法单元X,把x的值保存在局部变量X.x中;然后产生一个匹配X的调用,并继续输入;
    • 对于非终结符B,产生一个右部带有函数调用的赋值语句c := B(b1 , b2 , …, bk),其中, b1 , b2 , …, bk是代表B的继承属性的变量,c是代表B的综合属性的变量;
    • 对于每个动作,将其代码复制到语法分析器,并把对属性的引用改为对相应变量的引用。

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

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


如上,在这个SDT中,有两个蓝色的内嵌的语义动作,导致无法自底向上翻译,因此要修改。

因此我们使用标记非终结符。做了两个空产生式M与N。

修改后的SDT,所有语义动作都位于产生式末尾。

无需担心“访问未出现在该产生式中的符号的属性?”的问题,这些属性将出现在必要的位置。

如上,我们构造了自动机。输入 3 * 5

栈底标记 $

I0 遇到 digit ,采取移入动作,并且进入状态I3。

移入动作完成后,输入指针指向 *。由 I3 知,遇到 * 采取归约动作,应用第 4 个产生式进行归约。

因为 F 的属性值等于 digit 的属性值,因此,栈底的属性值字段保持不变。因此, d 出栈,F进栈。

I0遇到F,进入I2。

当前输入符号位 * ,采取归约动作,将 M 进栈。M 根据归约动作,可以看出,M 的属性值为 F 的属性值。而在产生式 1 中,F 是 M 的左兄弟。正好与栈中情况符合。

因此 M 的属性值为 3 。M在产生式中的任务为计算 T’ 的继承属性值,因此记为 T’inh = 3 。

I2遇到M,进入状态I4;I4遇到 * ,进入状态 I6 ,采取移入动作;指针后移,指向 5 。

而 I6 遇到数字 ,则进入状态 I3 ,且采取移入动作。指针后移,指向 $

I3 遇到 $ 采取归约动作,使用产生式 4 。

根据归约动作,栈顶的属性值保持不变,d出栈,F进栈。

I6遇到 F ,进入 I7 。I7 遇到 N 时,要稍微复杂一些:

  • N.i1 = T’.inh ,但是T’.inh 现在在哪呢?
  • 我们知道,*FNT1'最终将被归约为 T' ,因此T'的继承属性值就存放在分析栈中,*左边的位置(仅靠在T’之下的,标记非终结符对应的记录中),即M所在的位置;
  • 因此,我们将 3 与 5 相乘,把得到的值 15 赋给 N 的综合属性;
  • N 在产生式中位于 T1’ 左侧,任务就是计算 T1’ 的继承属性,N的属性是 T1’ 的继承属性值 inh 的值,因此记为 T1’.inh = 15。

I7 遇到 N 进入 I8 。I8 遇到 $ ,将采取归约动作,T’ 将进栈。

由产生式3,T’ 的综合属性值等于其继承属性值。

T'的继承属性值,是由产生式中仅靠在 T' 左侧的标记非终结符对应的动作来计算的。因此,T' 的继承属性值,就存放在分析栈中,仅靠在 T' 之下的,标记非终结符对应的记录,因此 T' 此时就在栈顶。

因此将 T1'inh=15的值赋给 T’ ,T’ 的综合属性值 syn 等于 15。

I8 遇到 T’ ,进入 I9 。

当输入符号为 $ ,采取归约动作,*FNT' 出栈,T' 入栈,且其属性值为 T1'.syn (由产生式得)。

I4 遇到 T5,进入 I5 。进行归约动作。

1号状态是接收状态,完毕。

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

总结

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

  • 首先构造SDT,在各个非终结符之前放置语义动作来计算它的继承属性,并在产生式后端放置语义动作计算综合属性
  • 对每个内嵌的语义动作,向文法中引入一个标记非终结符来替换它。每个这样的位置都有一个不同的标记,并且对于任意一个标记M都有一个产生
    M→ε
  • 如果标记非终结符M在某个产生式A→α{a}β中替换了语义动作a,对a进行修改得到a’ ,并且将a’关联到M→ε 上。动作a’
    • (a) 将动作a需要的A或α中符号的任何属性作为M的继承属性进行复制
    • (b) 按照a中的方法计算各个属性,但是将计算得到的这些属性作为M的综合属性

【编译原理笔记10】语法制导翻译:在递归预测过程中进行翻译,L属性定义的自底向上翻译相关推荐

  1. 编译原理--语法制导的翻译

    前言 把一些属性附加到代表语言构造的文法符号上, 以把信息和一个语言的构造联系起来. 通过语义规则来说明文法符号的属性值如何确定. 产生式 语义规则 E -> E_{1} + T E.code ...

  2. 编译原理教程_7 语法制导的语义计算

    文章原稿 https://gitee.com/fakerlove/fundamentals-of-compiling 文章目录 7. 语法制导的语义计算 7.1 基本概念 1) 属性文法 2)两种属性 ...

  3. 【编译原理笔记08】语法制导翻译:语法制导定义,SSD的求值顺序,S属性定义与L属性定义

    本次笔记内容: 5-1 语法制导翻译概述 5-2 语法制导定义 5-3 SSD的求值顺序 5-4 S属性定义与L属性定义 本节课幻灯片,见于我的 GitHub 仓库:第8讲 语法制导翻译_1 文章目录 ...

  4. 【编译原理笔记12】中间代码生成:简单赋值语句的翻译,数组引用的翻译

    本次笔记内容: 6-3 简单赋值语句的翻译 6-4 数组引用的翻译 本节课幻灯片,见于我的 GitHub 仓库:第12讲 中间代码生成_2.pdf 文章目录 简单赋值语句的翻译 赋值语句翻译的任务 赋 ...

  5. 编译原理笔记(二)之词法分析

    编译原理笔记(二)之词法分析 1. 词法分析中的若干问题 1.1 基本概念 1.2 记号的属性 1.3 词法分析器的作用与工作方式 1.4 输入缓冲区 2. 模式的形式化描述 2.1 字符串与语言 2 ...

  6. zucc 编译原理 笔记

    zucc 编译原理 笔记 lec02 lec03 lec04

  7. 编译原理实验-LL1语法分析器(自动生成First集、Follow集求法)java实现

    编译原理实验-LL1语法分析器(自动生成First.Follow)java 博主在做实验时,参考众多他人代码,发现bug众多,在@moni_mm代码基础上,与伙伴把能看到的BUG都做出修正,同时增添了 ...

  8. 【编译原理笔记09】语法制导翻译:语法制导翻译方案,在非递归的预测分析过程中进行翻译

    本次笔记内容: 5-5 语法制导翻译方案 5-6 在非递归的预测分析过程中进行翻译 本节课幻灯片,见于我的 GitHub 仓库:第9讲 语法制导翻译_2 文章目录 语法制导翻译方案 语法制导翻译方案 ...

  9. 【编译原理笔记11】中间代码生成:类型表达式,声明语句的翻译

    本次笔记内容: 6-1 类型表达式 6-2 声明语句的翻译 本节课幻灯片,见于我的 GitHub 仓库:第11讲 中间代码生成_1.pdf 文章目录 类型表达式 Type Expression 举例 ...

最新文章

  1. linux shell cgi post,linux下shell处理cgi的方法--post get
  2. 剑指Offer_14_链表中倒数第k个结点
  3. Java 注解 Annotation
  4. Oracle 11g 数据统计量Pending处理
  5. 环美亚二十年装修师傅分享,甲醛的八种来源
  6. 使用PPMI改进共现矩阵
  7. 接口测试 Seldom 2.0 - 让接口自动化测试更简单
  8. PHP 判断变量是否定义、是否为空、是否为真
  9. 计算机图形学完整笔记(八):曲线曲面 - 2
  10. 赤兔oracle恢复软件 收费,赤兔Oracle数据库恢复软件下载
  11. assume用法及意思_assume的用法和例句
  12. Low Power概念介绍Level Shifter
  13. 使用chrome console检查css selector/xpath的有效性|百度云盘如何获取文件库中的目录文字
  14. MAC强制卸载软件 如遇“不能修改或删除“*”,因为macOS需要它”
  15. e01文件镜像SHA1值
  16. 分享一下支付宝的支付(soEasy)
  17. AutoLeaders控制组——C51单片机学习笔记--定时器串口通信LED点阵屏
  18. 逆向脱壳-fsg手动脱壳
  19. c语言编程等边三角形代码,C语言中 正 倒等边三角形的代码
  20. 【vpn异地组网专题】linux(centos7)安装 PPTP服务器

热门文章

  1. 【Hive】数据导入方法
  2. 【Python-2.7】如何判断对象是否为可迭代?
  3. C#进行Post请求(解决url过长的问题)
  4. Safe handle has been closed异常的原因及解决思路
  5. python异常处理与导入模块与导入包
  6. 【转】No JVM could be found on your system解决方法
  7. code blocks无法输出中文解决方法
  8. 如何检查Django版本
  9. SCSS和Sass有什么区别?
  10. 让现有的Git分支跟踪一个远程分支?