Title: Modern Compiler Implementation in Java Semantic Analysis
1Modern Compiler Implementation in JavaSemantic
Analysis
- Chapter 5
- CMSC 431
- Spring, 2003
2Symbol Tables
- Symbol Tables ? Environments
- Mapping IDs to Types and Locations
- Definitions ? Insert in the table
- Use ? Lookup ID
- Scope
- Where the IDs are visible
- Ex formal parameters, local variables in
MiniJava - -gt inside the method where defined
3Environments
- A set of bindings ( -gt )
- Initial Env s0
- Class C
- int a int b int c
- Env s1 s0 a -gt int, b -gt int, c -gt int
- public void m()
- System.out.println(ac)
- int j ab
- Env s2 s1 j -gt int
- String a hello
- Env s3 s2 a -gt String
- System.out.println(a)
4Environments (Contd)
- Env s3 s2 a -gt String
- System.out.println(a)
- System.out.println(a)
- System.out.println(a)
-
- Env s1
-
- Env s0
5Implementing Environments
- Functional Style
- Keep previous env and create new one
- When restored, discard new one and back to old
- Imperative Style
- Destructive update the env(symbol tables)
- Undo need undo stack
6Multiple Symbol Tables ML-style
Initial Env s0 s1 a -gt int s2 E -gt s1
s3 b -gt int,a -gt int s4 N -gt s3 s5
d -gt int s6 D -gt s5 s7 s2 s4 s6
- structure M sturct
- structure E struct
- val a 5
- end s0 s2
- structure N struct
- val b 10
- val a E.a b
- end s0 s2 s4
- structure D struct
- val d E.a N.a
- end
- End s7
7Multiple Symbol Tables Java-style
Initial Env s0 s1 a -gt int s2 E -gt s1
s3 b -gt int,a -gt int s4 N -gt s3 s5
d -gt int s6 D -gt s5 s7 s2 s4 s6
Package M s7 class E static int a 5
s7 class N static int b 10 static
int a E.a b s7 class D static int
d E.a N.a s7 End s7
8Implementation Imperative Symbol Table
Using a Hash Table
Update
s
s s d -gt t4
Undo
a
t1
d
t4
b
t3
c
t2
See Appel Program 5.2 (p106)
9Implementation Functional Symbol Table
- Efficient Functional Approach
- s s a -gt t
- would return s a -gt t
- If implemented with a Hashtable would have to
create O(n) buckets for each scope - Is this a good idea?
10Implementation - Tree
m1
m2
How could this be implemented?
m2 m1 emu -gt 42
Want m2 from m1 in O(n)
m1 bat -gt 1 , camel -gt 2, dog -gt 3
11Symbols
- See Program 5.5 on pg109
- Symbol Representation
- Comparing symbols for equality is fast.
- Extracting an integer hash key is fast.
- Comparing two symbols for greater-than is fast.
- See Program 5.6 on P110 for implementation.
12Some sample program(I)
- /
- The Table class is similar to
java.util.Dictionary, - except that each key must be a Symbol and
there is - a scope mechanism.
- /
- public class Table
- private java.util.Dictionary dict
- new java.util.Hashtable
() - private Symbol top
- private Binder marks
- public Table()
13Some sample program(II)
- /
- Gets the object associated with the specified
- symbol in the Table.
- /
- public Object get(Symbol key)
- Binder e (Binder)dict.get(key)
- if (enull) return null
- else return e.value
-
- /
- Puts the specified value into the Table,
- bound to the specified Symbol.
- /
- public void put(Symbol key, Object value)
- dict.put(key, new Binder(value, top,
- (Binder)dict.get(ke
y))) - top key
-
14Some sample program(III)
- /
- Remembers the current state of the Table.
- /
- public void beginScope()
- marks new Binder(null,top,marks)
topnull - /
- Restores the table to what it was at the most
recent - beginScope that has not already been ended.
- /
- public void endScope()
- while (top!null)
- Binder e (Binder)dict.get(top)
- if (e.tail!null) dict.put(top,e.tail)
- else dict.remove(top)
- top e.prevtop
-
- topmarks.prevtop
- marksmarks.tail
15Some sample program(IV)
- package Symbol
- class Binder
- Object value
- Symbol prevtop
- Binder tail
- Binder(Object v, Symbol p, Binder t)
- valuev prevtopp tailt
-
16Type-Checking in MiniJava
- Binding for type-checking in MiniJava
- Variable and formal parameter
- Var name lt-gt type of variable
- Method
- Method name lt-gt result type, parameters(
including position information), local variables - Class
- Class name lt-gt variables, method declaration,
parent class
17Symbol Table example
- See Figure 5.7 on page 111
- Primitive types
- int -gt IntegerType()
- Boolean -gt BooleanType()
- Other types
- Int -gt IntArrayType()
- Class -gt IdentifierType(String s)
18SymbolTable Real Story
- class SymbolTable
- public SymbolTable()
- public boolean addClass(String id, String
parent) - public Class getClass(String id)
- public boolean containsClass(String id)
- public Type getVarType(Method m, Class c,
String id) - public Method getMethod(String id, String
classScope) - public Type getMethodType(String id, String
classScope) - public boolean compareTypes(Type t1, Type t2)
-
19Be careful!
- getVarType(Method m, Class c, String id)
- In c.m, find variable id
- Local variable in method
- Parameter in parameter list
- Variable in the class
- Variable in the parent class
- getMethod(), getMethodType()
- May be defined in the parent Classes
- compareTypes()
- Primitive types int, boolean, IntArrayType
- Subtype IdentifierType
20SymbolTalbe Class
- class Class
- public Class(String id, String parent)
- public String getId()
- public Type type()
- public boolean addMethod(String id, Type type)
- public Method getMethod(String id)
- public boolean containsMethod(String id)
- public boolean addVar(String id, Type type)
- public Variable getVar(String id)
- public boolean containsVar(String id)
- public String parent()
21SymbolTable Variable
- class Variable
- public Variable(String id, Type type)
- public String id()
- public Type type()
-
22SymbolTable Method
- class Method
- public Method(String id, Type type)
- public String getId()
- public Type type()
- public boolean addParam(String id, Type type)
- public Variable getParamAt(int i)
- public boolean getParam(String id)
- public boolean containsParam(String id)
- public boolean addVar(String id, Type type)
- public Variable getVar(String id)
- public boolean containsVar(String id)
23Type-Checking Two Phase
- Build Symbol Table
- Type-check statements and expressions
- public class Main
- public static void main(String args)
- try
- Program root new MiniJavaParser(System.
in).Goal() - BuildSymbolTableVisitor v1 new
BuildSymbolTableVisitor() - root.accept(v1)
-
- root.accept(new TypeCheckVisitor(v1.getSymTab()))
-
- catch (ParseException e)
- System.out.println(e.toString())
-
-
24BuildSymbolTableVisitor()
- See Program 5.8 on Page 112
- public class BuildSymbolTableVisitor extends
TypeDepthFirstVisitor - .
- private Class currClass
- private Method currMethod
-
- // Type t
- // Identifier i
- public Type visit(VarDecl n)
-
- Type t n.t.accept(this)
- String id n.i.toString()
25BuildSymbolTableVisitor() - Contd
- if (currMethod null)
- if (!currClass.addVar(id,t))
- System.out.println(id "is already
defined in " - currClass.getId())
- System.exit(-1)
-
- else
- if (!currMethod.addVar(id,t))
- System.out.println(id "is already
defined in " - currClass.getId() "."
- currMethod.getId())
- System.exit(-1)
-
-
- return null
-
26BuildSymbolTableVisitor() TypeVisitor()
- public Type visit(MainClass n)
- public Type visit(ClassDeclSimple n)
- public Type visit(ClassDeclExtends n)
- public Type visit(VarDecl n)
- public Type visit(MethodDecl n)
- public Type visit(Formal n)
- public Type visit(IntArrayType n)
- public Type visit(BooleanType n)
- public Type visit(IntegerType n)
- public Type visit(IdentifierType n)
-
27TypeCheckVisitor(SymbolTable)
- See Program 5.9 on page 113
- package visitor
- import syntaxtree.
- public class TypeCheckVisitor extends
DepthFirstVisitor - static Class currClass
- static Method currMethod
- static SymbolTable symbolTable
-
- public TypeCheckVisitor(SymbolTable s)
- symbolTable s
-
28TypeCheckVisitor(SymbolTable) - Contd
-
- // Identifier i
- // Exp e
- public void visit(Assign n)
- Type t1 symbolTable.getVarType(currMethod,curr
Class, -
n.i.toString()) - Type t2 n.e.accept(new TypeCheckExpVisitor()
) - if (symbolTable.compareTypes(t1,t2)false)
- System.out.println("Type error in assignment
to " - n.i.toString())
- System.exit(0)
-
29TypeCheckExpVisitor()
- package visitor
- import syntaxtree.
- public class TypeCheckExpVisitor extends
TypeDepthFirstVisitor - // Exp e1,e2
- public Type visit(Plus n)
- if (! (n.e1.accept(this) instanceof
IntegerType) ) - System.out.println("Left side of Plus must
be of type integer") - System.exit(-1)
-
- if (! (n.e2.accept(this) instanceof
IntegerType) ) - System.out.println("Right side of Plus
must be of type integer") - System.exit(-1)
-
- return new IntegerType()
-
30TypeCheckVisitor Visitor()
- public void visit(MainClass n)
- public void visit(ClassDeclSimple n)
- public void visit(ClassDeclExtends n)
- public void visit(MethodDecl n)
- public void visit(If n)
- public void visit(While n)
- public void visit(Print n)
- public void visit(Assign n)
- public void visit(ArrayAssign n)
-
31TypeCheckExpVisitor() TypeVisitor()
- public Type visit(And n)
- public Type visit(LessThan n)
- public Type visit(Plus n)
- public Type visit(Minus n)
- public Type visit(Times n)
- public Type visit(ArrayLookup n)
- public Type visit(ArrayLength n)
- public Type visit(Call n)
- public Type visit(IntegerLiteral n)
- public Type visit(True n)
- public Type visit(False n)
- public Type visit(IdentifierExp n)
- public Type visit(This n)
- public Type visit(NewArray n)
- public Type visit(NewObject n)
- public Type visit(Not n)
32Overloading of Operators, .
- When operators are overloaded, the compiler must
explicitly generate the code for the type
conversion. - For an assignment statement, both sides have the
same type. When we allow extension of classes,
the right hand side is a subtype of lhs.
33Method Calls e.m()
- Lookup method in the SymbolTable to get parameter
list and result type - Find m in class e
- The parameter types must be matched against the
actual arguments. - Result type becomes the type of the method call
as a whole. - Etc, etc, .
34Error Handling
- For a type error or an undeclared identifier, it
should print an error message. - And must go on..
- Recovery from type errors?
- Do as if it were correct.
- Not a big deal in the examples we will examine
but the reality is bit more complicated. - What are some approaches the book mentions?
35References
- Modern Compiler Implementation in Java . 2nd Ed.
A. Appel, Cambridge University Press, Chapter 5