编译原理第七章中间代码生成_第1页
编译原理第七章中间代码生成_第2页
编译原理第七章中间代码生成_第3页
编译原理第七章中间代码生成_第4页
编译原理第七章中间代码生成_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章第七章 中间代码生成中间代码生成本章内容本章内容介绍几种常用的中间表示介绍几种常用的中间表示:后缀表示、图后缀表示、图形表示和三地址代码形表示和三地址代码用语法制导定义和翻译方案的方法来说明用语法制导定义和翻译方案的方法来说明程序设计语言的结构怎样被翻译成中间形式程序设计语言的结构怎样被翻译成中间形式 分析分析器器静态静态检查检查器器中间中间代码代码生成生成 器器中间中间代码代码记号记号流流代码代码生成生成器器 抽象语法树抽象语法树 后缀式后缀式 DAG图表示图表示 三地址代码(包括三元式、四元式、间接三地址代码(包括三元式、四元式、间接三元式)三元式)7.1 中中 间间 语语 言言后缀

2、式后缀式 后缀式表示又称逆波兰表示法。后缀式表示又称逆波兰表示法。 这种表示法是:把运算量(操作数)写在前面,把算符写在这种表示法是:把运算量(操作数)写在前面,把算符写在后面(后缀)。后面(后缀)。 一个表达式的后缀形式可以如下定义:一个表达式的后缀形式可以如下定义: 如果如果E是一个变量或常量,则是一个变量或常量,则E的后缀式是的后缀式是E自身自身 如果如果E是是E1 op E2形式的表达式,这里形式的表达式,这里op是任何二元操作符,则是任何二元操作符,则E的后的后缀式为缀式为E1E2op。这里。这里E1和和E2分别是分别是E1和和E2的后缀式。的后缀式。 如果如果E是是(E1)形式的表

3、达式,则形式的表达式,则E1的后缀式就是的后缀式就是E的后缀式的后缀式 只要知道每个算符的目数,对于后缀式,无论从那一端进行只要知道每个算符的目数,对于后缀式,无论从那一端进行扫描,都能对它正确的进行唯一分解扫描,都能对它正确的进行唯一分解后缀式后缀式 表达式翻译为后缀式的语义规则描述:表达式翻译为后缀式的语义规则描述: 其中其中E.code表示表示E的后缀式,的后缀式,op表示任何二元操作符表示任何二元操作符,“|”表示后缀形式的连接表示后缀形式的连接产生式产生式语义规则语义规则EE1 op E2E.code = E1.code | E2.code | opE(E1) E.code = E1

4、.codeEidE.code = id图表示法图表示法 图表示法主要包括图表示法主要包括DAG( Directed Acyclic Graph )与抽象语法与抽象语法树树 语法树描述了源程序的自然层次结构。语法树描述了源程序的自然层次结构。DAG以更紧凑的形式以更紧凑的形式给出了相同的信息。两者不同的是:给出了相同的信息。两者不同的是: 在一个在一个DAG中代表公共子表达式的结点具有多个父结点中代表公共子表达式的结点具有多个父结点 在一颗抽象语法树中公共子表达式被表示为重复的子树。在一颗抽象语法树中公共子表达式被表示为重复的子树。assign+a*uminusbcuminusbca= b*-c

5、 + b*-cassign+a*uminusbcabc uminus * bc numinus *+ assign抽象语法树抽象语法树 构造赋值语句语法树的语法制导定义:构造赋值语句语法树的语法制导定义: 如果函数如果函数mknode(op, child)和和mknode(op, left, right)尽可能返回一个指向已经存在结点的指针以代替建立尽可能返回一个指向已经存在结点的指针以代替建立新的结点,那么就会生成新的结点,那么就会生成DAG图。图。产生式产生式语义规则语义规则Sid = ES.nptr = mknode(assign, mkleaf(id, id.place), E.npt

6、r) EE1 + E2E.nptr = mknode(+ , E1.nptr, E2.nptr) EE1 * E2E.nptr = mknode(* , E1.nptr, E2.nptr)E- E1E.nptr = mknode(uminus, E1.nptr) E(E1)E.nptr = E1.nptr EidE.nptr = mkleaf(id , id.place)抽象语法树的表示形式抽象语法树的表示形式assignida+*uminusuminusidbidbidcidc0idb1idc2uminus13*024idb5idc6uminus57*468+379ida10assign98

