THEORY OF COMPILATION

Similar documents
Theory of Compilation Erez Petrank. Lecture 7: Intermediate Representation Part 2: Backpatching

CSE443 Compilers. Dr. Carl Alphonce 343 Davis Hall

Compilerconstructie. najaar Rudy van Vliet kamer 140 Snellius, tel rvvliet(at)liacs(dot)nl. college 7, vrijdag 2 november 2018

Formal Languages and Compilers Lecture X Intermediate Code Generation

UNIT-3. (if we were doing an infix to postfix translator) Figure: conceptual view of syntax directed translation.

Module 26 Backpatching and Procedures

CMPSC 160 Translation of Programming Languages. Three-Address Code

Intermediate Code Generation

Intermediate Representa.on

Compilerconstructie. najaar Rudy van Vliet kamer 124 Snellius, tel rvvliet(at)liacs(dot)nl

Intermediate Code Generation

Principle of Compilers Lecture VIII: Intermediate Code Generation. Alessandro Artale

NARESHKUMAR.R, AP\CSE, MAHALAKSHMI ENGINEERING COLLEGE, TRICHY Page 1

Intermediate Code Generation

Intermediate Representations

intermediate-code Generation

Intermediate Code Generation Part II

CS2210: Compiler Construction. Code Generation

Intermediate Code Generation

UNIT IV INTERMEDIATE CODE GENERATION

Intermediate Code Generation

Intermediate Code Generation

Syntax-Directed Translation

Semantic analysis and intermediate representations. Which methods / formalisms are used in the various phases during the analysis?

COMP455: COMPILER AND LANGUAGE DESIGN. Dr. Alaa Aljanaby University of Nizwa Spring 2013

CMPT 379 Compilers. Anoop Sarkar. 11/13/07 1. TAC: Intermediate Representation. Language + Machine Independent TAC

Computer Science Department Carlos III University of Madrid Leganés (Spain) David Griol Barres

Time : 1 Hour Max Marks : 30

Chapter 6 Intermediate Code Generation

Fall Compiler Principles Lecture 6: Intermediate Representation. Roman Manevich Ben-Gurion University of the Negev

Compilers. Compiler Construction Tutorial The Front-end

CSc 453 Intermediate Code Generation

Principle of Complier Design Prof. Y. N. Srikant Department of Computer Science and Automation Indian Institute of Science, Bangalore

Intermediate Code Generation

Dixita Kagathara Page 1

Module 25 Control Flow statements and Boolean Expressions

CSE443 Compilers. Dr. Carl Alphonce 343 Davis Hall

Intermediate Code Generation

Fall Compiler Principles Lecture 5: Intermediate Representation. Roman Manevich Ben-Gurion University of the Negev

Intermediate Code Generation

Principles of Compiler Design

CS 4201 Compilers 2014/2015 Handout: Lab 1

Syntax Directed Translation

Control Structures. Boolean Expressions. CSc 453. Compilers and Systems Software. 16 : Intermediate Code IV

Languages and Compiler Design II IR Code Generation I

CSCI565 Compiler Design

CS322 Languages and Compiler Design II. Spring 2012 Lecture 7

CSCI565 Compiler Design

Syntax-Directed Translation Part II

CSc 453. Compilers and Systems Software. 16 : Intermediate Code IV. Department of Computer Science University of Arizona

COP5621 Exam 3 - Spring 2005

Concepts Introduced in Chapter 6

PRINCIPLES OF COMPILER DESIGN

Compiler Theory. (Intermediate Code Generation Abstract S yntax + 3 Address Code)

Type Checking. Chapter 6, Section 6.3, 6.5

Type Checking. Outline. General properties of type systems. Types in programming languages. Notation for type rules.

Outline. General properties of type systems. Types in programming languages. Notation for type rules. Common type rules. Logical rules of inference

Acknowledgement. CS Compiler Design. Intermediate representations. Intermediate representations. Semantic Analysis - IR Generation

A simple syntax-directed

PSD3A Principles of Compiler Design Unit : I-V. PSD3A- Principles of Compiler Design

Writing Evaluators MIF08. Laure Gonnord

ΕΠΛ323 - Θεωρία και Πρακτική Μεταγλωττιστών

Functional Programming. Pure Functional Programming

CS412/CS413. Introduction to Compilers Tim Teitelbaum. Lecture 19: Efficient IL Lowering 5 March 08

