Presentation is loading. Please wait.

Presentation is loading. Please wait.

Zhang Zhizheng 8 Intermediate code generation Zhang Zhizheng

Similar presentations


Presentation on theme: "Zhang Zhizheng 8 Intermediate code generation Zhang Zhizheng"— Presentation transcript:

1 Zhang Zhizheng 8 Intermediate code generation Zhang Zhizheng

2 Zhang Zhizheng 8.0 Overview 1.Position of Intermediate code generator parser Token stream static checker Syntax tree Intermedi ate code generator Syntax tree Intermediate code Code generator

3 Zhang Zhizheng 2.Benefits for using a machine- independent intermediate form Retargeting is facilitated ; a compiler for a different machine can be created by attaching a back end for the new machine to an existing front end. A machine-independent code optimizer can be applied to the intermediate representation.

4 Zhang Zhizheng 3.Implementation of Intermediate code generator Syntax-directed translation, folded into parsing –Top-down parsing –Bottom-up parsing

5 Zhang Zhizheng 8. 1 Intermediate languages 1.Intermediate representations –Syntax tree Syntax Tree Directed acyclic graph(DAG) –Postfix notation –Three-address code –Quadruple

6 Zhang Zhizheng A syntax tree and DAG for the assignment statement : a:=b*-c+b*-c assign a + b ** buminus cc assign a + b * uminus c

7 Zhang Zhizheng Production of Syntax Tree (and DAG) Production Semantic rules S  id:=E id.value=E.value E  E 1 + E 2 E.value=E 1.value+E 1.value E  E1 * E2 E.value=E1.value  E1.value E  - E1 E.value=-E1.value E  ( E1) E.value=E1.value E  id E.value=id.lexival Semantic rules on value attribution of assignment statement

8 Zhang Zhizheng Production Semantic rules S  id:=E S.nptr:=maknode(‘assign’, mkleaf(id, id.place), E. nptr) E  E 1 + E 2 E.nptr= maknode(‘+’, E 1.nptr, E 1.nptr) E  E1 * E2 E.nptr= maknode(‘*’, E1.nptr, E1.nptr) E  - E1 E.nptr= maknode(‘uminus’, E1.nptr) E  ( E1) E.nptr= E1.nptr E  id E.nptr= maknode(id, id.place) Semantic rules on producing syntax tree of assignment statement

9 Zhang Zhizheng Representations of the syntax tree ____the data structure of graph See Fig. 8.4

10 Zhang Zhizheng 2.Three-address code(TAC) A sequence of statements of the general form x= y op z Here, x, y, z are names, constants, or compiler- generated temporaries; op stands for any operator

11 Zhang Zhizheng Notes: 1)There is only one operator on the right side of a statement 2) Three address code is a linearized representation of a syntax tree or a DAG in which explicit names correspond to the interior nodes of the graph 3) Each three-address code statement contains three addresses, two for the operands and one for the result

12 Zhang Zhizheng E.g, Tree address code corresponding to the above Tree and DAG t1:=-c t2:=b*t1 t3:=-c t4:=b*t3 t5:=t2+t4 a:=t5 Code for the syntax tree t1:=-c t2:=b*t1 t5:=t2+t2 a:=t5 Code for the DAG

13 Zhang Zhizheng 3. Types of TAC –x:=y op z //assignment statement, op is binary arithmetic or logical operation// –x:=op y //assignment statement, op is unary operation as minus, logical negative, conversion operator etc.// –x:=y //Copy assignment statement// –goto L //Unconditional jump// –If x relop y goto L //Conditional jump: if x stands in relation relop to y, then executes the statement with label L, else executed the following statement // –param x 1 …… param x n call p,n return y //Call procedure P with n parameters (x1,……,xn)//

14 Zhang Zhizheng –x=y[i] x[i]=y –x=&y //the value of x is the location of y// x=*y *x=y

15 Zhang Zhizheng 4.Syntax-directed Translation into TAC

16 Zhang Zhizheng E.g, a:=b*-c+b*-c can be translated into t1:=-c t2:=b*t1 t3:=-c t4:=b*t3 t5:=t2+t4 a:=t5 How translate??

17 Zhang Zhizheng Production Semantic Rules S  id:=E S.code:=E.code||gen(id.place ‘:=’ E.place) E  E 1 +E 2 E.place:=newtemp(); E.code:=E 1.code||E 2.code|| gen(E.place,’:=’,E 1.place ‘+’ E 2.place) E  E1*E2 E.place:=newtemp(); E.code:=E1.code||E2.code|| gen(E.place,’:=’,E1.place ‘*’ E2.place) E  -E1 E.place:=newtemp(); E.code:=E1.code|| gen(E.place,’:=’, ‘uminus’ E2.place) E  id E.place:=id.place E.code:=‘’ E.place,the name that will hold the value of E E.code, the sequence of three-address statements evaluating E.

