chapter 11: intermediate code generation (part ii)1 compiler designs and constructions chapter 11:...

28
Chapter 11: Intermediate Code Generation (part II) 1 Compiler Designs and Constructions Chapter 11: Intermediate Code Generation(part II) Objectives: Dr. Mohsen Chitsaz

Upload: derek-cummings

Post on 18-Dec-2015

237 views

Category:

Documents


2 download

TRANSCRIPT

Chapter 11: Intermediate Code Generation (part II)

1

Compiler Designs and Constructions

Chapter 11: Intermediate Code Generation(part II)Objectives:

Dr. Mohsen Chitsaz

Chapter 11: Intermediate Code Generation (part II)

2

Method II Flow of Control Translation of Boolean Expression

(Position Reached)

True (Exit) False (Exit)

Chapter 11: Intermediate Code Generation (part II)

3

Example:IF (a<b OR c>d) THEN

N = M+K;

1. IF a<b GOTO 42. IF c>d GOTO 43. GOTO 64. T1 = M + K

5. N = T1

True 4False 6

Method II Flow of Control

Chapter 11: Intermediate Code Generation (part II)

4

Address of Jump?Functions:1. Backpatch (P, I)

Quadruple P takes I as a target

2. Makelist (i)Create a new list with element I, (an index into the array of quadruples)Makelist returns a pointer

3. Merge (P1, P2)Concatenate pointer P1 and P2 into one list, returns a

pointer to the new list

Chapter 11: Intermediate Code Generation (part II)

5

ExampleWHILE (a=b AND a=c) DO{

N = a+b;c = N;

}1. IF a=b GOTO __2. GOTO __3. IF a=c GOTO __4. GOTO __5. T1 = a+b

6. N = T1

7. C=N8. GOTO __

Marker1 (True)=1-> 3Marker2 (True)=3-> 5Marker3 (False)=2-> 9Marker4 (False)=4-> 9

How do I know the address?

Chapter 11: Intermediate Code Generation (part II)

6

E. TrueTarget Location (Jump) (MARKER) E.False

E E1 AND E2

To find the jump address, we need to check E2

Modify the Grammar:1. E E1 OR M E2

2. E E1 AND M E2

3. E Not E1

4. E (E1)5. E id6. E id1 Relop id2

7. M

Chapter 11: Intermediate Code Generation (part II)

7

7. M M.Quad = NextQuad

8. E id1 Relap id2

E.True = Makelist (NextQuad)E.False = Makelist (NextQuad+1)Gen (IF id1.Place Relap id2.Place GOTO )Gen (GOTO )

9. E idE.True = Makelist (NextQuad)E.False = Makelist (NextQuad+1)Gen (IF id1.Place GOTO )Gen (GOTO )

Chapter 11: Intermediate Code Generation (part II)

8

4. E (E1)

E.True = E1.True

E.False = E1.False

5. E Not E1

E.True = E1.False

E.False=E1.True

6. E E1 AND M E2

Backpatch (E1.True, M.Quad)

E.True := E2.True

E.False := Merge (E1.False, E2.False)

Chapter 11: Intermediate Code Generation (part II)

9

1. E E1 OR M E2

Backpatch (E1.False, M.Quad)

E.True := Merge (E1.True, E2.True)

E.False := E2.False

Chapter 11: Intermediate Code Generation (part II)

10

Practice:1- Build the Parse Tree2- Add attributes

a<b OR c<d AND e>f

Chapter 11: Intermediate Code Generation (part II)

11

Intermediate Code:0. IF a<b GOTO___ True1. GOTO 2 2. IF c<d GOTO 43. GOTO___ False4. IF c>f GOTO ___ True5. GOTO ___ False

E E1 AND M EBackpatch(2,4)

E E1 OR M E2

Backpatch (1,2)

Chapter 11: Intermediate Code Generation (part II)

12

Flow of Control

1. Statement IF (exp)Statement

2. Statement IF (exp)Statement

ELSEStatement

3. Statement WHILE (exp)Statement

4. Statement {State_list}5. Statement Assignment_Statement6. State_list State_list; Statement7. State_list Statement

Chapter 11: Intermediate Code Generation (part II)

13

What should we do with nested WHILE loop?

WHILE{ WHILE. {. .. }}

Flow of Control

Chapter 11: Intermediate Code Generation (part II)

14

Method 1: Using Stack Method 2: Using Markers

Statement WHILE M1(exp) M2 Statement M

Example:WHILE (a>b)

WHILE (c>d)..END

END

Chapter 11: Intermediate Code Generation (part II)

15

Method 10. IF a> b GOTO 21. GOTO ___2. 2. IF c<d GOTO 43. GOTO __

GOTO 2False2:

GOTO 0

False1:

Chapter 11: Intermediate Code Generation (part II)

16

Method 2

Statement WHILE M1(exp) M2 Statement

Chapter 11: Intermediate Code Generation (part II)

17

Grammar1. Statement IF (exp) M1 Statement1 N

ELSE M2 Statement2

Backpatch(E.True, M1.Quad)

Backpatch (E.False, M2.Quad)

Statement.Next: Merge (S1.Next, N.Next, S2.Next)

{ Next is the next statement to Jump}2. N

N.Next = Makelist (NextQuad)Gen (GOTO)

Chapter 11: Intermediate Code Generation (part II)

18

3. M M.Quad = NextQuad

4. Statement IF (exp) M StatementBackpatch (E.True, M.Quad);S.Next = Merge (E.False, S.Next)

5. Statement WHILE M1(exp) M2 Statement

Gen (GOTO M1.Quad)

Backpatch(S.Next, M1.Quad)

Backpatch(E.True, M2.Quad)

S.Next = E.False

Grammar

Chapter 11: Intermediate Code Generation (part II)

19

6. Statement { State_list }S.Next = L.Next

7. Statement Assignment_StatementS.Next = Makelist (NextQuad);

8. State_list State_List1; M Statement

Backpatch (L1.Next, M.Quad)

L.Next := S.Next

9. State_List StatementL.Next := S.Next

Grammar

Chapter 11: Intermediate Code Generation (part II)

20

Practice:1- Build parse tree2- Add attributes

WHILE (a< b)IF (c > d)

a = b + c;

Chapter 11: Intermediate Code Generation (part II)

21

WHILE (a< b) DOIF (c > d) THEN

a = b + c;

0. IF a< b GOTO 21. GOTO 72. IF c>d GOTO 43. GOTO 04. T1 = b+c

5. a = T1

6. GOTO

Chapter 11: Intermediate Code Generation (part II)

22

Static ArrayList: Array [1..20, 1..30] of datatype; How much space do we need? How do we store this array?

Row MajorColumn Major

Where is List [20,30] started? List [I,j] is stored at

= +((I-1) * 30) * bpw + (j-1) * bpw= +30i + j – 31 (bpw)?

Base Register –31 Compiled Time (Fixed)Index Register 30i+j Calculated

Chapter 11: Intermediate Code Generation (part II)

23

Example

B = List [I,j]

0- T1 = i+*30

1- T1 = T1 + j Index Register

2- T2 = -31 * 4 Assume bpw = 4

3- T3 = 4* T1

4- T4 = T2 [T3]

5- B = T4

Chapter 11: Intermediate Code Generation (part II)

24

ArrayCode for Array[]= A i T1 T1 = A[i]

= B T1 T1 = B

For K dimensional array: (Row Major)A [i1,i2,…ik]

=(i1-1) d2,d3…dk+(i2-1)d3,d4…dk + …+(ik-1-1)dk+(ik-1)

= i1d2d3…dk+i2d3d4…dk+…+dk+1

=(d2d3…dk+d3d4…dk+…+dk+1)

Fixed = DIf Address of A is THEN D is computed at Compile

Time

Chapter 11: Intermediate Code Generation (part II)

25

Array

1. A L=E2. E E+E3. E (E)4. E L5. E elist ]6. L id7. elist elist, E8. elist id [ E

Chapter 11: Intermediate Code Generation (part II)

26

Array8. elist id [ E

elist.Place = E.Place elist.Ndim = 1; elist.Array = id.Place

9. elist elist1, E T=NewTemp(); M=elist.Ndim + 1; Gen (t ‘=‘ elist1.Place ‘*’ Limit (elist1.Array, M)) Gen (t ‘=‘ t ‘+’ E.Place); elist.Array = elist1.Array elist.Place = t elist.Ndim = M

Chapter 11: Intermediate Code Generation (part II)

27

Array6. L id

L.Place = id.Place L.offset = Null

7. L elist ] L.Place = NewTemp(); L.offset = NewTemp(); Gen (L.offset ‘=‘ ‘bpw’ ‘*’ elist.Place)

8. E L IF (L.offset = Null)

E.Place = L.Place ELSE {

T = NewTemp();Gen (T ‘=‘ L.Place ‘[‘ L.offset ‘]’);E.Place = T }

Chapter 11: Intermediate Code Generation (part II)

28

Array3. E (E1)

E.Place = E1.Place

4. E E1 + E2

T = NewTemp() Gen (T ‘=‘ E1.Place + E2.Place); E.Place = T

5. A L = E IF L.offset = Null Gen(L.Place ‘=‘ E.Place) ELSE Gen (L.Place ‘[‘ L.offset ‘]’ := E.Place)