The Compiler So Far. CSC 4181 Compiler Construction. Semantic Analysis. Beyond Syntax. Goals of a Semantic Analyzer.

Alternatives for semantic processing

2 Intermediate Representation. HIR (high level IR) preserves loop structure and. More of a wizardry rather than science. in a set of source languages

Intermediate Code Generation

CSE450. Translation of Programming Languages. Lecture 11: Semantic Analysis: Types & Type Checking

Formal Languages and Compilers Lecture I: Introduction to Compilers

Concepts Introduced in Chapter 6

PRINCIPLES OF COMPILER DESIGN UNIT I INTRODUCTION TO COMPILERS

SYNTAX DIRECTED TRANSLATION FOR CONTROL STRUCTURES

Page No 1 (Please look at the next page )

Compiler Design (40-414)

VIVA QUESTIONS WITH ANSWERS

Project Compiler. CS031 TA Help Session November 28, 2011

Lexical Analysis. Dragon Book Chapter 3 Formal Languages Regular Expressions Finite Automata Theory Lexical Analysis using Automata

LECTURE NOTES ON COMPILER DESIGN P a g e 2

Module 27 Switch-case statements and Run-time storage management

The analysis part breaks up the source program into constituent pieces and creates an intermediate representation of the source program.

LECTURE 3. Compiler Phases

Prof. Mohamed Hamada Software Engineering Lab. The University of Aizu Japan

Faculty of Electrical Engineering, Mathematics, and Computer Science Delft University of Technology

IR Lowering. Notation. Lowering Methodology. Nested Expressions. Nested Statements CS412/CS413. Introduction to Compilers Tim Teitelbaum

Intermediate-Code Generat ion

DEPARTMENT OF COMPUTER SCIENCE & ENGINEERING Subject Name: CS2352 Principles of Compiler Design Year/Sem : III/VI

CSE302: Compiler Design

RYERSON POLYTECHNIC UNIVERSITY DEPARTMENT OF MATH, PHYSICS, AND COMPUTER SCIENCE CPS 710 FINAL EXAM FALL 96 INSTRUCTIONS

Computer Science Department Carlos III University of Madrid Leganés (Spain) David Griol Barres

CS606- compiler instruction Solved MCQS From Midterm Papers

CS 406/534 Compiler Construction Putting It All Together

Semantic Analysis and Intermediate Code Generation

1 Lexical Considerations

Compiler Construction Assignment 3 Spring 2018

Type Inference Systems. Type Judgments. Deriving a Type Judgment. Deriving a Judgment. Hypothetical Type Judgments CS412/CS413

Problem Score Max Score 1 Syntax directed translation & type

Test I Solutions MASSACHUSETTS INSTITUTE OF TECHNOLOGY Spring Department of Electrical Engineering and Computer Science

Question Bank. 10CS63:Compiler Design

CSCI Compiler Design

Transcription:

Lecture 09 IR (ackpatching) THEORY OF COMPILATION Eran Yahav www.cs.technion.ac.il/~yahave/tocs2011/compilers-lec09.pptx Reference: Dragon 6.2,6.3,6.4,6.6 1

Recap Lexical analysis regular expressions identify tokens ( words ) Syntax analysis context-free grammars identify the structure of the program ( sentences ) Contextual (semantic) analysis type checking defined via typing judgments can be encoded via attribute grammars Syntax directed translation (SDT) attribute grammars Intermediate representation many possible IRs generation of intermediate representation 3AC 2

Journey inside a compiler float position; float initial; float rate; position = initial + rate * 60 Token Stream <float> <ID,position> <;> <float> <ID,initial> <;> <float> <ID,rate> <;> <ID,1> <=> <ID,2> <+> <ID,3> <*> <60> Lexical Analysis Syntax Analysis Sem. Analysis Inter. Rep. Code Gen. 3

Journey inside a compiler <ID,1> <=> <ID,2> <+> <ID,3> <*> <60> symbol table id symbol type data = AST 1 position float 2 initial float <id,1> + 3 rate float <id,2> * S ID = E E ID E + E E * E NUM <id,3> 60 Lexical Analysis Syntax Analysis Sem. Analysis Inter. Rep. Code Gen. 4

Problem 3.8 from [Appel] A simple left-recursive grammar: E E + id E id A simple right-recursive grammar accepting the same language: E id + E E id Which has better behavior for shift-reduce parsing? 5