18 Zhang Zhizheng Production Semantic Rules S  while E do S 1 S.begin=newlabel(); S.after=newlabel(); S.code=gen(S.begin ‘:’)||E.code|| gen(‘if’ E.place ‘=‘ ‘0’ ‘goto’ S.after) || S 1.code || gen(‘goto’ S.begin) || gen(S.after ‘:’)

19 Zhang Zhizheng Production Semantic Rules S  if E then S 1 S.after=newlabel(); S.code=E.code|| gen(‘if’ E.place ‘=‘ ‘0’ ‘goto’ S.after) || S 1.code || gen(S.after ‘:’)

20 Zhang Zhizheng Production Semantic Rules S  if E then S 1 S.after=newlabel(); else S 2 E.false=newlabel(); S.code=E.code|| gen(‘if’ E.place ‘=‘ ‘0’ ‘goto’ E.false) || S 1.code || gen(‘goto’ S.after) || gen(E.false ‘:’) || S 2.code || gen(S.after ‘:’)

21 Zhang Zhizheng 5.Addressing array elements 1)One-dimensional array Addr(A[i])=base+(i-low)*w=i*w+(base-low*w) Notes: 1)Here, we assume the width of each array element is w and the start address of the array block is base. 2)The array is defined as array[low..upper] of type 3)The sub-expression c=base-low*w can be evaluated when the declaration of the array is seen and we assume that c is saved in the symbol table entry for the array.

22 Zhang Zhizheng 2)two-dimensional array (1)row-major form Addr(A[i1, i2])= base+((i1-low1)*n2+i2-low2)*w =(i1*n2+i2)*w+base-(low1*n2+low2)*w Where n2=upper2-low2+1 t1=low1*n2 t2=t1+low2 t3=t2*w t4=base-t3 t5=i1*n2 t6=t5+i2 t7=t6*w t4[t7]=x x=t4[t7] (2) column-major form

23 Zhang Zhizheng 3)n-dimensional array Array[l 1 :u 1,, l 2 :u 2,… l n :u n ] Let d i =u i -l i +1,i=1,2,…n, the width of each dimension is m D=a+((i 1 -l 1 )d 2 d 3 …d n + (i 2 -l 2 )d 3 d 4 …d n + (i n-1 -l n-1 )d n + (i n -l n ))m Change into D=conspart+varpart conspart=a-C C=((…(l 1 d 2 +l 2 )d 3 + l 3 ) d 3 …+ l n-1 ) d n + l n )m varpart= ((…(i 1 d 2 +i 2 )d 3 + i 3 ) d 3 …+ i n-1 ) d n + i n )m

24 Zhang Zhizheng 6.Short-circuit code of Boolean expressions Translate a boolean expression into intermediate code without evaluating the entire expression.

25 Zhang Zhizheng 7. Translation methods of Flow of control statements in Short-circuit code 1)Associate E with two labels E.true –The label to which control flows if E is true E.false –The label to which control flows if E is false

26 Zhang Zhizheng 2)Associate S with a label S.next –Following S.code is a jump to some label

27 Zhang Zhizheng Production Semantic Rules S  if E then S1 E.true=newlabel(); E.false=S.next; S1.next=S.next; S.code=E.code ||gen(E.true ‘:’) ||S1.code S  if E then S1 else S2 E.true=newlabel(); E.false=newlabel(); S1.next=S.next S2.next=S.next S.code=E.code ||gen(E.true ‘:’) ||S1.code||gen(‘goto’ S.next)|| gen(E.false ‘:’)||S2.code

28 Zhang Zhizheng Production Semantic Rules S  while E do S1 S.begin=newlabel(); E.true=newlabel(); E.false=S.next; S1.next=S.begin S.code=gen(S.begin ‘:’)||E.code ||gen(E.true ‘:’) ||S1.code||gen(‘goto’ S.begin)

29 Zhang Zhizheng Production Semantic Rules E  E1 or E2 E1.true=E.true; E1.false=newlabel(); E2.true=E.true; E2.false=E.false E.code=E1.code ||gen(E1.false ‘:’) ||E2.code E  E1 and E2 E1.true=newlabel(); E1.false=E.false; E2.true=E.true; E2.false=E.false E.code=E1.code ||gen(E1.true ‘:’) ||E2.code E  id1 relop id2 E.code=gen(‘if’ id1.place relop.op id2.place ‘goto’ E.true)||gen(‘goto’ E.false)

