编译原理——中间代码的生成

1、选择中间表示:通常来说,中间表示是图形符号和三地址代码的组合。在语法树中,图形符号中的节点表示一个结构;节点的子代表它的子结构。三地址的名称来自x - y op z格式指令,并且每个指令最多有一个运算符。
2、翻译表达式:通过把动作加到E - > E \ op E2格式的每个产生式中,具有创建操作功能的表达式可以解除单个操作的顺序。该操作或者为E创建一个节点,节点为E \和E2作为子节点,或者生成一个三地址指令,将操作应用于E \和E2的地址,并将结果放入一个新的临时名称,这将成为E.的地址
3、检查类型:表达式E \ op E2的类型由op和E \和E2的类型决定。强制是隐式类型转换,例如从整数到浮点数。中间代码包含特殊类型转换,以确保操作数类型与操作预期类型之间的精确匹配。
4、使用符号表来实现声明:一个声明指定一个名称的类型。类型的宽度是该类型名称需要的存储量。使用宽度,在运行时,名称的相对地址可以计算为从数据区域开始的偏移量。名称的类型和相对地址通过声明被放入符号表中,因此当名称出现在表达式中时,翻译器可以随后获取它们。
5、生成Bool表达式的跳转代码:在短路或跳转代码中,Bool表达式的值隐含在代码所能运行到的位置。跳转代码是有用的,因为通常的情况下,Bool表达式B用于控制流程,如if(B)。布尔值可以通过跳转到t = true或t = false来计算,其中t是临时名称。使用跳转标签,布尔表达式可以通过继承与它的真和假出口相对应的标签来转换。常数true和false分别转换成true和false的退出。
6、使用控制流实现语句:语句可以通过继承下一个标签进行转换,其中下一个标记在这条语句的代码之后的第一条指令。可以通过加一个标记Si代码开头的新标签来转换条件S - > if(B)Si,并分别传递新标签和S.next的真假出口。
7、使用反向回传:回传是一种在一次遍历中生成Bool表达式和语句代码的技术。这个目的是维护不完整跳转的列表,其中列表中的所有跳转指令都具有相同的目标。当目标已知时,其列表上的所有指令都将通过填写目标完成。
8、实现记录:记录或类中的字段名称可以被看作一系列声明。记录类型对字段的类型和相对地址进行编码。符号表就是实现这个功能的。

你可能感兴趣的:(编译原理——中间代码的生成)