Answer Input id+id+id+id+id id (reduce) E E + E + id (reduce) E E + E + id (reduce) E E + E + id (reduce) E E + E + id (reduce) E E E + id E id left recursive stack The stack never has more than three items on it. In general, with LR-parsing of left-recursive grammars, an input string of length O(n) requires only O(1) space on the stack. 6

Answer Input id+id+id+id+id E id + E E id right recursive id id + id + id id + id + id + id + id id + id + id id + id + id + id id + id + id + id + id + id + id + id + id (reduce) id + id + id + id + E (reduce) id + id + id + E (reduce) id + id + E (reduce) id + E (reduce) E stack The stack grows as large as the input string. In general, with LR-parsing of right-recursive grammars, an input string of length O(n) requires O(n) space on the stack. 7

Journey inside a compiler = AST = AST symbol table id symbol type <id,1> + <id,1> + 1 position float 2 initial float <id,2> * <id,2> * 3 rate float inttofloat <id,3> 60 <id,3> 60 coercion: automatic conversion from int to float inserted by the compiler Lexical Analysis Syntax Analysis Sem. Analysis Inter. Rep. Code Gen. 8

Journey inside a compiler id1 = t3 <id,1> = <id,2> + * t3 = id2 * t2 3AC t1 = inttofloat(60) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 t2 = id3 * t1 <id,3> inttofloat 60 t1 = inttofloat(60) production S id = E E E1 op E2 E inttofloat(num) semantic rule S.code := E. code gen(id.var := E.var) E.var := freshvar(); E.code = E1.code E2.code gen(e.var := E1.var op E2.var) E.var := freshvar(); E.code = gen(e.var := inttofloat(num)) E id E.var := id.var; E.code = Lexical Analysis Syntax Analysis Sem. Analysis Inter. Rep. Code Gen. (for brevity, bubbles show only code generated by the node and not all accumulated code attribute) note the structure: translate E1 translate E2 handle operator 9

Journey inside a compiler 3AC Optimized t1 = inttofloat(60) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 t1 = id3 * 60.0 id1 = id2 + t1 value known at compile time can generate code with converted value eliminated temporary t3 Lexical Analysis Syntax Analysis Sem. Analysis Inter. Rep. Code Gen. 10

Journey inside a compiler t1 = id3 * 60.0 id1 = id2 + t1 Optimized Code Gen LDF R2, id3 MULF R2, R2, #60.0 LDF R1, id2 ADDF R1,R1,R2 STF id1,r1 Lexical Analysis Syntax Analysis Sem. Analysis Inter. Rep. Code Gen. 11

You are here Compiler txt Source Lexical Analysis Syntax Analysis Parsing Semantic Analysis Inter. Rep. (IR) Code Gen. exe Executable text code 12

IR So Far many possible intermediate representations 3-address code (3AC) Every instruction operates on at most three addresses result = operand1 operator operand2 gets us closer to code generation enables machine-independent optimizations how do we generate 3AC? 13

Last Time: Creating 3AC Creating 3AC via syntax directed translation Attributes code code generated for a nonterminal var name of variable that stores result of nonterminal freshvar() helper function that returns the name of a fresh variable 14

Creating 3AC: expressions production S id := E E E1 + E2 E E1 * E2 E - E1 E (E1) semantic rule S.code := E. code gen(id.var := E.var) E.var := freshvar(); E.code = E1.code E2.code gen(e.var := E1.var + E2.var) E.var := freshvar(); E.code = E1.code E2.code gen(e.var := E1.var * E2.var) E.var := freshvar(); E.code = E1.code gen(e.var := uminu E1.var) E.var := E1.var E.code = ( E1.code ) E id E.var := id.var; E.code = (we use to denote concatenation of intermediate code fragments) 15

example a assign + E.var = t5 E.code = t1 = -c t2 = b*t1 t3 = -c t4 = b*t3 t5 = t2+t4 * E.var = t2 E.code = t1 = -c t2 = b*t1 E.var = t4 E.code = t3 = -c t4 = b*t3 * E.var = t3 E.code = t3 = -c b E.var = b E.code = uminus c E.var = t1 E.code = t1 = -c b E.var = b E.code = uminus c E.var = c E.code = E.var = c E.code = 16

Creating 3AC: control statements 3AC only supports conditional/unconditional jumps Add labels Attributes begin label marks beginning of code after label marks end of code Helper function freshlabel() allocates a new fresh label 17

