总结:编译原理--第六章 中间代码生成

第六章  中间代码生成

本章中介绍的技术可以被综合起来,构造一个简单的编译器前端。编译器的前端可以增量式地进行构造:

  • 选择一个中间表示形式:中间表示形式通常是一个图形表示方法和三地址代码的组合。
  • 翻译表达式:带有复杂运算的表达式可以被分解为一个由单一运算组成的序列。
  • 检查类型:自动类型转换是指隐式的类型转换,例如从 integer 转换到 float 。中间代码中还包含了显式的类型转换,以保证运算分量的类型和运算符的期待类型精确匹配。
  • 使用符号表来实现声明:一个声明指定了一个名字的类型。一个类型的宽度是指存放该类型的变量所需要的存储空间。使用宽度,一个变量在运行时刻的相对地址可以计算为相对于某个数据区域的开始地址的偏移量。每个声明都会将一个名字的类型和相对地址放入符号表,这样当这个名字后来出现在一个表达式中时,翻译器就可以获取这些信息。
  • 将数组扁平化:为实现快速访问,数组元素被存放在一段连续的空间内。数组的数组可以被扁平化,当作各个元素的一维数组进行处理。数组的类型用于计算一个数组元素相对于数组基地址的偏移量。
  • 为布尔表达式产生跳转代码:在短路代码中,布尔表达式的值被隐含在代码所到达的位置中。因为布尔表达式 B 常常被用于决定控制流,例如在 if (B)S 中就是这样,因此跳转指令是有用的。只要使得程序正确地跳转到代码 t = true 或 t = false 处,就可以计算出布尔值,其中的 t 是一个临时变量。使用跳转标号,通过继承对应于一个布尔表达式的真假出口的标号,就可以对布尔表达式进行翻译。常量 true 和 false 分别被翻译成跳转到真值出口和假值出口的指令。
  • 用控制流实现语句:通过继承 next 标号就可以实现语句的翻译,其中 next 标记了这个语句的代码之后的第一条指令。翻译条件语句 S ifBS1时,只需要将一个标记了 S1 的代码起始位置的新标号和 S. next 分别作为 B 的真值出口和假值出口传递给其他处理程序。
  • 可以选择使用回填技术:回填是一种为布尔表达式和语句进行一趟式代码生成技术。其基本思想是维护多个由不完整跳转指令组成的列表,在同一列表中的指令具有同样的跳转目标。当目标位置已知时,将为相应列表中的所有指令填入这个目标。
  • 实现纪录:纪录或类中的字段名可以当作声明序列进行处理。一个纪录类型包含了关于它的各个域的类型和相对地址的信息。可以使用一个符号表对象来实现这个目的。

希望我的总结可以帮助大家,感谢阅读我的博客!

猜你喜欢

转载自blog.csdn.net/weixin_42558631/article/details/81235243
今日推荐