30 Zhang Zhizheng 3)Examples (1)a

31 Zhang Zhizheng (2)while a

32 Zhang Zhizheng 8.Implementations of three-address statements Quadruples –(op, arg1,arg2,result) Triples –(n) (op,arg1,arg2) –(m) (op,(n),arg) Notes: A three-address statement is an abstract form of intermediate codes

33 Zhang Zhizheng 9.Advantages of quadruples Easy to generate target code Good for optimizing

34 Zhang Zhizheng Exercises Please translate the following program fragment into three-address code using the form of short circuit code. i=2; loop=0; while (loop==0 && i<=10) { j=1; while (loop ==0 && j

35 Zhang Zhizheng Translate the following program fragment into three-address code. i=2; m=0; loop=0; while (loop==0 && i<=10) { j=1; while (loop ==0 && j<=i) if (a[i,j] != a[j,i]) //”!=” means “not equal to” { loop=1; m=1; } else j=j+1; if (loop==0) i=i+1; } Notes: Here we assume that the declaration of array A is array [1..10,1..10], each data element of array A would only use 1 storage unit, and the start address of array A’s storage area is addrA.

36 Zhang Zhizheng 8. 2 Assignment statements 1 、 Assignment statements with only id 1) functions NEWTEMP() GEN(OP,ARG 1,ARG 2,RESULT) 2)Semantic rules for quadruple code generation

37 Zhang Zhizheng (1)A  i=E {GEN(=, EPLACE,_, i.entry} (2)E  -E (1) {T=NEWTEMP(); E (1)PLACE,_,T); EPLACE =T } (3)E  E (1) *E (2) {T=NEWTEMP(); GEN(*, E (1)PLACE, E (2)PLACE,T); EPLACE =T } (4)E  E (1) + E (2) {T=NEWTEMP(); GEN(+, E (1)PLACE, E (2)PLACE,T); EPLACE =T } (5)E  (E (1) ) {EPLACE =E (1)PLACE } (6)E  i {EPLACE = i.entry}

38 Zhang Zhizheng iputSYMPLACEquadruples A=-B*(C+D)# =-B*(C+D)#i - -B*(C+D)#i= -- B*(C+D)#i=- --- *(C+D)#i=-i --- *(C+D)#i=-E --- B *(C+D)#i=E -- T 1 -,T 1 ) (C+D)#i=E* -- T 1 - C+D)#i=E*( -- T 1 -- +D)#i=E*(i -- T 1 -- C +D)#i=E*(E -- T 1 -- C

39 Zhang Zhizheng 3.The translation scheme for addressing array elements 1) grammar A  V:=E V  i[Elist] | i Elist  Elist,E | E E  E op E | (E) | V

40 Zhang Zhizheng 3.The translation scheme for addressing array elements 2) Rewriting of the grammar A  V:=E V  Elist] | i Elist  Elist (1),E | i[ E E  E op E | (E) | V Notes: This rewriting aims that the various dimensional limits n j of the array be available as we group index expressions into an Elist.

41 Zhang Zhizheng 3.The translation scheme for addressing array elements 3) semantic variables ARRAY DIM PLACE OFFSET

42 Zhang Zhizheng 3.The translation scheme for addressing array elements 4) Translation code (1)A  V=E {if (VOFFSET=null) GEN(=,E PLACE,_,VPLACE); else GEN([ ]=,EPLACE,_,VPLACE[VOFFSET])}

43 Zhang Zhizheng (2)E  E (1) op E (2) {T=NEWTEMP(); GEN(op, E (1) PLACE, E (2) PLACE,T); E PLACE =T} (3)E  (E (1) ) {E PLACE = E (1) PLACE} (4)E  V {if (VOFFSET=null) E PLACE = V PLACE; else {T=NEWTEMP(); GEN(=[ ], E PLACE[V OFFSET],_,T); E PLACE =T;}}

44 Zhang Zhizheng (5)V  Elist] {if (TYPE[ARRAY]<>1) {T=NEWTEMP(); GEN(*,ElistPLACE,TYPE[ARRAY],T); Elist PLACE=T;} V OFFSET=Elist PLACE; T=NEWTEMP(); GEN(-,HEAD[ARRAY],CONS[ARRAY],T); V PLACE=T} (6)V  i {V PLACE=ENTRY[i]; V OFFSET=null}