Expressions and assignments production semantic action S id := E { p:= lookup(id.name); if p null then emit(p := E.var) else error } E E1 op E2 { E.var := freshvar(); emit(e.var := E1.var op E2.var) } E - E1 { E.var := freshvar(); emit(e.var := uminus E1.var) } E ( E1) { E.var := E1.var } E id { p:= lookup(id.name); if p null then E.var :=p else error } 18

oolean Expressions production semantic action E E1 op E2 { E.var := freshvar(); emit(e.var := E1.var op E2.var) } E not E1 { E.var := freshvar(); emit(e.var := not E1.var) } E ( E1) { E.var := E1.var } E true { E.var := freshvar(); emit(e.var := 1 ) } E false { E.var := freshvar(); emit(e.var := 0 ) } Represent true as 1, false as 0 Wasteful representation, creating variables for true/false 19

oolean expressions via jumps production semantic action E id1 op id2 { E.var := freshvar(); emit( if id1.var relop id2.var goto nextstmt+2); emit( E.var := 0 ); emit( goto nextstmt + 1); emit(e.var := 1 ) } 20

Example E E or E a < b E and E 100: 101: 102: 103: if a < b goto 103 T 1 := 0 goto 104 T 1 := 1 c < d 104: if c < d goto 107 105: T 2 := 0 106: goto 108 107: T 2 := 1 e < f 108: 109: 110: 111: 112: 113: if e < f goto 111 T 3 := 0 goto 112 T 3 := 1 T 4 := T 2 and T 3 T 5 := T 1 or T 4 21

Short circuit evaluation Second argument of a oolean operator is only evaluated if the first argument does not already determine the outcome (x and y) is equivalent to if x then y else false; (x or y) is equivalent to if x then true else y 22

example a < b or (c<d and e<f) 100: if a < b goto 103 101: T 1 := 0 102: goto 104 103: T 1 := 1 104: if c < d goto 107 105: T 2 := 0 106: goto 108 107: T 2 := 1 108: if e < f goto 111 109: T 3 := 0 110: goto 112 111: T 3 := 1 112: T 4 := T 2 and T 3 113: T 5 := T 1 and T 4 100: if a < b goto 105 101: if!(c < d) goto 103 102: if e < f goto 105 103: T := 0 104: goto 106 105: T := 1 106: naive Short circuit evaluation 23

Control Structures S if then S1 if then S1 else S2 while do S1 For every oolean expression, we attach two properties falselabel target label for a jump when condition evaluates to false truelabel target label for a jump when condition evaluates to true For every statement S we attach a property next the label of the next code to execute after S Challenge Compute falselabel and truelabel during code generation 24

Control Structures: next production P S S S1S2 semantic action S.next = freshlabel(); P.code = S.code label(s.next) S1.next = freshlabel(); S2.next = S.next; S.code = S1.code label(s1.next) S2.code The label S.next is symbolic, we will only determine its value after we finish deriving S 25

Control Structures: conditional production S if then S1 semantic action.truelabel = freshlabel();.falselabel = S.next; S1.next = S.next; S.code =.code gen (.truelabel : ) S1.code 26

Control Structures: conditional production S if then S1 else S2 semantic action.truelabel = freshlabel();.falselabel = freshlabel(); S1.next = S.next; S2.next = S.next; S.code =.code gen(.truelabel : ) S1.code gen( goto S.next) gen(.falselabel : ) S2.code.trueLabel:.falseLabel: S.next:.code S1.code goto S.next S2.code 27

oolean expressions production 1 or 2 1 and 2 not 1 (1) id1 relop id2 true false semantic action 1.trueLabel =.truelabel; 1.falseLabel = freshlabel(); 2.trueLabel =.truelabel; 2.falseLabel =.falselabel;.code = 1.code gen (1.falseLabel : ) 2.code 1.trueLabel = freshlabel(); 1.falseLabel =.falselabel; 2.trueLabel =.truelabel; 2.falseLabel =.falselabel;.code = 1.code gen (1.trueLabel : ) 2.code 1.trueLabel =.falselabel; 1.falseLabel =.truelabel;.code = 1.code; 1.trueLabel =.truelabel; 1.falseLabel =.falselabel;.code = 1.code;.code=gen ( if id1.var relop id2.var goto.truelabel) gen( goto.falselabel);.code = gen( goto.truelabel).code = gen( goto.falselabel); 28

