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、实现记录:记录或类中的字段名称可以被看作一系列声明。记录类型对字段的类型和相对地址进行编码。符号表就是实现这个功能的。
编译原理——中间代码的生成
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...
- Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...