编译原理中间代码生成c语言,编译原理知识回顾——中间代码生成

学完编译原理已经一年了,也有半年被因为学其他东西而没空继续深入学习编译原理。

现在终于有机会继续学习了。

首先回顾下,编译原理考试第一题的答案。就是翻译的步骤。

a1a23ad77f1a28af9db7c514b2cb6655.png

对于编译,第一步是词法分析。也就是分出一个个Token。

例如,像一行赋值语句:a[index] = 4 + 2 ,我们可以将其拆成一个个基本元素,每种元素都有自己的类型。如下所示:

74b2355865c54f40f02cca8c97c87947.png

这些Token将作为编译过程中最基本的元素。

标识符(identifier) a, index

左方括号(left bracket) [

右方括号(right bracket) ]

等号(assignment) =

加号(plus) +

数字(number) 4, 2

当这些Token它们组合在一起,就成了句子。在这个时候,我们就可以进行语法分析了。

我们可以将其组织成一棵抽象的语法树。根节点就是抽象的表达式,因为这个一句话就是一个表达式。然后可以分割为赋值表达式的3个元素,然后逐级分割,到了叶子就是基本的词法单元Token了。

9e8d28e087eb67a2253b8843d063125f.png

在做完语法分析后,我们就要进行语义分析。为什么要语义分析呢?我们要根据语义来标记这棵语法树,让其变成标记树,然后才好根据这棵树生成中间代码。

4c9063c8e29d2aa249c233dd8d3f0425.png

通常,我们的中间代码都是一种三地址码。可以理解为只有三个变量以内的表达式。

02b377a9bba903c49f4c1ba33dbeadbb.png

对于三地址码,我们可以进行代码优化,例如想上述的代码可以优化成:

635c1812e32be01ac435a67a9d478646.png

对于优化后的中间代码,我们可以方便的将其翻译成汇编代码。

我们假设变量a的类型是占4个字节。于是可以翻译成下述汇编

63af10dea8ccbdde51b50bbe50418571.png

于是关于代码生成的部分就完成了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值