chapter 11: intermediate code generation (part ii)1 compiler designs and constructions chapter 11:...
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)
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 }