Title: Compiler Construction
1Compiler Construction
2Three-Address Code
- Three-address code is attractive for several
reasons
3Three-Address Code
- absence of destructive operators gives the
compiler freedom to reuse names and values - three-address code is reasonably compact
operations are 1 to 2 bytes addresses are 4 bytes
4Three-Address Code
- absence of destructive operators gives the
compiler freedom to reuse names and values - three-address code is reasonably compact
operations are 1 to 2 bytes addresses are 4 bytes
5Three-Address Code
- many modern processors implement three-address
operations, a three-address code models their
properties well
6Syntax-directed Translation
- We now consider syntax-directed translation
schemes using three-address code for various
programming constructs - We start with the assignment statement
7Syntax-directed Translation
- We now consider syntax-directed translation
schemes using three-address code for various
programming constructs - We start with the assignment statement
8Production translation scheme
S ? id E p lookup(id.name) emit( p, , E.place)
E ? E1 E2 E.place newtemp() emit( E.place, , E1.place, , E2.place)
E ? E1 ? E2 E.place newtemp() emit( E.place, , E1.place, ?, E2.place)
9Production translation scheme
E ? E1 E.place newtemp() emit( E.place, , , E1.place)
E ? ( E1 ) E.place E1.place
E ? id p lookup(id.name) emit( E.place, , p )
10Assignment Statement
- The tranlation scheme uses a symbol table for
identifiers and temporaries - Every time the parser encounters an identifier,
it installs it in the symbol table.
11Assignment Statement
- The tranlation scheme uses a symbol table for
identifiers and temporaries - Every time the parser encounters an identifier,
it installs it in the symbol table.
12Assignment Statement
- The symbol table can be implemented as a hash
table or using some other efficient data
structure for table.
13Assignment Statement
- The routine lookup(name) checks if there an entry
for the name in the symbol table - If the name is found, the routine returns a
pointer to entry.
14Assignment Statement
- The routine lookup(name) checks if there an entry
for the name in the symbol table - If the name is found, the routine returns a
pointer to entry.
15Assignment Statement
- The routine newtemp() returns a new temporary in
response to successive calls - Temporaries can be placed in the symbol table
16Assignment Statement
- The routine emit() generates a three-address
statement which can either be held in memory or
written to a file
17Example
- Here is the bottom-up parse of the assignment
statement - a b-c b-c
- and the syntax-directed translation into
three-address code