From 42e2e69f1b85905e6fde178adcb51269f1d37438 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Wed, 8 Mar 2006 00:44:38 +0000 Subject: [PATCH] Finish semantic checks --- Robust/src/IR/ClassDescriptor.java | 6 +- Robust/src/IR/MethodDescriptor.java | 73 +++++++--- Robust/src/IR/NameDescriptor.java | 15 +++ Robust/src/IR/SymbolTable.java | 124 ++++++++--------- Robust/src/IR/Tree/BuildIR.java | 18 +++ Robust/src/IR/Tree/MethodInvokeNode.java | 29 ++-- Robust/src/IR/Tree/Modifiers.java | 4 + Robust/src/IR/Tree/NameNode.java | 13 +- Robust/src/IR/Tree/OpNode.java | 11 ++ Robust/src/IR/Tree/SemanticCheck.java | 162 +++++++++++++++++++++-- Robust/src/IR/TypeDescriptor.java | 1 - Robust/src/Parse/java14.cup | 8 +- 12 files changed, 352 insertions(+), 112 deletions(-) diff --git a/Robust/src/IR/ClassDescriptor.java b/Robust/src/IR/ClassDescriptor.java index 173db73b..e256baff 100644 --- a/Robust/src/IR/ClassDescriptor.java +++ b/Robust/src/IR/ClassDescriptor.java @@ -48,12 +48,14 @@ public class ClassDescriptor extends Descriptor { st+="extends "+superclass.toString(); st+=" {\n"; indent=TreeNode.INDENT; - + boolean printcr=false; + for(Iterator it=getFields();it.hasNext();) { FieldDescriptor fd=(FieldDescriptor)it.next(); st+=TreeNode.printSpace(indent)+fd.toString()+"\n"; + printcr=true; } - if (fields.size()>0) + if (printcr) st+="\n"; for(Iterator it=getMethods();it.hasNext();) { diff --git a/Robust/src/IR/MethodDescriptor.java b/Robust/src/IR/MethodDescriptor.java index 28eb9724..32061222 100644 --- a/Robust/src/IR/MethodDescriptor.java +++ b/Robust/src/IR/MethodDescriptor.java @@ -14,10 +14,12 @@ public class MethodDescriptor extends Descriptor { protected Modifiers modifier; protected TypeDescriptor returntype; protected String identifier; - protected Vector param_name; - protected Vector param_type; + protected Vector params; protected SymbolTable paramtable; - + protected ClassDescriptor cd; + protected VarDescriptor thisvd; + + public MethodDescriptor(Modifiers m, TypeDescriptor rt, String identifier) { super(identifier); this.modifier=m; @@ -25,44 +27,85 @@ public class MethodDescriptor extends Descriptor { this.identifier=identifier; this.safename = "__" + name + "__"; this.uniqueid=count++; - param_name=new Vector(); - param_type=new Vector(); + params=new Vector(); paramtable=new SymbolTable(); + thisvd=null; + } + + public MethodDescriptor(Modifiers m, String identifier) { + super(identifier); + this.modifier=m; + this.returntype=null; + this.identifier=identifier; + this.safename = "__" + name + "__"; + this.uniqueid=count++; + params=new Vector(); + paramtable=new SymbolTable(); + thisvd=null; + } + + public void setThis(VarDescriptor vd) { + thisvd=vd; + paramtable.add(vd); + } + + public boolean isStatic() { + return modifier.isStatic(); } + + public boolean isConstructor() { + return (returntype==null); + } + public TypeDescriptor getReturnType() { return returntype; } + public void setClassDesc(ClassDescriptor cd) { + this.cd=cd; + } + + public ClassDescriptor getClassDesc() { + return cd; + } + public SymbolTable getParameterTable() { return paramtable; } public void addParameter(TypeDescriptor type, String paramname) { - param_name.add(paramname); - param_type.add(type); + if (paramname.equals("this")) + throw new Error("Can't have parameter named this"); + VarDescriptor vd=new VarDescriptor(type, paramname); + + params.add(vd); if (paramtable.getFromSameScope(paramname)!=null) { throw new Error("Parameter "+paramname+" already defined"); } - paramtable.add(paramname,type); + paramtable.add(vd); } public int numParameters() { - return param_name.size(); + return params.size(); } public String getParamName(int i) { - return (String) param_name.get(i); + return ((VarDescriptor)params.get(i)).getName(); } public TypeDescriptor getParamType(int i) { - return (TypeDescriptor) param_type.get(i); + return ((VarDescriptor)params.get(i)).getType(); } public String toString() { - String st=modifier.toString()+returntype.toString()+" "+identifier+"("; - for(int i=0;i