oolean expressions production 1 or 2 semantic action 1.trueLabel =.truelabel; 1.falseLabel = freshlabel(); 2.trueLabel =.truelabel;.falselabel =.falselabel;.code = 1.code gen (1.falseLabel : ) 2.code How can we determine the address of 1.falseLabel? Only possible after we know the code of 1 and all the code preceding 1 29

Example.trueLabel = freshlabel();.falselabel = S.next; S1.next = S.next; S.code =.code gen (.truelabel : ) S1.code S if then S1 1 true and 2 false 1.trueLabel = freshlabel(); 1.falseLabel =.falselabel; 2.trueLabel =.truelabel; 2.falseLabel =.falselabel;.code = 1.code gen (1.trueLabel : ) 2.code.code = gen( goto.falselabel).code = gen( goto.truelabel) 30

Computing addresses for labels We used symbolic labels We need to compute their addresses We can compute addresses for the labels but it would require an additional pass on the AST Can we do it in a single pass? 31

ackpatching Goal: generate code in a single pass Generate code as we did before, but manage labels differently Keep labels symbolic until values are known, and then back-patch them New synthesized attributes for.truelist list of jump instructions that eventually get the label where goes when is true..falselist list of jump instructions that eventually get the label where goes when is false. 32

ackpatching Previous approach does not guarantee a single pass The attribute grammar we had before is not S- attributed (e.g., next), and is not L-attributed. For every label, maintain a list of instructions that jump to this label When the address of the label is known, go over the list and update the address of the label 33

ackpatching makelist(addr) create a list of instructions containing addr merge(p1,p2) concatenate the lists pointed to by p1 and p2, returns a pointer to the new list backpatch(p,addr) inserts i as the target label for each of the instructions in the list pointed to by p 34

ackpatching oolean expressions production 1 or M 2 1 and M 2 not 1 (1) id1 relop id2 true false M semantic action backpatch(1.falselist,m.instr);.truelist = merge(1.truelist,2.truelist);.falselist = 2.falseList; backpatch(1.truelist,m.instr);.truelist = 2.trueList;.falseList = merge(1.falselist,2.falselist);.truelist = 1.falseList;.falseList = 1.trueList;.trueList = 1.trueList;.falseList = 1.falseList;.trueList = makelist(nextinstr);.falselist = makelist(nextinstr+1); emit ( if id1.var relop id2.var goto _ ) emit( goto _ );.truelist = makelist(nextinstr); emit ( goto _ );.falselist = makelist(nextinstr); emit ( goto _ ); M.instr = nextinstr; 35

Marker 1 or M 2 { M.instr = nextinstr;} Use M to obtain the address just before 2 code starts being generated 36

Example X < 150 or x > 200 and x!= y.t = {100}.f = {101} or M x < 150 100: if x< 150 goto _ 101: goto _ and M x > 200 x!= y id1 relop id2.truelist = makelist(nextinstr);.falselist = makelist(nextinstr+1); emit ( if id1.var relop id2.var goto _ ) emit( goto _ ); 37

Example X < 150 or x > 200 and x!= y.t = {100}.f = {101} M.i = 102 or M x < 150 100: if x< 150 goto _ 101: goto _ and M x > 200 x!= y M M.instr = nextinstr; 38

Example X < 150 or x > 200 and x!= y.t = {100}.f = {101} M.i = 102 or M x < 150 100: if x< 150 goto _ 101: goto _.t = {102}.f = {103} and M 102: if x> 200 goto _ 103: goto _ x > 200 x!= y id1 relop id2.truelist = makelist(nextinstr);.falselist = makelist(nextinstr+1); emit ( if id1.var relop id2.var goto _ ) emit( goto _ ); 39

Example X < 150 or x > 200 and x!= y.t = {100}.f = {101} M.i = 102 or M x < 150 100: if x< 150 goto _ 101: goto _.t = {102}.f = {103} and M M.i = 104 102: if x> 200 goto _ 103: goto _ x > 200 x!= y M M.instr = nextinstr; 40

Example X < 150 or x > 200 and x!= y.t = {100}.f = {101} M.i = 102 or M x < 150 100: if x< 150 goto _ 101: goto _ 102: if x> 200 goto _ 103: goto _.t = {102}.f = {103} x > 200 and M 104: if x!=y goto _ 105: goto _ M.i = 104 x!= y.t = {104}.f = {105} id1 relop id2.truelist = makelist(nextinstr);.falselist = makelist(nextinstr+1); emit ( if id1.var relop id2.var goto _ ) emit( goto _ ); 41