45 Zhang Zhizheng (7)Elist  Elist (1),E {T=NEWTEMP(); k= Elist (1) DIM+1; d k =LIMIT(Elist (1) ARRAY,k); GEN(*,Elist (1) PLACE, d k,T); T 1 =NEWTEMP(); GEN(+,T,E PLACE, T 1 ); ElistARRAY= Elist (1) ARRAY; ElistPLACE= T 1 ; ElistDIM=k;

46 Zhang Zhizheng (8)Elist  i[ E {ElistPLACE=EPLACE; ElistDIM=1; ElistARRAY=ENTRY(i)}

47 Zhang Zhizheng E.g. Let A be an array:ARRAY[1:10,1:20]; the address of the beginning of the array is a, m=1. We can get C by the computing: (low1*n2+low2)*m=(1*20+1)*1=21 The quadruples for X=A[I,J] are: (1) (*,I,20,T 1 ) (2) (+, T 1,J, T 2 ) (3) (-,a,21, T 3 ) (4) (=[ ], T 3 [T 2 ],_, T 4 ) (5) (=, T 4,_,X)

48 Zhang Zhizheng 8. 3 Boolean expressions 1.Primary purposes of boolean expressions –Compute logical values –Used as conditional expressions in statements that alter the flow of control,such as if or while statements. 2.Grammar –E  E and E | E or E | not E | (E) | i | E a rop E a

49 Zhang Zhizheng 3.Numerical representation (1)E  E a (1) rop E a (2) {T=NEWTEMP(); GEN(rop, E a (1)PLACE, E a (2)PLACE,T); EPLACE =T } (2)E  E (1) bop E (2) {T=NEWTEMP(); GEN(bop, E (1)PLACE, E (2)PLACE,T); EPLACE =T }

50 Zhang Zhizheng 3.Numerical representation (3)E  not E (1) {T=NEWTEMP; GEN( not, E (1)PLACE, _,T); EPLACE =T } (4)E  (E (1) ) {EPLACE =E (1)PLACE } (5)E  i {EPLACE = ENTRY(i)}

51 Zhang Zhizheng 3.Numerical representation E.g. X+Y>Z or A and (not B or C) (+,X,Y,T 1 ) ;E+E (>, T 1,Z, T 2 ) ; E >E (not,B,_, T 3 ) ; not E (or, T 3,C, T 4 ) ; E or E (and,A, T 4,T 5 ) ; E and E (or, T 2, T 5, T 6 ) ; E or E

52 Zhang Zhizheng 4.Short-circuit code Translate a boolean expression into intermediate code without evaluating the entire expression. Represent the value of an expression by a position in the code sequence.

53 Zhang Zhizheng E.g. if A or B

54 Zhang Zhizheng 8.4 Backpatching 1.Why and what is backpatching? When generating code for boolean expressions and flow- of-control statements, we may not know the labels that control must go to. We can get around this problem by generating a series of branching statement with the targets of the jumps temporarily left unspecified. Each such statement will be put on a list of goto statements whose labels will be filled in when the proper label can be determined. This subsequent filling in of labels is called backpatching

55 Zhang Zhizheng 2.Functions to manipulate lists of labels related to backpatching Makelist(i) –Creates a new list containing only i, an index into the array of quadruples; makelist returns a pointer to the list it has made. Merge(p1,p2) –Concatenates the lists pointed to by p1 and p2, and returns a pointer to the concatenated list. Backpatch(p,i) –Inserts i as the target label for each of the statements on the list pointed to by p.

56 Zhang Zhizheng 3.Boolean expression 1)Modify the grammar E  E A E | E 0 E | not E | (E) | i | E a rop E a E A  E and E 0  E or 2)Semantic Rules (1) E  i {ETC=NXQ; EFC=NXQ+1; GEN(jnz,ENTRY(i),_,0); GEN(j,_,_,0)}

57 Zhang Zhizheng 3.Boolean expression 2)Semantic Rules (2) E  E a rop E a {ETC=NXQ; EFC=NXQ+1; GEN(jrop, E a (1)PLACE, E a (2)PLACE,0); GEN(j,_,_,0)} (3) E  (E (1) ) {ETC= E (1)TC; EFC= E (1)FC} (4) E  not E (1) {ETC= E (1)FC; EFC= E (1)TC}

