summaryrefslogtreecommitdiff
path: root/st
diff options
context:
space:
mode:
Diffstat (limited to 'st')
-rw-r--r--st/MethodInstance.java8
-rw-r--r--st/SymTableMethods.java12
-rw-r--r--st/SymTableVars.java5
-rw-r--r--st/SymbolTable.java10
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;
}