文章目录

  • 概念
    • 语法制导翻译的基本思想
    • SDD && SDT
    • 语义规则
    • 文法属性(S,L)
    • SDD
    • 注释分析树(注释语法树)
    • 副作用
    • 抽象语法树( AST )
    • SDD的实现方法
    • SDT
  • 子问题
    • 语法和语义的区别
    • 应用SDD生成抽象语法树AST
    • S属性的SDT
    • L属性的SDT
      • 通用实现方法(不和语法分析同步进行))
      • L属性定义的LL分析实现
      • L属性定义的递归下降实现
      • L属性定义的LR分析实现

概念

语法制导翻译的基本思想


在语法分析基础上边分析边翻译

  • 翻译的依据:语义规则或语义子程序
  • 翻译的结果:相应的中间代码
  • 翻译的做法:为每个产生式配置相应的语义子程序,每当使用某 个产生式进行规约或推导时,就调用语义子程序,完成一部分翻 译工作
  • 语法分析完成时,翻译工作也告结束

SDD && SDT

  • 语法制导定义 Syntax-Directed Definitions(SDD

    • 将文法符号和某些属性相关联 规则与产生式相关联
    • 并通过语义规则来描述如何计算属性的值 E→E1+TE.val=E1.val+T.valE →E1+T E.val=E1.val + T.valE→E1+TE.val=E1.val+T.val
  • 语法制导的翻译方案 Syntax-Directed Translation Scheme(SDT

    • 在产生式体中加入语义动作,并在适当的时候执行这些语义动作
    • E→E1+T{E.val=E1.val+T.val;}E → E1+T \{E.val=E1.val + T.val;\}E→E1+T{E.val=E1.val+T.val;}

语义规则

  • 描述一个产生式所对应的翻译工作,如:

    • 改变某些变量的值;
    • 填/查各种符号表;
    • 发现并报告源程序错误;
    • 产 生中间代码
  • 决定于翻译的目的,例如:产生什么样的中间代码

文法属性(S,L)

  • 综合属性:
    分析树节点N上的非终结符的综合属性只能通过该节点或子节点的属性来定义。

    终结符可以具有综合属性,值由词法分析器提供。

  • 继承属性
    分析树节点N上的非终结符的继承属性只能通过该节点或父节点或兄弟节点的属性来定义。

    终结符没有继承属性

SDD

  • 只包含综合属性的SDD称为S属性的SDD
  • 含有继承属性的SDD

在对SDD的求值过程中,如果结点N的属性a依赖于结点M1的属性a1, M2的属性a2,…。那么我们必须先计算出Mi的属性,才能计算N的 属性a , 使用依赖图来表示计算顺序

L属性的SDD
每个属性 要么是综合属性(S属性SDD属于L属性SDD) , 要么是继承属性。 且产生式A → X1X2…Xn中计算Xi.a的规则只能使用:

  • A的继承属性
  • Xi左边的文法符号Xj的继承属性或综合属性
  • Xi自身的继承或综合属性,且这些属性之间的依赖关系不形成环

注释分析树(注释语法树)

副作用

  • 一个没有副作用的SDD称为属性文法,一个属性文法的规则仅 通过其他属性值和常量值来计算另一个属性值
  • 引入副作用可以带来一些方便,比如语法分析时如果没有副作用,标识符表就必须作为属性传递 –,可以把标识符表作为全局变量,然后通过副作用函数来添加新标识符
  • 受控的副作用 – 不会对属性求值产生约束,即可以按照任何拓扑顺序求值,不会影响 最终结果 – 或者对求值过程添加简单的约束

抽象语法树( AST )

语法树是分析树的浓缩表示:算符和关键字是作为内部结点
语法制导翻译可以基于分析树,也可以基于语法树

抽象语法树

  • 每个结点代表一个语法结构;对应于一个运算符
  • 结点的每个子结点代表其子结构;对应于运算分量
  • 可以忽略掉一些标点符号等非本质的东西

抽象语法树的表示方法

  • 每个结点用一个对象表示,对象有多个域
  • Leaf(op, val)创造一个叶子对象,返回一个指向叶子结点对应新记录的指针
  • Node(op, c1, c2, …, ck),其中c1-ck为子结点

SDD的实现方法

最通用的实现是先分析得到语法树再翻译,一个更方便但是有局限性的做法是边分析边翻译。

SDT

实现SDT时,实际上并不会真的构造语法分析树,而是在分析过程中 执行语义动作
我们主要关注用SDT实现以下两类重要的SDD

  1. 基本文法是LR的,且SDD是S属性的 (最简单的情况)
  2. 基本文法是LL的,且SDD是L属性的 (generalized)

对于第一种,直接在产生式右部添加语义动作即可,这样在规约的时候计算LHS的综合属性。

产生式内部带有语义动作的SDT

  • 动作左边的所有符号(以及动作)处理完成后,就立刻执行这个动作

    • B → X{a}Y
    • 自底向上分析时,在X出现在栈顶时执行动作a
    • 自顶向下分析时,在试图展开Y或者在输入中检测到Y的时刻执行a

这个的实际实现方式是:1. 增加一个特殊的终结符M, 增加产生式和语义动作 M⟶ϵ{a}M\longrightarrow\epsilon\ \ \ \{a\}M⟶ϵ   {a} 也就是说,增加中部的语义动作会引入空产生式,从而导致新的冲突

子问题

语法和语义的区别

 在CFG中,语法正确只是指这个句子结构正确,仅仅是一个局部的概念,是没有考虑上下文的。比如a[0] = f(4);这个语句语法是正确的,因为存在一个语法结构可以匹配这个语句。然而这个语句是否真的正确还要看两点:a是否是数组或指针,f的参数是否匹配。而这两点信息只能通过上下文获取,也就是它们的**语义*。*

 不同的符号有不同的语义类型,比如上面的a是变量,语义至少有:值和类型。f是函数语义至少有:函数指针,返回类型,参数。

应用SDD生成抽象语法树AST

例:

S属性的SDT

由于S属性的计算顺序与对语法树的后序遍历顺序相同,所以S属性的SDD可以构造出后缀 SDT。有两种实现方案:

  • 在递归的预测分析过程中进行语义翻译
  • 在LR分析过程中进行语义翻译

L属性的SDT

使用内部含有语义动作的SDT,实现这样的SDT可以采用通用的方法:先构造分析树,再遍历。也可能可以使用翻译与语法分析同步的方式:

  1. 在递归的预测分析过程中进行语义翻译
  2. 在LL分析过程中进行语义翻译
  3. 在LR分析过程中进行语义翻译
  • 首先把SDD转换成内部含有语义动作的SDT

  • 语义动作的执行时机
    • B → X{a}Y
    • 自底向上分析时,在X出现在栈顶时执行动作a
    • 自顶向下分析时,在试图展开Y或者在输入中检测到Y的时刻执行a

通用实现方法(不和语法分析同步进行))

步骤:

  • 忽略语义动作,对输入进行语法分析,产生一个语法分析树
  • 检查每个内部结点N,如果产生式为A⟶αA\longrightarrow αA⟶α,将α中各个动作当做 N的附加子结点加入,使得N的子结点从左到右和α中符号及动作 完全一致
  • 对分析树进行前序遍历,在访问虚拟结点时执行相应动作

L属性定义的LL分析实现

PPT137-145

L属性定义的递归下降实现

首先看一下递归下降的语法分析

然后对它推广到翻译方案的实现

L属性定义的LR分析实现

PPT158-179

编译原理-语法制导翻译相关推荐

  1. 编译原理—语法制导翻译、S属性、L属性、自上而下、自下而上计算

    编译原理-语法制导翻译.S属性.L属性.自上而下.自下而上计算 1.语法制导翻译 1.1属性文法 1.2算术表达式的计数器 1.3属性的分类 1.4属性依赖图 继承属性的计算 1.5语义规则的计算方法 ...

  2. 编译原理 -- 语法制导翻译

    语法制导翻译 语法制导翻译是通过向一个文法的产生式附加一些规则或程序片段而得到的. 语法制导翻译的两个概念 下面是与语法制导翻译相关的两个概念: 属性(attribute) : 表示与某个程序构造相关 ...

  3. 编译原理——语法制导翻译并产生中间代码(布尔表达式和控制语句)

    语法制导翻译并产生中间代码: 概述: 语法分析之后,编译的任务是由已识别成功的正确源程序生成一组规格一致,便于计算加工的指令形式. 中间代码的生成方法: 语法制导翻译,属性文法制导翻译 中间代码: 不 ...

  4. 编译原理-语法制导翻译、后缀表达式、三元、四元

    此时的每条规则后面会对应一条语义动作,即制导翻译. 一.中间语言 中间语言就是和源程序等价的一种编码方式,复杂性也是介于源程序和机器语言中间. 为什么要中间语言? 我们经常可能会遇到过代码优化的选项, ...

  5. 编译原理-语法制导翻译 课后习题+笔记

    语法制导翻译 来源:龙书(厚),南大课后作业 p198 5.1.2 注:对以n为结尾标记的表达式求值 Answer E,T:表达式(也可看做一个数) E':后+一个表达式 T':后*一个表达式 F:因 ...

  6. 编译原理——语法制导翻译并产生中间代码(while,复合语句和过程调用语句的翻译)

    while,复合语句和过程调用语句的翻译 while: S的chain可以理解为回填while语句之后的第一个四元式,对于之前的if--else也可以这样理解 W的语义子程序需要保留四元式号,Wd需要 ...

  7. 【最新合集】编译原理习题(含答案)_8-10语法制导翻译_MOOC慕课 哈工大陈鄞

    [最新合集]MOOC哈工大陈鄞 编译原理答案全集-->传送门 1 文法G[S]及其语法制导翻译定义如下: 产生式 语义动作 S' → S print( S.num) S → ( L) S.num ...

  8. 编译原理学习笔记 5.1 翻译文法和语法制导翻译

    前言 参考课上PPT内容. 该学习笔记目前仅打算个人使用. 后续会进一步整理,包括添加笔记内容,标明参考资料. 更新中... 跳过目录 目录 导言 一.翻译文法和语法制导翻译 输入文法 翻译文法 活动 ...

  9. 三万五千字长文!让你懂透编译原理(六)——第六章 属性文法和语法制导翻译

    三万五千字长文!让你懂透编译原理(六)--第六章 属性文法和语法制导翻译 长文预警 系列文章传送门: 万字长文+独家思维导图!让你懂透编译原理(一)--第一章 引论 万字长文!让你懂透编译原理(二)- ...

最新文章

  1. float与double的范围和精度
  2. 在Filter 无法跳转地址
  3. java常见_Java 常用类
  4. linux下更换pip源
  5. MySql轻松入门系列——第一站 从源码角度轻松认识mysql整体框架图
  6. Unity3D_(游戏)2D坦克大战 像素版
  7. 前端学习(1958)vue之电商管理系统电商系统之参数管理
  8. ffmpeg命令 抓屏_使用FFmpeg从视频中截图的命令 | 学步园
  9. 奥赛金牌计算机博士中学老师,博士教师从6人到27人 硕士教师从103人到190人 石室中学“十四五”规划立下十个flag...
  10. 将Notepad++配置为Ruby编译器
  11. 蓝桥杯 基础练习 查找整数
  12. 统计某个字符串中指定字符串出现的次数
  13. SpringMVC_02
  14. Oracle 单实例 迁移到 RAC 实例 -- 使用RMAN 异机恢复
  15. CTF---Web入门第二题 上传绕过
  16. 机器学习特征与类型概述
  17. 俄罗斯方块c语言代码及注释,俄罗斯方块C语言代码
  18. 计算机系统概论(原书第2版)部分课后习题答案(第三章)
  19. 征途完美单机版_征途单机版下载-征途单机版最新官方版-Minecraft中文分享站
  20. 在 Parallels Desktop 中,全屏模式使用 Win7,唤醒时黑屏

热门文章

  1. 华为三层交换机5700系列配置示例
  2. 微信运动如何读取小米手环的数据
  3. The ip address is being used by a static-MAC user
  4. 多CPU和多核CPU对应多进程和多线程调度
  5. 判断鼠标滑轮滚动事件
  6. Flask框架基础入门教程
  7. 报错:RuntimeError: expected scalar type Double but found Float
  8. 微信聊天记录删除了怎么恢复?最简单快捷的恢复方式看这里
  9. css筋斗云,JavaScript实现精美个性导航栏筋斗云效果
  10. 技术人生:故事之八 OFFICE是软件打字机?