Download presentation
Presentation is loading. Please wait.
1
Intermediate code generation Jakub Yaghob
Compiler principles Intermediate code generation Jakub Yaghob
2
Syntax-directed translation into three-address code
Add several attributes to each grammar symbol Placement – a name of an object holding a value of the object Code – a sequence of three-address instructions evaluating the symbol Label – an absolute or relative address to three-address code
3
Example for our grammar
E → ER + T E → T T → TR * F T → F F → ( E ) F → id E.p = newtemp E.c = ER.c | T.c | gen(E.p=ER.p + T.p) E.p = T.p E.c = T.c T.p = newtemp T.c = TR.c | F.c | gen(T.p = TR.p * F.p) T.p = F.p T.c = F.c F.p = E.p F.c = E.c F.p = id.p F.c = ‘’
4
Example for while (amateur)
S→ while E do SR S.L1 = curradr S.L2 = curradr + E.c.size + SR.c.size + 2 S.c = E.c | gen(JZ E.p, S.L2) | SR.c | gen(JMP S.L1) S.L1: E.c JZ E.p, S.L2 SR.c JMP S.L1 S.L2:
5
Example for while (professional)
S→ while E do SR S.L1 = curradr + 1 S.L2 = curradr + SR.c.size + 1 S.c = gen(JMP S.L2) | SR.c | E.c | gen(JNZ E.p, S.L1) JMP S.L2 S.L1: SR.c S.L2: E.c JNZ E.p, S.L1
6
Declarations Global objects declarations Local objects declarations
E.g. global variables in C Local objects declarations E.g. local variables in a function At the start of the function × at the start of a block × in the block body Moving declarations to a “good” place Global declarations in one well-defined place Local declarations at the start of a function Live-variable in the function Determine the size of the object Determine the offset of fields in a structure It does not have to be solved in intermediate code
7
Assignment Type conversion Structure field access Array unfolding
Usually explicit Intermediate code does not know input language semantic Structure field access Use calculated offset from declaration Direct access using a pointer and added constant Array unfolding Multidimensional-array are perceived as one-dimensional (like a memory) – stored in one of the two forms, either row-major (row-by-row) or column-major (column-by-column) One-dimensional array A[lb..ub] of type with width w base + (i-lb) * w i * w + (base – lb * w) Two-dimensional array A[lb1..ub1,lb2..ub2] base + ((i1-lb1) * (ub2-lb2+1) + i2-lb2) * w
8
Boolean expression Sometimes replaced FALSE=0, TRUE=1 (or anything !=0) Numeric (full) evaluation All parts of the expression are evaluated Pascal Short evaluation if the result is already known during the evaluation, it won’t be evaluated further Jumps in the evaluation C
9
Switch What we need Finding the case Evaluate the expression
Find which value in the list of cases is the same as the value of the expression Execute the statement associated with the value found Finding the case Sequence of conditional branches Small number of cases (<10) Binary search in table [value,caseptr] Binary tree of conditions Table of pointers indexed by value High density of values in the range of case values
10
Backpatching Single pass translation: how to set a destination address in a jump to a forward label? Forward jump Calling a not yet defined function in a module Can be resolved by a linker Generate branches with the targets of the jumps temporarily left unspecified For each label remember a set of instructions referencing it Determine the address of the label Go through the set of instructions and backpatch the determined address
11
Procedure calls Evaluate parameters
Pass parameters by value or by reference VAR or non-VAR parameters in Pascal Binding real and formal parameters Positional By name Return value
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.