diff options
Diffstat (limited to 'st')
-rw-r--r-- | st/MethodInstance.java | 8 | ||||
-rw-r--r-- | st/SymTableMethods.java | 12 | ||||
-rw-r--r-- | st/SymTableVars.java | 5 | ||||
-rw-r--r-- | st/SymbolTable.java | 10 |
4 files changed, 23 insertions, 12 deletions
diff --git a/st/MethodInstance.java b/st/MethodInstance.java index c2f978b..9f1e6df 100644 --- a/st/MethodInstance.java +++ b/st/MethodInstance.java @@ -5,10 +5,10 @@ import java.util.ArrayList; public class MethodInstance extends AbstractInstance { private ArrayList<TypeInstance> args; // the list of arguments private ArrayList<TypeInstance> lvars; // the list of local variables - protected ClassInstance par_cls; // the surrounding class - private TypeEnum rtrn; // the returned type + protected ClassInstance par_cls; // the surrounding class + private ClassInstance rtrn; // the returned type - public MethodInstance(String name, TypeEnum rtrn, ClassInstance par_cls) { + public MethodInstance(String name, ClassInstance rtrn, ClassInstance par_cls) { super(name, TypeEnum.method); this.lvars = new ArrayList<>(); this.args = new ArrayList<>(); @@ -31,7 +31,7 @@ public class MethodInstance extends AbstractInstance { return this.lvars; } - public TypeEnum getReturn() { + public ClassInstance getReturn() { return this.rtrn; } diff --git a/st/SymTableMethods.java b/st/SymTableMethods.java index 6dc7d68..b14676a 100644 --- a/st/SymTableMethods.java +++ b/st/SymTableMethods.java @@ -54,7 +54,7 @@ public class SymTableMethods<R> extends GJDepthFirst<R,SymbolTable> { n.f17.accept(this, symt); TokenKey id = new TokenKey(n.f6.tokenImage, (ClassInstance) symt.getActive(TypeEnum.classname), null); - MethodInstance main = new MethodInstance(id.getName(), TypeEnum.ERROR, (ClassInstance) symt.getActive(TypeEnum.classname)); + MethodInstance main = new MethodInstance(id.getName(), null, (ClassInstance) symt.getActive(TypeEnum.classname)); symt.put(id, main); @@ -145,16 +145,16 @@ public class SymTableMethods<R> extends GJDepthFirst<R,SymbolTable> { TokenKey id = new TokenKey(n.f2.f0.tokenImage, (ClassInstance) symt.getActive(TypeEnum.classname), null); - TypeEnum rtrn = TypeEnum.ERROR; + ClassInstance rtrn = null; switch (n.f1.f0.which) { case 0: - rtrn = TypeEnum.intarray; break; + rtrn = new ClassInstance("intarray"); break; case 1: - rtrn = TypeEnum.bool; break; + rtrn = new ClassInstance("bool"); break; case 2: - rtrn = TypeEnum.integer; break; + rtrn = new ClassInstance("int"); break; case 3: - rtrn = TypeEnum.classname; break; + rtrn = new ClassInstance(((Identifier) n.f1.f0.choice).f0.tokenImage); break; default: MinimalLogger.severe("Unsupported case"); } diff --git a/st/SymTableVars.java b/st/SymTableVars.java index 36f02fc..37747dc 100644 --- a/st/SymTableVars.java +++ b/st/SymTableVars.java @@ -213,6 +213,11 @@ public class SymTableVars<R> extends GJDepthFirst<R,SymbolTable> { symt.put(id, instance); symt.addParameter(id.getName()); + String cls = (n.f0.f0.which == 3) ? + ((Identifier) n.f0.f0.choice).f0.tokenImage : + null; + symt.addClassInstance(instance, cls); + return null; } diff --git a/st/SymbolTable.java b/st/SymbolTable.java index 7f3c788..90640c6 100644 --- a/st/SymbolTable.java +++ b/st/SymbolTable.java @@ -55,11 +55,19 @@ public class SymbolTable { t.getName(), t.getType(), cls.getName(), cls.getType())); cls.addLocal(t); + this.symt.put(new TokenKey(t.getName(), + cls, + null), + t); } for (MethodInstance m : ext.getMethods()) { MinimalLogger.info(String.format("Added %s (%s) as a method of %s (%s)", m.getName(), m.getType(), cls.getName(), cls.getType())); + this.symt.put(new TokenKey(m.getName(), + cls, + null), + m); cls.addMethod(m); } } @@ -202,8 +210,6 @@ public class SymbolTable { if (ret == null) MinimalLogger.severe(String.format("getClass returning null for missing alias %s!", id)); - MinimalLogger.severe(String.format("It was: %s", - this.symt.get(id))); return ret; } |