58 Zhang Zhizheng 3.Boolean expression 2)Semantic Rules (5)E A  E (1) and {BACKPATCH(E (1)TC,NXQ); E A FC= E (1)FC;} (6) E  E A E (2) {ETC= E (2) TC; EFC=MERG(E A FC,E (2) FC}

59 Zhang Zhizheng 3.Boolean expression 2)Semantic Rules (7)E 0  E (1) or {BACKPATCH(E (1) FC,NXQ); E 0 TC= E (1) TC;} (8) E  E 0 E (2) {EFC= E (2) FC; ETC=MERG(E 0 TC,E (2) TC}

60 Zhang Zhizheng Translate A and B or not C # E A i or not C# -2--# E A B or not C# 2.(j,-,-(5))-2--1-#E and B or not C# 1.(jnz,a,-,(3))-2#E and B or not C# -- #i and B or not C# --# A and B or not C# quadrupleFCTCSYMINPUT

61 Zhang Zhizheng quadrupleFCTCSYMINPUT 3.(jnz,B, -,0) - 2 4 -- 3 # E A E or not C # success -5-5 -6-6 #E # 6.(j, -, -,3) -- 5 - 3 6 # E 0 E # 5.(jnz,C, -,0) --- 6 -3-5-3-5 # E 0 not E # -----3---3-- # E 0 not i # ----3--3- # E 0 not C # ---3-3 # E 0 not C # -4--4--3--3- #E or or not C # 4.(j, -, - (5)) -4-4 -3-3 #E or not C #

62 Zhang Zhizheng 4.Flow of control statements 1)modify the grammar S  if E then S (1) else S (2)  C  if E then T  C S (1) else S  T S (2) S  if E then S (1)  C  if E then S  C S (1)

63 Zhang Zhizheng 4.Flow of control statements 2) Semantic Rules C  if E then {BACKPATCH(ETC,NXQ); CCHAIN=EFC;} T  C S (1) else {q=NXQ; GEN(j, -, - 0); BACKPATCH(CCHAIN,NXQ); T CHAIN=MERG(S (1)CHAIN,q)} S  T S (2) {SCHAIN=MERG(TCHAIN,S (2)CHAIN)} S  C S (1) {SCHAIN=MERG(CCHAIN,S (1)CHAIN)}

64 Zhang Zhizheng e.g. If a then if b then A:=2 else A:=3 Else if c then A=4 Else a=5 (1) (jnz,a,_,0) (2) (j,_,_,0)

65 Zhang Zhizheng If a then if b then A:=2 else A:=3 Else if c then A=4 Else a=5 (1)(jnz,a,_,(3)) (2)(j,_,_,0) (3)(jnz,b,_,0) (4)(j,_,_,0) CaCHAIN->2

66 Zhang Zhizheng If a then if b then A:=2 else A:=3 Else if c then A=4 Else a=5 (1)(jnz,a,_,(3)) (2)(j,_,_,0) (3)(jnz,b,_,(5)) (4)(j,_,_,0) CaCHAIN->2 CbCHAIN->4 (5)(:=,2,_,A)

67 Zhang Zhizheng If a then if b then A:=2 else A:=3 Else if c then A=4 Else a=5 (1)(jnz,a,_,(3)) (2)(j,_,_,0) (3)(jnz,b,_,(5)) (4)(j,_,_,(7)) (5)(:=,2,_,A) CaCHAIN->2 CbCHAIN->6 (6)(j,_,_,0)

68 Zhang Zhizheng Answer (1)(jnz,a,_,(3)) (8)(j,_,_,6) (2)(j,_,_,(9)) (9)(jnz,c,_,(11)) (3)(jnz,b,_,(5)) (10)(j,_,_,(13)) (4)(j,_,_,(7)) (11)(:=,4,_,A) (5)(:=,2,_,A) (12)(j,_,_,8) (6)(j,_,_,0) (13)(:=,5,_,A) (7)(:=,3,_,A) SCHAIN->6->8->12

69 Zhang Zhizheng a b S1(A:=2) S2(A:=3) c S3(A:=4) S4(A:=5) TRUE FALSE 1,2 3, ,

70 Zhang Zhizheng 4.Flow of control statements 3) While statement S  while E do S (1)  W  while W d  W E do S  W d S (1)

71 Zhang Zhizheng 4.flow of control statements 3) While statement W  while {WQUAD=NXQ} W d  W E do {BACKPATCH(ETC,NXQ); W dCHAIN=EFC; W dQUAD=WQUAD;} S  W d S (1) {BACKPATCH(S (1)CHAIN, W dQUAD); GEN(j,_,_, W dQUAD); S CHAIN= W dCHAIN}

72 Zhang Zhizheng 4.flow of control statements 3) While statement Code of E Code of S (1) S.CHAIN

73 Zhang Zhizheng e.g. While (A

74 Zhang Zhizheng e.g. While (A

75 Zhang Zhizheng e.g. While (A

76 Zhang Zhizheng e.g. While (A


Download ppt "Zhang Zhizheng 8 Intermediate code generation Zhang Zhizheng"

Similar presentations


Ads by Google