7、11a= b*-c + b*-c三地址代码三地址代码 三地址代码是下列形式的语句序列三地址代码是下列形式的语句序列x = y op z其中,其中,x、y和和z是名字,常量或编译器生成的临时变量是名字,常量或编译器生成的临时变量op代表任何操作符(定点运算符、浮点运算符、逻辑运算代表任何操作符(定点运算符、浮点运算符、逻辑运算符等)符等) 像像x+y*z这样的表达式要翻译为这样的表达式要翻译为:T1 = y * zT2 = x + T1其中其中T1 ,T2为编译时产生的临时变量。为编译时产生的临时变量。三地址语句的类型三地址语句的类型 三地址语句类似于汇编语言代码。语句可以有三地址语句类似于汇编

8、语言代码。语句可以有符号标号,而且存在各种控制流语句。符号标号,而且存在各种控制流语句。 本书中使用的三地址语句:本书中使用的三地址语句: 形如形如x= y op z的赋值语句,其中的赋值语句,其中op为二元算术算符为二元算术算符或逻辑算符或逻辑算符 形如形如x= op y的赋值语句,其中的赋值语句,其中op为一元算符。为一元算符。 形如形如x= y的赋值语句,将的赋值语句,将y的值赋给的值赋给x 形如形如goto L的无条件跳转语句,即下一条将被执行的无条件跳转语句,即下一条将被执行的语句是带有标号的语句是带有标号L的三地址语句的三地址语句三地址语句的类型三地址语句的类型 形如形如if x

9、relop y goto L或或 if a goto L的条件跳转语句。的条件跳转语句。 第一种形式使用关系运算符号第一种形式使用关系运算符号relop(等)等) 第二种第二种a为布尔变量或常量为布尔变量或常量 用于过程调用的语句用于过程调用的语句param x和和call p, n,以及返回语句,以及返回语句return y。源程序中的过程调用。源程序中的过程调用p(x1,x2,xn): param x1 param x2 param x2 call p, n n表示实参个数。表示实参个数。return y中中y为过程返回的一个值为过程返回的一个值 形如形如x = yi及及xi = y的索引

10、赋值。的索引赋值。 形如形如x = &y, x = *y和和*x = y的地址和指针赋值。的地址和指针赋值。三地址语句的实现三地址语句的实现 三地址语句是中间代码的一种抽象形式。三地址语句是中间代码的一种抽象形式。 这些语句可以以带有操作符和操作数域的记录这些语句可以以带有操作符和操作数域的记录来实现。四元式、三元式及间接三元式是三种来实现。四元式、三元式及间接三元式是三种这样的表示。这样的表示。四元式四元式 一个四元式是带有四个域的记录结构,这四个一个四元式是带有四个域的记录结构,这四个域分别称为域分别称为op, arg1, arg2及及result。 域域op包含一个代表运算符的内部码包含

11、一个代表运算符的内部码 三地址语句三地址语句x=y op z通过将通过将y放入放入arg1,z放入放入arg2,并且将,并且将x放入放入result,=为算符。为算符。 像像x=y或或x=-y这样的一元操作符语句不使用这样的一元操作符语句不使用arg2 像像param这样的运算符仅使用这样的运算符仅使用arg1域。域。 条件和无条件语句将目标标号存入条件和无条件语句将目标标号存入result域。域。 临时变量也要填入符号表中。临时变量也要填入符号表中。三元式三元式 为了避免把临时变量填入符号表,可以通过计为了避免把临时变量填入符号表,可以通过计算临时值语句的位置来引用该临时变量。算临时值语句的

12、位置来引用该临时变量。 这样三地址代码的记录只需要三个域这样三地址代码的记录只需要三个域op, arg1和和arg。 对于单目运算符对于单目运算符op, arg1和和arg2只需用其一。只需用其一。四元式四元式/三元式三元式举例举例oparg1arg2result(0)uminuscT1(1)*bT1T2(2)uminuscT3(3)*bT3T4(4)+T2T4T5(5)assignT5aoparg1arg2(0)uminusc(1)*b(0)(2)uminusc(3)*b(2)(4)+(1)(3)(5)assigna(4)a = b * -c + b * -c三元式三元式三元式举例三元式举例

