diff options
author | bd-912 <bdunahu@colostate.edu> | 2024-04-15 15:19:54 -0600 |
---|---|---|
committer | bd-912 <bdunahu@colostate.edu> | 2024-04-15 15:19:54 -0600 |
commit | 04e9109f112f4cb7317416c2e31806f42663cb45 (patch) | |
tree | 9ae99f2bc5d5fbb41d731792b1d22a30f2e642b3 /st | |
parent | 056690e0e60d4d0ce046c171691aa02a7071eeae (diff) |
Allow MethodInstance to keep track of parent class
Diffstat (limited to 'st')
-rw-r--r-- | st/AbstractInstance.java | 9 | ||||
-rw-r--r-- | st/SymTableTopDown.java | 7 | ||||
-rw-r--r-- | st/SymbolTable.java | 5 | ||||
-rw-r--r-- | st/TypeInstance.java | 10 |
4 files changed, 17 insertions, 14 deletions
diff --git a/st/AbstractInstance.java b/st/AbstractInstance.java index d236044..7214e6a 100644 --- a/st/AbstractInstance.java +++ b/st/AbstractInstance.java @@ -6,6 +6,7 @@ public abstract class AbstractInstance { protected String name; // the literal name of the declaration protected TypeEnum type; // the type of the declaration protected ArrayList<AbstractInstance> scope; // the scope where the instance is valid + protected ClassInstance cls; // the surrounding class public AbstractInstance(String name, TypeEnum type) { this.type = type; @@ -41,6 +42,10 @@ public abstract class AbstractInstance { } } + protected void addClassInstance(ClassInstance cls) { + this.cls = cls; + } + public String getName() { return this.name; } @@ -53,4 +58,8 @@ public abstract class AbstractInstance { return this.scope; } + public ClassInstance getClassInstance() { + return this.cls; + } + } diff --git a/st/SymTableTopDown.java b/st/SymTableTopDown.java index df136aa..566752e 100644 --- a/st/SymTableTopDown.java +++ b/st/SymTableTopDown.java @@ -121,8 +121,9 @@ public class SymTableTopDown<R> extends GJDepthFirst<R,SymbolTable> { null; String id = n.f1.f0.tokenImage; + TypeInstance me = symt.getType(id); symt.addLocal(id); - symt.addClassInstance(id, cls); + symt.addClassInstance(me, cls); n.f0.accept(this, symt); @@ -147,9 +148,13 @@ public class SymTableTopDown<R> extends GJDepthFirst<R,SymbolTable> { * f12 -> "}" */ public R visit(MethodDeclaration n, SymbolTable symt) { + String cls = symt.getActive(TypeEnum.classname); + String id = n.f2.f0.tokenImage; + MethodInstance me = symt.getMethod(id); symt.setActive(TypeEnum.method, id); symt.addMethod(id); + symt.addClassInstance(me, cls); n.f0.accept(this, symt); diff --git a/st/SymbolTable.java b/st/SymbolTable.java index 93d3af9..de45a58 100644 --- a/st/SymbolTable.java +++ b/st/SymbolTable.java @@ -80,13 +80,12 @@ public class SymbolTable { mtd.addArgument(para); // also adds to local vars } - public void addClassInstance(String t, String c) { - TypeInstance type = this.getType(t); + public void addClassInstance(AbstractInstance t, String c) { ClassInstance cls = (c != null) ? this.getClass(c) : null; - type.addClassInstance(cls); + t.addClassInstance(cls); } diff --git a/st/TypeInstance.java b/st/TypeInstance.java index 65311a8..88b73f3 100644 --- a/st/TypeInstance.java +++ b/st/TypeInstance.java @@ -2,25 +2,15 @@ package st; public class TypeInstance extends AbstractInstance { - ClassInstance cls; - public TypeInstance(String name, TypeEnum type) { super(name, type); } - public void addClassInstance(ClassInstance cls) { - this.cls = cls; - } - public int getSize() { return (this.cls != null) ? cls.getSize() : 4; } - public ClassInstance getClassInstance() { - return this.cls; - } - public boolean sameType(TypeInstance other) { /** * Given a TypeInstance object other, |