Example X < 150 or x > 200 and x!= y.t = {100}.f = {101} or M M.i = 102.t = {104}.f = {103,105} x < 150 100: if x< 150 goto _ 101: goto _ 102: if x> 200 goto 104 103: goto _.t = {102}.f = {103} x > 200 and M 104: if x!=y goto _ 105: goto _ M.i = 104 x!= y.t = {104}.f = {105} 1 and M 2 backpatch(1.truelist,m.instr);.truelist = 2.trueList;.falseList = merge(1.falselist,2.falselist); 42

Example X < 150 or x > 200 and x!= y.t = {100}.f = {101} or M.t = {100,104}.f = {103,105} M.i = 102.t = {104}.f = {103,105} x < 150 100: if x< 150 goto _ 101: goto 102 102: if x> 200 goto 104 103: goto _.t = {102}.f = {103} x > 200 and M 104: if x!=y goto _ 105: goto _ M.i = 104 x!= y.t = {104}.f = {105} 1 or M 2 backpatch(1.falselist,m.instr);.truelist = merge(1.truelist,2.truelist);.falselist = 2.falseList; 43

Example 100: if x<150 goto _ 101: goto _ 102: if x>200 goto _ 103: goto _ 104: if x!=y goto _ 105: goto _ 100: if x<150 goto _ 101: goto _ 102: if x>200 goto 104 103: goto _ 104: if x!=y goto _ 105: goto _ 100: if x<150 goto _ 101: goto 102 102: if x>200 goto 104 103: goto _ 104: if x!=y goto _ 105: goto _ efore backpatching After backpatching by the production 1 and M 2 After backpatching by the production 1 or M 2 44

ackpatching for statements production S if () M S1 S if () M1 S1 N else M2 S2 S while M1 () M2 S1 S { L } S A M N L L1 M S L S semantic action backpatch(.truelist,m.instr); S.nextList = merge(.falselist,s1.nextlist); backpatch(.truelist,m1.instr); backpatch(.falselist,m2.instr); temp = merge(s1.nextlist,n.nextlist); S.nextList = merge(temp,s2.nextlist); backpatch(s1.nextlist,m1.instr); backpatch(.truelist,m2.instr); S.nextList =.falselist; emit( goto M1.instr); S.nextList = L.nextList; S.nextList = null; M.instr = nextinstr; N.nextList = makelist(nextinstr); emit( goto _ ); backpatch(l1.nextlist,m.instr); L.nextList = S.nextList; L.nextList = S.nextList 45

Example if (x < 150 or x > 200 and x!= y) y=200; if S.nextList = {103,105}.t = {100}.f = {101} or M.t = {100,104}.f = {103,105} M.i = 102 M M.i = 106.t = {104}.f = {103,105} x < 150 100: if x< 150 goto _ 101: goto 102 102: if x> 200 goto 104 103: goto _.t = {102}.f = {103} x > 200 and M 104: if x!=y goto _ 105: goto _ M.i = 104 x!= y.t = {104}.f = {105} S if () M S1 backpatch(.truelist,m.instr); S.nextList = merge(.falselist,s1.nextlist); 46

Example 100: if x<150 goto _ 101: goto 102 102: if x>200 goto 104 103: goto _ 104: if x!=y goto _ 105: goto _ 106: y = 200 100: if x<150 goto 106 101: goto 102 102: if x>200 goto 104 103: goto _ 104: if x!=y goto 106 105: goto _ 106: y = 200 After backpatching by the production 1 or M 2 After backpatching by the production S if () M S1 47

Procedures n = f(a[i]); t1 = i * 4 t2 = a[t1] // could have expanded this as well param t2 t3 = call f, 1 n = t3 we will see handling of procedure calls in much more detail later 48

Procedures D define T id (F) { S } F T id, F S return E; E id (A) A E, A statements expressions type checking function type: return type, type of formal parameters within an expression function treated like any other operator symbol table parameter names 49

Summary pick an intermediate representation translate expressions use a symbol table to implement declarations generate jumping code for boolean expressions value of the expression is implicit in the control location backpatching a technique for generating code for boolean expressions and statements in one pass idea: maintain lists of incomplete jumps, where all jumps in a list have the same target. When the target becomes known, all instructions on its list are filled in. 50

Coming up next Activation Records 51

The End 52