13、oparg1arg2(0)=xi(1)assign(0)yoparg1arg2(0)=yi(1)assignx(0)xi = yx = yi间接三元式间接三元式 为了便于代码优化处理,有时不直接使用三元为了便于代码优化处理,有时不直接使用三元式表,而是另设一张指示器(称为间接码表)式表,而是另设一张指示器(称为间接码表),它将运算的先后顺序列出有关三元式在三元,它将运算的先后顺序列出有关三元式在三元表中的位置。表中的位置。 即,用一张间接码表辅以三元式表来表示中间即,用一张间接码表辅以三元式表来表示中间代码。这种表示方法称为间接三元式。代码。这种表示方法称为间接三元式。间接三元式举例间接三元式

14、举例 X=(A+B)*C Y=D(A+B)oparg1arg2(1)+AB(2)*(1)C(3)=X(2)(4)D(1)(5)=Y(4)间接代码间接代码(1)(2)(3)(1)(4)(5)(1)(2)(3)(1)(4)(5)当在代码优化过程中需要调整运算顺序当在代码优化过程中需要调整运算顺序时,只需重新安排间接码表,无需改动时,只需重新安排间接码表,无需改动三元式表三元式表对于间接三元式表示,语义规则中应增对于间接三元式表示,语义规则中应增添产生间接码表的动作,并且在向三元添产生间接码表的动作,并且在向三元式表填进一个三元式之前,必须先查看式表填进一个三元式之前,必须先查看一下此式是否已在其中

15、,就无须填入。一下此式是否已在其中,就无须填入。7.2 声声 明明 语语 句句 为局部名字建立符号表条目为局部名字建立符号表条目 为它分配存储单元为它分配存储单元 符号表中包含名字的类型和分配给它的存储符号表中包含名字的类型和分配给它的存储单元的相对地址等信息单元的相对地址等信息7.2 声声 明明 语语 句句7.2.1 过程中的声明过程中的声明计算被声明名字的类型和相对地址计算被声明名字的类型和相对地址P offset = 0D SD D ; D D id : Tenter ( , T.type, offset);offset = offset + T.width T integ

16、er T.type = integer; T.width = 4 T real T.type = real; T.width = 8 T array num of T1T.type = array (num.val, T1.type);T.width = num.val T1.widthT T1 T.type = pointer (T1.type); T.width = 4 7.2 声声 明明 语语 句句7.2.2 作用域信息的保存作用域信息的保存 所讨论语言的文法所讨论语言的文法P D SD D ; D | id : T | proc id ; D ; S 语义动作用到的函数语义动作用到的函

17、数mktable(previous)enter(table, name, type, offset) addwidth(table, width)enterproc(table, name, newtable)7.2 声声 明明 语语 句句P M D S addwidth (top (tblptr), top (offset) ); pop(tblptr); pop(offset) M t = mktable (nil);push(t, tblptr); push (0, offset) D D1 ; D2D proc id ; N D1; S t = top(tblptr); addwidt

