此时的每条规则后面会对应一条语义动作,即制导翻译。

一、中间语言

中间语言就是和源程序等价的一种编码方式,复杂性也是介于源程序和机器语言中间。

为什么要中间语言?

我们经常可能会遇到过代码优化的选项,中间语言其中就有便于目标代码的优化以及便于目标代码的生成。后面会慢慢介绍到。

二、逆波兰式

逆波兰式也称后缀表达式

后缀表达式结合了栈对运算表达式进行了变换使之便于机器运算,它是无括号的表达式,在数据结构中我们也学习过。

①.后缀表达式可以根据优先级函数和栈来求,这是其中一种办法:

从左到右扫描运算表达式,如果是运算对象则直接出来,如果是运算符那么需要和栈中的运算符优先级进行比较,如果比栈中的高,那么入栈,否则先将栈中运算符出栈,然后再进行比较。

栈内<栈外:入栈操作符 
   栈内>栈外:出栈操作符 
   栈内=栈外:出栈 栈内的操作符,并入栈 栈外的操作符 
   遇到 ‘(’:直接入栈 
   遇到 ‘)’:出栈所有操作符直达遇到 ‘(’ ;

如果用栈,运算表达式首尾都加上终止符#,其优先级最低

比如a+b*c,我们知道*的优先级是大于+的。

先加终止符: #a+b*c#

#入栈,a,+优先级大于#所以入栈,b,*优先级大于+所以入栈,c,#优先级小于*所以*出栈,#优先级小于+所以+出栈,#遇到#结束。此时外面是ab*+即后缀表达式。

和我们的直观感觉一致:先求出优先级高的整体,想求整体,就得从优先级高的整体部分中的优先级低的部分开始算起。

②.老师还给了一种快速写出的办法:

在每个运算外面加上一对括号,然后将括号内的运算符提到括号外面,最后再去掉括号即可。

a+b*c     ------->  (a+(b*c))------>(a(bc)*)+   ------->abc*+

应用:上面说到语法制导翻译,就是在每条规则后面加上对应的语义动作,我们可以将语义动作写成后缀表达式的形式便于机器执行相应的语义动作。比如E->E+T  {E.code:=E.code+T.code}将大括号中的语义动作写成{E.code:=E.code T.code+}就会便于机器识别。

实例待填:——

三、三元式

一般形式(运算符,参数1,参数2)

a+b*c对应的三元式{

1.(*,b,c)

2.(+,a,1)

}

对于一目运算符,我们可以规定只用参数1


间接三元式

有时如果用三元式来表达,会发现有许多重复的部分但是却不能去掉。

所以间接三元式就有一个三元式表,表中的三元式不同。然后就是调用三元式表即可。

这样便于后面的代码优化和节省空间。


四、树形表示

如果一个运算表达式用树来表示,我们进行后序遍历,发现得到的就是后缀表达式。

表达式的三元式可以看成是树的直接表示

五、四元式表示

形式(运算符,参数1,参数2,运算结果)

可以看到,上面三元式的顺序是不能轻易改变的,引入临时变量可以更改四元式的相对位置,这样又能进一步方便代码优化。

编译原理-语法制导翻译、后缀表达式、三元、四元相关推荐

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

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

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

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

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

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

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

    文章目录 概念 语法制导翻译的基本思想 SDD && SDT 语义规则 文法属性(S,L) SDD 注释分析树(注释语法树) 副作用 抽象语法树( AST ) SDD的实现方法 SDT ...

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

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

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

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

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

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

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

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

  9. QQ浏览器HD iOS 动态化/热修复方案QBDF解释器-语法制导翻译与递归子程序设计(编译原理)(5)简书被冻结-搬运】

    原作时间:2019-2021年 此次共享,腾讯内网 / 外网同步发布. 内部代码地址:https://git.code.oa.com/fatboyli/QBDF 外部代码地址:GitHub - ven ...

最新文章

  1. pytest 9 pytest-datadir读取文件信息
  2. LeetCode Wiggle Subsequence(动态规划)
  3. MybatisPlus代码生成器配置
  4. C语言编程序输出SCHAR_MAX的,运用堆栈把十进制变换成二进制
  5. Python将list存为csv文件
  6. 第一章:OpenCV入门
  7. React开发(263):react中处理时间的判断
  8. Diango博客--16.稳定易用的 Django 分页库,完善分页功能(二)
  9. 函数在机器底层是如何实现的_软件机器人如何实现“二次录入”自动化,促进智慧政务?...
  10. jquery 让div滚动条自动滚动到最下面
  11. 利用Adobe AIR本地扩展支持Android开发
  12. 新员工不继续试用,这事怪谁?
  13. Python和Ruby语言对比
  14. JS导出excel 纯前端
  15. 2022年度GitHub中文Java项目排行榜Top 10
  16. 20190408-相速度和群速度、傅里叶变换与波动方程的色散关系、介电常数与电导、介电函数与折射率、散度定理、电子迁移率、电磁波波动方程、自由电子气的介电函数
  17. c语言 结构体 ppt,第8章C语言的结构体和共同体.ppt
  18. 谈下我曾经做过的一个心理健康管理系统
  19. 使用Qt开发中国象棋(三):走棋着法列表
  20. android HorizontalScrollView讲解

热门文章

  1. 倒计时1天 | 大势智慧2022新品发布会全面而来!
  2. 第五章 资本主义发展的历史进程
  3. 扫描文件转换成word软件
  4. Redis应用场景-排行榜
  5. 二维码和条形码简单实现
  6. YC2440+wiggler小板+H-JATG+PCI转并口卡开发环境的搭建
  7. 零基础手把手教你做FMEDA
  8. iOS_核心动画(二)
  9. 【内网安全-通讯上线】通讯上线基础知识
  10. sql查询包含某个字符_MySQL DBA基本知识点梳理和查询优化