编译原理--中间代码生成(自己看)

  • 高级语言 翻译成 LLVM虚拟机代码
  • 可以移植到各种平台

课上要求 能够根据给定方案翻译得到结果即可


难点:实现一遍扫描

目标:转换为三地址语句

如:
编译原理--中间代码生成(自己看)_第1张图片

常用三地址语句

编译原理--中间代码生成(自己看)_第2张图片
编译原理--中间代码生成(自己看)_第3张图片

声明语句的翻译过程

  • 有翻译方案如下(三元式

  • 编译原理--中间代码生成(自己看)_第4张图片

  • 要求翻译

  • 在这里插入图片描述

  • 过程

  • 1、画出注释分析树,如下

  • 编译原理--中间代码生成(自己看)_第5张图片

  • 易于发现,本次分析为综合属性分析,可以自底向上分析

  • 加入属性

  • 编译原理--中间代码生成(自己看)_第6张图片

  • 所以顺序是:

  • 编译原理--中间代码生成(自己看)_第7张图片

案例2

  • 产生式和语义描述
  • 编译原理--中间代码生成(自己看)_第8张图片
  • 编译原理--中间代码生成(自己看)_第9张图片
  • 要求:
  • 在这里插入图片描述
  • 结果为(过程应为:画注释分析树—属性赋值—得到结果):
  • 编译原理--中间代码生成(自己看)_第10张图片
  • 类似过程:
  • 编译原理--中间代码生成(自己看)_第11张图片



1、布尔表达式的翻译(选择)(记得先画语法分析树

  • 形式如下(简单版本): relop关系运算符
  • 编译原理--中间代码生成(自己看)_第12张图片
  • 复杂版本
  • 编译原理--中间代码生成(自己看)_第13张图片
  • 画出语法树
  • 编译原理--中间代码生成(自己看)_第14张图片
  • 根据箭头运行翻译分析(a1 到 a2 到 a3 到 a4 ),得到翻译结果如下:
  • 编译原理--中间代码生成(自己看)_第15张图片
    例题:
    编译原理--中间代码生成(自己看)_第16张图片



2、控制语句的翻译(循环)

  • 编译原理--中间代码生成(自己看)_第17张图片

回填技术(Backpatching)

  • 编译原理--中间代码生成(自己看)_第18张图片
  • 实际上是语法树上加了一个M,用于标记节点(也不知道这个解释行不行
  • 搜到的解释是这样的,不知道能不能启发一下(看完例子后):
  • 和栈的使用一样,这也是一种非常巧妙的技巧。它把一个由跳转指令组成的列表以综合属性的形式进行传递。

回填技术–概念

  • 编译原理--中间代码生成(自己看)_第19张图片
  • 注:第四区段,就是填横线空值,填为t

案例

  • 在这里插入图片描述
  • 注释语法树:
  • 编译原理--中间代码生成(自己看)_第20张图片
  • 填属性流程按着我序号来,先接受,再分析吧,一开始问为什么,没啥用的。
  • 首先规定 nexquad = 100
  • 编译原理--中间代码生成(自己看)_第21张图片

  • 因为输出了两次(emit两次),nextquad + 2得到102
  • 编译原理--中间代码生成(自己看)_第22张图片
  • 一样的过程
  • 编译原理--中间代码生成(自己看)_第23张图片
  • 输出两次,nextquad+2
  • 编译原理--中间代码生成(自己看)_第24张图片
  • 不标序号了,一样的
  • 编译原理--中间代码生成(自己看)_第25张图片

开始关键的回填了,玄学max

  • 为什么?自底向上就好,都是综合属性哈,S属性!
  • 编译原理--中间代码生成(自己看)_第26张图片
  • 继续
  • 编译原理--中间代码生成(自己看)_第27张图片
  • 注意看最后的,结尾部分
  • 编译原理--中间代码生成(自己看)_第28张图片
  • 结果如下:
    编译原理--中间代码生成(自己看)_第29张图片
  • 本章节结束!!!!

你可能感兴趣的:(编译原理)