Semantic Analysis III + Intermediate Representation I
description
Transcript of Semantic Analysis III + Intermediate Representation I
Semantic Analysis III+
Intermediate Representation I
Semantics Analysis Flow
22
class A { int x; int f(int x) { boolean y; ... }}
class B extends A { boolean y; int t;}
class C { A o; int z;}
IC Program
33
ICClassname = A
Fieldname = x …
Methodname = f
Formalname = x …
LocalVariablevarName = yinitExpr = null …
fields[0] methods[0]
bodyformals[0]
ASTProgramfile = …
classes[0]
ICClassname = Bsuper = A
classes[1]classes[2]
…ICClassname = C
…
…
class A { int x; int f(int x) { boolean y; ... }}
class B extends A { boolean y; int t;}
class C { A o; int z;}
44
abstract class Type { String name; boolean subtypeof(Type t) {...}}class IntType extends Type {...}class BoolType extends Type {...}class ArrayType extends Type { Type elemType;}class MethodType extends Type { Type[] paramTypes; Type returnType;}class ClassType extends Type { ICClass classAST;}
IntTypeBoolTypeABCint->int…
TypeTable
Types
55
Type comparison
Use a unique object for each distinct type Resolve each type expression to same object Use reference equality for comparison (==)
66
Type table implementationclass TypeTable { // Maps element types to array types private Map<Type,ArrayType> uniqueArrayTypes; private Map<String,ClassType> uniqueClassTypes;
public static Type boolType = new BoolType(); public static Type intType = new IntType(); ...
// Returns unique array type object public static ArrayType arrayType(Type elemType) { if (uniqueArrayTypes.containsKey(elemType)) { // array type object already created – return it return uniqueArrayTypes.get(elemType); } else { // object doesn’t exist – create and return it ArrayType arrt = new ArrayType(elemType); uniqueArrayTypes.put(elemType,ArrayType); return arrt; } } ... }
Types
77
IntType BoolType
...
TypeTable
ClassTypename = A
ClassTypename = B
ClassTypename = C
MethodType retTypeparamTypes
super
ICClassname = A
Fieldname = xtype = IntType
Methodname = f
Formalname = xtype = IntType
LocalVariablename = yinitExpr = nulltype = BoolType
fields[0] methods[0]
bodyformals[0]
ASTProgramfile = …
classes[0]
ICClassname = Bsuper = A
classes[1]classes[2]
…ICClassname = C
…
…
Types
DataTypes TableSubtyping relation…
Partial CorrectnessAcyclic HierarchyNo Redefinitions…
88
Symbol tables
99
ICClassname = A
Fieldname = xtype = IntType
Methodname = f
Formalname = xtype = IntType
LocalVariablename = yinitExpr = nulltype = BoolType
fields[0] methods[0]
bodyformals[0]
ASTProgramfile = …
classes[0]
ICClassname = Bsuper = A
classes[1]classes[2]
…ICClassname = C
…
…
A CLASS
B CLASS
C CLASS
Global symtab
x FIELD IntType
f METHOD
int->int
A symtabo CLAS
SA
z FIELD IntType
C symtab
t FIELD IntType
y FIELD BoolType
B symtabx PARAM IntType
y VAR BoolType
this VAR A
$ret RET_VAR
IntType
f symtab
Locationname = xtype = ?
… Resolve each id to a symbolcheck scope rules:illegal symbol re-definitions,illegal shadowing,illegal use of undefined symbols
Symbol tables
1010
ICClassname = A
Fieldname = xtype = IntType
Methodname = f
Formalname = xtype = IntType
LocalVariablename = yinitExpr = nulltype = BoolType
fields[0] methods[0]
bodyformals[0]
ASTProgramfile = …
classes[0]
ICClassname = Bsuper = A
classes[1]classes[2]
…ICClassname = C
…
…
A CLASS
B CLASS
C CLASS
Global symtab
x FIELD IntType
f METHOD
int->int
A symtabo CLAS
SA
z FIELD IntType
C symtab
t FIELD IntType
y FIELD BoolType
B symtabx PARAM IntType
y VAR BoolType
this VAR A
$ret RET_VAR
IntType
f symtab
Locationname = xtype = ?
…
this belongs to
method scope
$ret can be used later for type-checking return statements
Miscellaneous semantic checks
Single main methodbreak/continue inside loopsreturn on every control path…
1111
Intermediate Representation I
1212
1313
Compiler
ICProgram
ic
x86 executable
exeLexicalAnalysi
s
Syntax Analysi
s
Parsing
AST Symbol
Tableetc.
Inter.Rep.(IR)
CodeGeneration
IC compiler
1414
Lexical analyzer
tomatoes + potatoes + carrots
tomatoes,PLUS,potatoes,PLUS,carrots,EOF
Parser
symbol kind type
tomatoes var int
potatoes var int
carrots var intLocationExprid=tomatoes
AddExprleft right
AddExprleft right
LocationExprid=potatoes id=carrots
LocationExpr
Id Type obj
int O1
boolean O2
Foo O3
Symtab hierarchy Global type table
A E1 : T[]
A E1.length : intType checking Additional semantic checks
Move tomatoes,R1
Move potatoes,R2
Add R2,R1
...
LIR
1515
Low-level intermediate representation
Allows language-independent, machine-independent optimizations and transformations Easy to translate from AST Easy to translate to assembly Narrow interface
AST LIR
Pentium
Java bytecode
Sparc
optimize
1616
Low-level IR (LIR)
Low-level representation is essentially an abstract machine language
Low-level language constructs jumps, conditional jumps, …
Allows optimizations specific to these constructs
1717
Instruction Meaning
Move c,Rn Rn = c
Move x,Rn Rn = x
Move Rn,x x = Rn
Add Rm,Rn Rn = Rn + Rm
Sub Rm,Rn Rn = Rn – Rm
Mul Rm,Rn Rn = Rn * Rm
...
Note 1: rightmost operand = operation destinationNote 2: two register instr - second operand doubles as source and destination
LIR instructions
Immediate(constant)
Memory(variable)
1818
Example
x = 42;
while (x > 0) {
x = x - 1;
}
Move 42,R1
Move R1,x
_test_label:
Move x,R1
Compare 0,R1
JumpLE _end_label
Move x,R1
Move 1,R2
Sub R2,R1
Move R1,x
Jump _test_label
_end_label:
1919
Translation (IR lowering) How to translate AST to LIR?
(ignore non-computation nodes) Define how each AST node is translated Recursively translate AST (AST tree traversal)
TR[e] = LIR translation of AST construct e A sequence of LIR instructions Use temporary variables (LIR registers) to store
intermediate values during translation
2020
TR[e1 OP e2]
R1 := TR[e1]
R2 := TR[e2]
R3 := R1 OP R2
TR[OP e] R1 := TR[e]
R2 := OP R1
Binary operations(arithmetic and comparisons)
Fresh virtual (LIR) register
generated by translation
Shortcut notationto indicate target
registerNOT LIR instruction
Unary operations
Translating expressions
2121
LocationEx
id = x
AddExprleft right
ValueExpr
val = 42
visit
visit(left)
visit(right)
TR[x + 42]
Move x, R1
Move 42, R2
Add R2, R1
Move x, R1 Move 42, R2
Add R2, R1
Translating expressions – example
2222
Translating (short-circuit) OR
TR[e1 OR e2]R1 := TR[e1]
Compare 1,R1
JumpTrue _end_label
R2 := T[e2]
Or R2,R1
_end_label:
(OR can be replaced by Move operation since R1 is 0)
Fresh labels generated
during translation
2323
Translating (short-circuit) AND
TR[e1 AND e2]R1 := TR[e1]
Compare 0,R1
JumpTrue _end_label
R2 := T[e2]
And R2,R1
_end_label:
(AND can be replaced by Move operation since R1 is 1)
2424
Translating array and field access
TR[e1[e2]]R1 := TR[e1]
R2 := TR[e2]
MoveArray R1[R2], R3
TR[e1.f] R1 := TR[e1]
MoveField R1.cf,R3
2525
Translating array and field access
TR[e1[e2]]R1 := TR[e1]
R2 := TR[e2]
MoveArray R1[R2], R3
TR[e1.f] R1 := TR[e1]
MoveField R1.cf,R3Need to identify class type
of e1 from semantic analysis phase
2626
Translating array and field access
TR[e1[e2]]R1 := TR[e1]
R2 := TR[e2]
MoveArray R1[R2], R3
TR[e1.f] R1 := TR[e1]
MoveField R1.cf,R3
Given class type of e1, need to compute offset of
field f
Need to identify class type of e1 from semantic
analysis phase
2727
Translating array and field access
TR[e1[e2]]R1 := TR[e1]
R2 := TR[e2]
MoveArray R1[R2], R3
TR[e1.f] R1 := TR[e1]
MoveField R1.cf,R3
Constant representing offset of field f in objects of class type of e1
Given class type of e1, need to compute offset of
field f
Need to identify class type of e1 from semantic
analysis phase
2828
Translating statement block
TR[s1; s2; … ; sN] TR[s1]
TR[s2]
TR[s3]
…
TR[sN]
2929
Translating if-then-else
TR[if (e) then s1 else s2]
R1 := TR[e]
Compare 0,R1
JumpTrue _false_label
TR[s1]
Jump _end_label
_false_label:
TR[s2]
_end_label:
3030
Translating if-then
TR[if (e) then s]R1 := TR[e]
Compare 0,R1
JumpTrue _end_label
TR[s]
_end_label:
3131
Translating while
TR[while (e) s]_test_label:
R1 := TR[e]
Compare 0,R1
JumpTrue _end_label
TR[s]
Jump _test_label
_end_label