Download presentation
Presentation is loading. Please wait.
Published byAlaina Shannon Armstrong Modified over 8 years ago
1
Semantic Analysis III + Intermediate Representation I
2
Semantics Analysis Flow 2
3
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 3 ICClass name = A Field name = x … Method name = f Formal name = x … LocalVariable varName = y initExpr = null … fields[0] methods[0] body formals[0] AST Program file = … classes[0] ICClass name = B super = A classes[1] classes[2] … ICClass name = C … …
4
class A { int x; int f(int x) { boolean y;... } } class B extends A { boolean y; int t; } class C { A o; int z; } 4 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; } IntType BoolType A B C int->int … TypeTable Types
5
5 Type comparison Use a unique object for each distinct type Resolve each type expression to same object Use reference equality for comparison (==)
6
6 Type table implementation class TypeTable { // Maps element types to array types private Map uniqueArrayTypes; private Map 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; } }... }
7
Types 7 IntType BoolType... TypeTable ClassType name = A ClassType name = B ClassType name = C MethodType retType paramTypes super ICClass name = A Field name = x type = IntType Method name = f Formal name = x type = IntType LocalVariable name = y initExpr = null type = BoolType fields[0] methods[0] body formals[0] AST Program file = … classes[0] ICClass name = B super = A classes[1] classes[2] … ICClass name = C … …
8
Types Data Types Table Subtyping relation … Partial Correctness Acyclic Hierarchy No Redefinitions … 8
9
Symbol tables 9 ICClass name = A Field name = x type = IntType Method name = f Formal name = x type = IntType LocalVariable name = y initExpr = null type = BoolType fields[0] methods[0] body formals[0] AST Program file = … classes[0] ICClass name = B super = A classes[1] classes[2] … ICClass name = C … … ACLASS B C Global symtab xFIELDIntType fMETHODint->int A symtab oCLASSA zFIELDIntType C symtab tFIELDIntType yFIELDBoolType B symtab xPARAMIntType yVARBoolType thisVARA $retRET_VARIntType f symtab Location name = x type = ? … Resolve each id to a symbol check scope rules: illegal symbol re-definitions, illegal shadowing, illegal use of undefined symbols
10
Symbol tables 10 ICClass name = A Field name = x type = IntType Method name = f Formal name = x type = IntType LocalVariable name = y initExpr = null type = BoolType fields[0] methods[0] body formals[0] AST Program file = … classes[0] ICClass name = B super = A classes[1] classes[2] … ICClass name = C … … ACLASS B C Global symtab xFIELDIntType fMETHODint->int A symtab oCLASSA zFIELDIntType C symtab tFIELDIntType yFIELDBoolType B symtab xPARAMIntType yVARBoolType thisVARA $retRET_VARIntType f symtab Location name = x type = ? … this belongs to method scope $ret can be used later for type-checking return statements
11
Miscellaneous semantic checks Single main method break/continue inside loops return on every control path … 11
12
Intermediate Representation I 12
13
13 Compiler IC Program ic x86 executable exe Lexical Analysis Syntax Analysis Parsing ASTSymbol Table etc. Inter. Rep. (IR) Code Generation IC compiler
14
14 Lexical analyzer tomatoes + potatoes + carrots tomatoes,PLUS,potatoes,PLUS,carrots,EOF Parser symbolkindtype tomatoesvarint potatoesvarint carrotsvarint LocationExpr id=tomatoes AddExpr leftright AddExpr leftright LocationExpr id=potatoesid=carrots LocationExpr IdType obj intO1 booleanO2 FooO3 Symtab hierarchy Global type table A E1 : T[] A E1.length : int Type checking Additional semantic checks Move tomatoes,R1 Move potatoes,R2 Add R2,R1... LIR
15
15 Low-level intermediate representation Allows language-independent, machine- independent optimizations and transformations Easy to translate from AST Easy to translate to assembly Narrow interface ASTLIR Pentium Java bytecode Sparc optimize
16
16 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
17
17 InstructionMeaning Move c,RnRn = c Move x,RnRn = x Move Rn,xx = Rn Add Rm,RnRn = Rn + Rm Sub Rm,RnRn = Rn – Rm Mul Rm,RnRn = Rn * Rm... Note 1: rightmost operand = operation destination Note 2: two register instr - second operand doubles as source and destination LIR instructions Immediate (constant) Memory (variable)
18
18 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:
19
19 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
20
20 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 notation to indicate target register NOT LIR instruction Unary operations Translating expressions
21
21 LocationEx id = x AddExpr leftright ValueExpr val = 42 visit visit (left) visit (right) TR[x + 42] Move x, R1 Move 42, R2 Add R2, R1 Move x, R1Move 42, R2 Add R2, R1 Translating expressions – example
22
22 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
23
23 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)
24
24 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. c f,R3
25
25 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. c f,R3 Need to identify class type of e1 from semantic analysis phase
26
26 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. c f,R3 Given class type of e1, need to compute offset of field f Need to identify class type of e1 from semantic analysis phase
27
27 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. c f,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
28
28 Translating statement block TR[s1; s2; … ; sN] TR[s1] TR[s2] TR[s3] … TR[sN]
29
29 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:
30
30 Translating if-then TR[if (e) then s] R1 := TR[e] Compare 0,R1 JumpTrue _end_label TR[s] _end_label:
31
31 Translating while TR[while (e) s] _test_label: R1 := TR[e] Compare 0,R1 JumpTrue _end_label TR[s] Jump _test_label _end_label
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.