18、h(t, top(offset); pop(tblptr); pop(offset); enterproc(top(tblptr), , t) Did : T enter(top(tblptr), , T.type, top(offset); top(offset) = top(offset) + T.width N t = mktable(top(tblptr) ); push(t, tblptr); push(0, offset) *7.3 赋赋 值值 语语 句句7.3.1 符号表中的名字符号表中的名字S id = E p = lookup();i

19、f p nil thenemit ( p, =, E.place)else error E E1 + E2 E.place = newtemp; emit (E.place, =, E1.place, +, E2.place) E E1 E.place = newtemp; emit (E.place, =, uminus, E1.place) E (E1) E.place = E1.place E id p = lookup();if p nil then E.place = p else error 7.3 赋赋 值值 语语 句句7.3.2 临时名字的重新使用临时名字的重新使

20、用 大量临时变量的使用对优化有利大量临时变量的使用对优化有利 大量临时变量会增加符号表管理的负担大量临时变量会增加符号表管理的负担 也会增加运行时临时数据占的空间也会增加运行时临时数据占的空间7.3 赋赋 值值 语语 句句7.3.3 数组元素的地址计算数组元素的地址计算一维数组一维数组A的第的第i个元素的地址计算个元素的地址计算base + ( i low ) w7.3 赋赋 值值 语语 句句7.3.3 数组元素的地址计算数组元素的地址计算一维数组一维数组A的第的第i个元素的地址计算个元素的地址计算base + ( i low ) w 重写成重写成i w + (base low w)可减少了运

21、行时的计算量可减少了运行时的计算量7.3 赋赋 值值 语语 句句二维数组二维数组 列为主列为主A1, 1, A2, 1, A1, 2, A2, 2, A1, 3, A2, 37.3 赋赋 值值 语语 句句二维数组二维数组 列为主列为主A1, 1, A2, 1, A1, 2, A2, 2, A1, 3, A2, 3 行为主行为主A1, 1, A1, 2, A1, 3, A2, 1, A2, 2, A2, 37.3 赋赋 值值 语语 句句二维数组二维数组 列为主列为主A1, 1, A2, 1, A1, 2, A2, 2, A1, 3, A2, 3 行为主行为主A1, 1, A1, 2, A1, 3

22、, A2, 1, A2, 2, A2, 3base + ( (i1 low1) n2 + (i2 low2 ) ) w(其中其中n2 = high2 low2 + 1)7.3 赋赋 值值 语语 句句二维数组二维数组 列为主列为主A1, 1, A2, 1, A1, 2, A2, 2, A1, 3, A2, 3 行为主行为主A1, 1, A1, 2, A1, 3, A2, 1, A2, 2, A2, 3base + ( (i1 low1) n2 + (i2 low2 ) ) w(其中其中n2 = high2 low2 + 1)( (i1 n2 ) + i2 ) w + (base ( (low1

23、n2 ) + low2 ) w)7.3 赋赋 值值 语语 句句多维数组多维数组Ai1, i2, ., ik 的地址表达式的地址表达式( ( ( (i1 n2 + i2 ) n3 + i3 ) ) nk + ik) w + base ( ( ( (low1 n2 + low2) n3 + low3) ) nk + lowk ) w7.3 赋赋 值值 语语 句句7.3.4 数组元素地址计算的翻译方案数组元素地址计算的翻译方案下标变量访问的产生式下标变量访问的产生式L id Elist | idElist Elist, E | E改成改成L Elist | idElist Elist, E | id

24、 E7.3 赋赋 值值 语语 句句所有产生式所有产生式S L = EE E + EE (E )E LL Elist L idElist Elist, EElist id E7.3 赋赋 值值 语语 句句L id L.place = id.place; L.offset = null 7.3 赋赋 值值 语语 句句L id L.place = id.place; L.offset = null Elist id E Elist.place = E.place; Elist.ndim = 1; Elist.array = id.place 7.3 赋赋 值值 语语 句句L id L.place =

25、 id.place; L.offset = null Elist id E Elist.place = E.place; Elist.ndim = 1; Elist.array = id.place Elist Elist1, E t = newtemp; m = Elist1.ndim + 1; emit (t, =, Elist1.place, , limit(Elist1.array, m) ); emit (t, =, t, +, E.place); Elist.array = Elist1.array; Elist.place = t; Elist.ndim = m7.3 赋赋 值值

26、 语语 句句L id L.place = id.place; L.offset = null Elist id E Elist.place = E.place; Elist.ndim = 1; Elist.array = id.place Elist Elist1, E t = newtemp; m = Elist1.ndim + 1; emit (t, =, Elist1.place, , limit(Elist1.array, m) ); emit (t, =, t, +, E.place); Elist.array = Elist1.array; Elist.place = t; Eli

27、st.ndim = mL Elist L.place = newtemp; emit (L.place, =, base(Elist.array), ,invariant (Elist.array) ); L.offset = newtemp; emit (L.offset, =, Elist.place, , w) 7.3 赋赋 值值 语语 句句E Lif L.offset = null then / L是简单变量是简单变量 / E.place = L.place else begin E.place = newtemp; emit (E.place, =, L.place, , L.off

28、set, ) end 7.3 赋赋 值值 语语 句句E Lif L.offset = null then / L是简单变量是简单变量 / E.place = L.place else begin E.place = newtemp; emit (E.place, =, L.place, , L.offset, ) end E E1 + E2E.place = newtemp;emit (E.place, =, E1.place , +, E2.place) 7.3 赋赋 值值 语语 句句E Lif L.offset = null then / L是简单变量是简单变量 / E.place = L

29、.place else begin E.place = newtemp; emit (E.place, =, L.place, , L.offset, ) end E E1 + E2E.place = newtemp;emit (E.place, =, E1.place , +, E2.place) E (E1 )E.place = E1.place 7.3 赋赋 值值 语语 句句E Lif L.offset = null then / L是简单变量是简单变量 / E.place = L.place else begin E.place = newtemp; emit (E.place, =,

30、 L.place, , L.offset, ) end E E1 + E2E.place = newtemp;emit (E.place, =, E1.place , +, E2.place) E (E1 )E.place = E1.place S L = Eif L.offset = null then / L是简单变量是简单变量 /emit (L.place, = , E.place)else emit (L.place , , L.offset, , =, E.place) 7.3 赋赋 值值 语语 句句S=L.place = xL.offset = nullxE.place = t4L

31、.place = t2L.offset = t3Elist.place = t1Elist.ndim = 2Elist.array = A,Elist.place = yElist.ndim = 1Elist.array = AE.place = zL.place = zL.offset = nullE.place = yL.place = yL.offset = nullAzy x = A y, z 的注释分析树的注释分析树7.3 赋赋 值值 语语 句句S=L.place = xL.offset = nullxE.place = t4L.place = t2L.offset = t3Elis

32、t.place = t1Elist.ndim = 2Elist.array = A,Elist.place = yElist.ndim = 1Elist.array = AE.place = zL.place = zL.offset = nullE.place = yL.place = yL.offset = nullAzy x = A y, z 的注释分析树的注释分析树t1 = y 20 t1 = t1 + z 7.3 赋赋 值值 语语 句句S=L.place = xL.offset = nullxE.place = t4L.place = t2L.offset = t3Elist.plac

33、e = t1Elist.ndim = 2Elist.array = A,Elist.place = yElist.ndim = 1Elist.array = AE.place = zL.place = zL.offset = nullE.place = yL.place = yL.offset = nullAzy x = A y, z 的注释分析树的注释分析树t1 = y 20 t1 = t1 + z t2 =A 84 t3 = 4 t1 7.3 赋赋 值值 语语 句句S=L.place = xL.offset = nullxE.place = t4L.place = t2L.offset =

34、 t3Elist.place = t1Elist.ndim = 2Elist.array = A,Elist.place = yElist.ndim = 1Elist.array = AE.place = zL.place = zL.offset = nullE.place = yL.place = yL.offset = nullAzy x = A y, z 的注释分析树的注释分析树t1 = y 20 t1 = t1 + z t2 =A 84 t3 = 4 t1 t4 = t2 t3 7.3 赋赋 值值 语语 句句S=L.place = xL.offset = nullxE.place =

35、t4L.place = t2L.offset = t3Elist.place = t1Elist.ndim = 2Elist.array = A,Elist.place = yElist.ndim = 1Elist.array = AE.place = zL.place = zL.offset = nullE.place = yL.place = yL.offset = nullAzy x = A y, z 的注释分析树的注释分析树t1 = y 20 t1 = t1 + z t2 =A 84 t3 = 4 t1 t4 = t2 t3 x = t4 7.4 布尔表达式和控制流语句布尔表达式和控制

36、流语句布尔表达式有两个基本目的布尔表达式有两个基本目的 计算逻辑值计算逻辑值 在控制流语句中用作条件表达式在控制流语句中用作条件表达式7.4 布尔表达式和控制流语句布尔表达式和控制流语句布尔表达式有两个基本目的布尔表达式有两个基本目的 计算逻辑值计算逻辑值 在控制流语句中用作条件表达式在控制流语句中用作条件表达式布尔表达式的完全计算布尔表达式的完全计算布尔表达式的布尔表达式的“短路短路”计算计算B1 or B2 定义成定义成 if B1 then true else B2B1 and B2 定义成定义成 if B1 then B2 else false7.4 布尔表达式和控制流语句布尔表达式和

37、控制流语句7.4.1 布尔表达式的翻译布尔表达式的翻译B B or B | B and B | not B | ( B ) | id relop id | true | falsea b的翻译的翻译100: if a b goto 103101: t = 0102: goto 104103: t = 1104:7.4 布尔表达式和控制流语句布尔表达式和控制流语句B B1 or B2 B.place = newtemp; emit (B.place, =, B1.place, or B2.place) B id1 relop id2B.place = newtemp; emit (if, id1

38、.place, relop.op, id2.place, goto, nextstat+3 ); emit (B.place, =, 0 ); emit (goto, nextstat + 2 ); emit (B.place, =, 1 ) 7.4 布尔表达式和控制流语句布尔表达式和控制流语句7.4.2 控制流语句的翻译控制流语句的翻译S if B then S1| if B then S1 else S2| while B do S1| S1; S2 7.4 布尔表达式和控制流语句布尔表达式和控制流语句B.codeS1.codeB.true:. . .指向指向B.true指向指向B.fal

39、se(a) if-thenB.codeS1.codeB.true:. . .指向指向B.true指向指向B.falseB.false: goto S.nextS2.code(b) if-then-elseB.codeS1.codeB.true:. . .指向指向B.true指向指向B.falsegoto S.beginS.begin:(c) while-doS1.codeS2.codeS1.next:. . .(d) S1; S27.4 布尔表达式和控制流语句布尔表达式和控制流语句S if B then S1B.true = newlabel; B.false = S.next; S1.nex

40、t = S.next; S.code = B.code | gen(B.true, :) | S1.code B.codeS1.codeB.true:. . .指向指向B.true指向指向B.false(a) if-then7.4 布尔表达式和控制流语句布尔表达式和控制流语句S if B then S1 else S2B.true = newlabel; B.false = newlabel; S1.next = S.next; S2.next = S.next; S.code = B.code | gen(B.true, :) | S1.code | gen(goto, S.next) |

41、gen(B.false, :) | S2.code B.codeS1.codeB.true:. . .指向指向B.true指向指向B.falseB.false:goto S.nextS2.code(b) if-then-else7.4 布尔表达式和控制流语句布尔表达式和控制流语句S while B do S1 S.begin= newlabel; B.true = newlabel; B.false = S.next; S1.next = S.begin; S.code = gen(S.begin, :) | B.code | gen(B.true, :) | S1.code | gen(go

42、to, S.begin) B.codeS1.codeB.true:. . .指向指向B.true指向指向B.falsegoto S.beginS.begin:(c) while-do7.4 布尔表达式和控制流语句布尔表达式和控制流语句S S1; S2S.code = S1.code | gen(S1.next, :) | S2.code S1.codeS2.codeS1.next:. . .(d) S1; S27.4 布尔表达式和控制流语句布尔表达式和控制流语句7.4.3 布尔表达式的控制流翻译布尔表达式的控制流翻译如果如果B是是a b的形式,的形式,那么代码是:那么代码是:if a b go

43、to B.truegoto B.false7.4 布尔表达式和控制流语句布尔表达式和控制流语句表达式表达式a b or c d and e f的代码是:的代码是:if a b goto Ltruegoto L1L1:if c d goto L2goto LfalseL2:if e f goto Ltruegoto Lfalse7.4 布尔表达式和控制流语句布尔表达式和控制流语句B B1 or B2B1.true = B.true; B1.false = newlabel; B2.true = B.true; B2.false = B.false; B.code = B1.code | gen(

44、B1.false, :) | B2.code 7.4 布尔表达式和控制流语句布尔表达式和控制流语句B B1 or B2B1.true = B.true; B1.false = newlabel; B2.true = B.true; B2.false = B.false; B.code = B1.code | gen(B1.false, :) | B2.code B not B1B1.true = B.false; B1.false = B.true; B.code = B1.code 7.4 布尔表达式和控制流语句布尔表达式和控制流语句B B1 and B2B1.true = newlabel

45、; B1.false = B.false; B2.true = B.true; B2.false = B.false; B.code = B1.code | gen(B1.true, :) | B2.code 7.4 布尔表达式和控制流语句布尔表达式和控制流语句B B1 and B2B1.true = newlabel; B1.false = B.false; B2.true = B.true; B2.false = B.false; B.code = B1.code | gen(B1.true, :) | B2.code B (B1 ) B1.true = B.true; B1.false

46、= B.false; B.code = B1.code 7.4 布尔表达式和控制流语句布尔表达式和控制流语句B id1 relop id2B.code = gen(if, id1.place, relop.op, id2.place, goto, B.true) | gen(goto, B.false) 7.4 布尔表达式和控制流语句布尔表达式和控制流语句B id1 relop id2B.code = gen(if, id1.place, relop.op, id2.place, goto, B.true) | gen(goto, B.false) B trueB.code = gen(got

47、o, B.true)B falseB.code = gen(goto, B.false)布尔表达式的语法制导定义布尔表达式的语法制导定义B B1 or B2B1.true = B.true; B1.false = newlabel; B2.true = B.true; B2.false = B.false; B.code = B1.code | gen(B1.false, :) | B2.codeB not B1B1.true = B.false; B1.false = B.true; B.code = B1.codeB B1 and B2B1.true = newlabel; B1.fals

48、e = B.false; B2.true = B.true; B2.false = B.false; B.code = B1.code | gen(B1.true, :) | B2.codeB (B1 ) B1.true = B.true; B1.false = B.false; B.code = B1.codeB id1 relop id2B.code = gen(if, id1.place, relop.op, id2.place, goto, B.true) |gen(goto, B.false)B trueB.code = gen(goto, B.true)B falseB.code

49、= gen(goto, B.false)控制流语句的语法制导定义控制流语句的语法制导定义S if B then S1B.true = newLabel;B.false = S.next;S1.next = S.next;S.code = B.code | gen(B.true, :) | S1.code S if B then S1 else S2B.true = newlabel;B.false = newlabel;S1.next = S.next;S2.next = S.next;S.code = B.code | gen(B.true, :) | S1.code | gen(goto,

50、 S.next) | gen(B.false, :) | S2.codeS while B do S1 S.begin= newlabel;B.true = newlabel;B.false = S.next;S1.next = S.begin;S.code = gen(S.begin, :) | B.code | gen(B.true, :) | S1.code | gen(goto, S.beginS S1; S2S.code = S1.code | gen(S1.next, :) | S2.code例例 考虑语句考虑语句 while ab do if cd then x=y+z else

51、 x=y-z7.4 布尔表达式和控制流语句布尔表达式和控制流语句7.4.4 开关语句的翻译开关语句的翻译switch Ebegincase V1: S1case V2: S2. . .case Vn - 1: Sn 1default: Snend7.4 布尔表达式和控制流语句布尔表达式和控制流语句 分支数较少时分支数较少时t = E的代码的代码 | Ln-2: if t != Vn-1 goto Ln-1 if t != V1 goto L1 | Sn -1的代码的代码 S1的代码的代码 | goto nextgoto next | Ln-1: Sn的代码的代码 L1:if t != V2 g

52、oto L2 | next: S2的代码的代码goto nextL2:. . . . . 7.4 布尔表达式和控制流语句布尔表达式和控制流语句 分支较多时,将分支测试代码集中在一起,便于生分支较多时,将分支测试代码集中在一起,便于生成较好的分支测试代码成较好的分支测试代码t = E的代码的代码| Ln: Sn的代码的代码goto test | goto nextL1:S1的代码的代码 |test: if t = V1 goto L1 goto next| if t = V2 goto L2 L2:S2的代码的代码 | . . .goto next|if t = Vn-1 goto Ln-1. . . |goto LnLn-1: Sn -1的代码的代码 | next:goto next

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论