编译原理学习手记(1)– 代码生成(updating)

2012 年 12 月 26 日

代码生成原理在何炎祥教授的编译原理书(《编译原理》第三版,华中科技大学出版社)上是第12章,可以认为是理论说明的最后一章,后面两章分别是讲LEX和YACC这两个经典工具的使用,我们反过来阅读,是为了从目标出发,每一步都接近结果。

假想的计算机模型:

给一个表达式:

基于上述假想指令集, 我们应该输出怎样的代码呢?
出于简化,我们直接用12.5中提到的逆波兰式来生成,注意,我们直接把元数放在运算符后面,这样出现单双目同时出现的情况也能够很容易处理。
也就是:
我们要做三步操作:
1) 把上述代码按词组分开,由于输入已经是逆波兰式,只需要按空白分开即可。
2) 用gen(操作符,操作数)生成每一步运算的代码,必要的时候新增临时变量(操作数可以为空,对应一元的情况)
   a) 对于输入的列表的每一个,将元素入栈
   b) 如果这是一个可以调用的对象(运算符),按照其定义出栈参数,生成代码,因为第一个参数总是累加器ACC,而总是生成一个临时对象,临时对象入栈,所以写法上很简单(gen_insns)。我们总是固定一个流程:
    i.  gen(‘LD’, 参数1)
    ii. gen(‘运算’, 参数2)或者gen(‘运算’)
    iii.gen(‘ST’, 结果地址)
3) 适当优化和重定位变量的符号地址。

结果:

 

 

 

 

 

#编译原理

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*