编译原理与编译构造 Intermadiate Code Generation

来源:互联网 发布:磁选机选矿的数据分析 编辑:程序博客网 时间:2024/06/08 19:41

本文来自伟大的七米八同学。


先打一发广告,我这个博客一开始就是用于记录算法的学习过程的,后来干脆想着把课堂笔记也整理整理放上来。想想这学期快结束了,下学期开始又要开始学习算法啦。我是准备从0开始学习的,借助于高中生信息学竞赛的平台。欢迎各位各类同学加进来,笑着问我为什么刷那么慢,或者跟我一起从0开始。欢迎对照对边导航栏,对准“算法向”的“洛谷”查看进度,刷完这个之后会继续刷USACO。

群号是⑥⑥①⑨②2025,这是我设置的一道很低的门槛用来阻止广告的。入群的验证暗号是:我爱编译原理


中间代码表示形式

有两种

①三地址码

opcode,operand1,operand2,result

这是人用的方法,是中缀表达式,例:x=y+z

②四元组

这是机器用的方法,是前缀表达式

TAC(三地址码)

x=y op zx=op yx=ygoto L()If x relop y goto L()param xcall p,nreturn y

最后三行是函数,函数的好处是:①复杂程序更清晰,②共同逻辑代码重用,参数化

汇编中只有if,goto ,没有while,for

最简单的条件表达式: if(1) if(a) if(x relop y)

其中relop 表示关系运算符

对于连续空间的值处理,C语言引入了数组,有以下的形式其实都是与数组相关的:x=y[i]x[i]=yx=&yx=yx=y

其中的y 表示开始地址,i 表示偏移量

如下图所示:

Markdown

注意:在使用三地址码的时候,是不允许x[j]=y[i] 的,因为会变成四地址码

结论

对于下面的形式

Sid=E

写成S.code=E.code||gen(id.place=E.place)

注:书上其实有多个形式,这里只记录了一个。详见龙书6-4-1

注:此处的|| 貌似是连接的意思

例1:

EE1+E2 ,写成{E.place=newtemp()E.code=E1.code||E2.code||gen(E.place=E1.place+E2.place)

Eid ,写成{E.place=id.placeE.code=′′

例2:

x=y+22 ,写成t1=22t2=y+t1x=t2 的形式。至于为什么要先分析22 呢?因为这是由语法分析树决定的。

例3:

i = 1;a = 0;while(i <= 10) {  a = a + 1;  i = i + 1;}
i = 1a = 0L1: t1 = (i <= 10)    if(t1 == 0) goto L2    t2 = a + 1    a = t2    t3 = i + 1    i = t3    goto L1L2

例4:

if(a<>b) {  x = 1}
t1 = (a <> b)if(t1 == 0) goto L1x = 1L1

例5:

if(a <> b) {  x = 1} else {  x = 2}
t1 = (a <> b)if(t1 = 0) goto L1x = 1goto L2 // 这句很重要L1: x = 2L2:

例6:x=a[i,j]+1

Address(a[i,j]),a:array[L1u1,L2u2]

a开始地址:addrA

数组元素大小:w

平面结构 存储为线性结构

Address(a[i,j])=addrA+[(iL1)(u2L2+1)+(jL2)]w

其中iL1 表示行数,(u2L2+1) 表示每行元素数,记做n

Address(a[i,j])=addrA+(in+j)w(L1n+L2)w

在C语言中,L1=L2=0

转化成TAC:

t1=L1nt2=t1+L2t3=t2wt4=addrAt3

上面部分是固定的,与下标无关

t5=int6=t5+jt7=t6w

上面这三个式子是下标有关的

t8=t4[t7]  baseaddress[offset]

t9=t8+1x=t9

Markdown

Markdown

Markdown

Markdown

Markdown

整理不动了。。。。