diff options
author | bd-912 <bdunahu@colostate.edu> | 2024-04-25 00:17:56 -0600 |
---|---|---|
committer | bd-912 <bdunahu@colostate.edu> | 2024-04-25 00:18:51 -0600 |
commit | 765337c53286db39ffc3c64eede602afe3899647 (patch) | |
tree | 893b488f70b22c4d18cec6934ed479feb0943b54 | |
parent | d2017d232557b45792857b972ca8883df6e79506 (diff) |
Rewrote SymbolTable to add uniqueness to stored tokens
-rw-r--r-- | st/SymTableBottomUp.java | 36 | ||||
-rw-r--r-- | st/SymTableTopDown.java | 32 | ||||
-rw-r--r-- | st/SymbolTable.java | 80 | ||||
-rw-r--r-- | st/TokenKey.java | 45 |
4 files changed, 127 insertions, 66 deletions
diff --git a/st/SymTableBottomUp.java b/st/SymTableBottomUp.java index b0772fc..72a4575 100644 --- a/st/SymTableBottomUp.java +++ b/st/SymTableBottomUp.java @@ -52,14 +52,12 @@ public class SymTableBottomUp<R> extends GJDepthFirst<R,SymbolTable> { n.f17.accept(this, symt); - String id = n.f1.f0.tokenImage; - ClassInstance instance = new ClassInstance(id); - MinimalLogger.info("Inserting " + id + " => " + instance.getType()); + TokenKey id = new TokenKey(n.f1.f0.tokenImage, 0); + ClassInstance instance = new ClassInstance(id.getName()); symt.put(id, instance); - id = "main"; - MethodInstance main = new MethodInstance(id, TypeEnum.ERROR); - MinimalLogger.info("Inserting " + id + " => " + main.getType()); + id = new TokenKey(n.f6.tokenImage, n.f6.beginLine); + MethodInstance main = new MethodInstance(id.getName(), TypeEnum.ERROR); symt.put(id, main); @@ -83,9 +81,8 @@ public class SymTableBottomUp<R> extends GJDepthFirst<R,SymbolTable> { n.f5.accept(this, symt); - String id = n.f1.f0.tokenImage; - ClassInstance instance = new ClassInstance(id); - MinimalLogger.info("Inserting " + id + " => " + instance.getType()); + TokenKey id = new TokenKey(n.f1.f0.tokenImage, 0); + ClassInstance instance = new ClassInstance(id.getName()); symt.put(id, instance); @@ -113,9 +110,8 @@ public class SymTableBottomUp<R> extends GJDepthFirst<R,SymbolTable> { n.f7.accept(this, symt); - String id = n.f1.f0.tokenImage; - ClassInstance instance = new ClassInstance(id); - MinimalLogger.info("Inserting " + id + " => " + instance.getType()); + TokenKey id = new TokenKey(n.f1.f0.tokenImage, 0); + ClassInstance instance = new ClassInstance(id.getName()); symt.put(id, instance); @@ -132,7 +128,7 @@ public class SymTableBottomUp<R> extends GJDepthFirst<R,SymbolTable> { n.f1.accept(this, symt); n.f2.accept(this, symt); - String id = n.f1.f0.tokenImage; + TokenKey id = new TokenKey(n.f1.f0.tokenImage, n.f1.f0.beginLine); TypeEnum rtrn = TypeEnum.ERROR; switch (n.f0.f0.which) { case 0: @@ -147,8 +143,7 @@ public class SymTableBottomUp<R> extends GJDepthFirst<R,SymbolTable> { MinimalLogger.severe("Unsupported case"); } - TypeInstance instance = new TypeInstance(id, rtrn); - MinimalLogger.info("Inserting " + id + " => " + instance.getType()); + TypeInstance instance = new TypeInstance(id.getName(), rtrn); symt.put(id, instance); @@ -186,7 +181,8 @@ public class SymTableBottomUp<R> extends GJDepthFirst<R,SymbolTable> { n.f12.accept(this, symt); - String id = n.f2.f0.tokenImage; + + TokenKey id = new TokenKey(n.f2.f0.tokenImage, n.f2.f0.beginLine); TypeEnum rtrn = TypeEnum.ERROR; switch (n.f1.f0.which) { case 0: @@ -201,8 +197,7 @@ public class SymTableBottomUp<R> extends GJDepthFirst<R,SymbolTable> { MinimalLogger.severe("Unsupported case"); } - MethodInstance instance = new MethodInstance(id, rtrn); - MinimalLogger.info("Inserting " + id + " => " + instance.getType()); + MethodInstance instance = new MethodInstance(id.getName(), rtrn); symt.put(id, instance); @@ -218,7 +213,7 @@ public class SymTableBottomUp<R> extends GJDepthFirst<R,SymbolTable> { n.f1.accept(this, symt); - String id = n.f1.f0.tokenImage; + TokenKey id = new TokenKey(n.f1.f0.tokenImage, n.f1.f0.beginLine); TypeEnum rtrn = TypeEnum.ERROR; switch (n.f0.f0.which) { case 0: @@ -233,8 +228,7 @@ public class SymTableBottomUp<R> extends GJDepthFirst<R,SymbolTable> { MinimalLogger.severe("Unsupported case"); } - TypeInstance instance = new TypeInstance(id, rtrn); - MinimalLogger.info("Inserting " + id + " => " + instance.getType()); + TypeInstance instance = new TypeInstance(id.getName(), rtrn); symt.put(id, instance); diff --git a/st/SymTableTopDown.java b/st/SymTableTopDown.java index 566752e..5bfd971 100644 --- a/st/SymTableTopDown.java +++ b/st/SymTableTopDown.java @@ -32,10 +32,11 @@ public class SymTableTopDown<R> extends GJDepthFirst<R,SymbolTable> { * f17 -> "}" */ public R visit(MainClass n, SymbolTable symt) { - String id = n.f1.f0.tokenImage; - symt.setActive(TypeEnum.classname, id); - symt.setActive(TypeEnum.method, "main"); - symt.addMethod("main"); + TokenKey id = new TokenKey(n.f1.f0.tokenImage, 0); + symt.setActive(TypeEnum.classname, symt.getClass(id)); + TokenKey main = new TokenKey(n.f6.tokenImage, n.f6.beginLine); + symt.setActive(TypeEnum.method, symt.getMethod(main)); + symt.addMethod(main); n.f0.accept(this, symt); @@ -70,8 +71,8 @@ public class SymTableTopDown<R> extends GJDepthFirst<R,SymbolTable> { * f5 -> "}" */ public R visit(ClassDeclaration n, SymbolTable symt) { - String id = n.f1.f0.tokenImage; - symt.setActive(TypeEnum.classname, id); + TokenKey id = new TokenKey(n.f1.f0.tokenImage, 0); + symt.setActive(TypeEnum.classname, symt.getClass(id)); n.f0.accept(this, symt); @@ -94,9 +95,10 @@ public class SymTableTopDown<R> extends GJDepthFirst<R,SymbolTable> { * f7 -> "}" */ public R visit(ClassExtendsDeclaration n, SymbolTable symt) { - String id = n.f1.f0.tokenImage; - symt.setActive(TypeEnum.classname, id); - symt.setExtend(n.f3.f0.tokenImage); + TokenKey id = new TokenKey(n.f1.f0.tokenImage, 0); + symt.setActive(TypeEnum.classname, symt.getClass(id)); + TokenKey ext = new TokenKey(n.f3.f0.tokenImage, 0); + symt.setExtend(ext); n.f0.accept(this, symt); @@ -120,7 +122,7 @@ public class SymTableTopDown<R> extends GJDepthFirst<R,SymbolTable> { ((Identifier) n.f0.f0.choice).f0.tokenImage : null; - String id = n.f1.f0.tokenImage; + TokenKey id = new TokenKey(n.f1.f0.tokenImage, n.f1.f0.beginLine); TypeInstance me = symt.getType(id); symt.addLocal(id); symt.addClassInstance(me, cls); @@ -148,13 +150,13 @@ public class SymTableTopDown<R> extends GJDepthFirst<R,SymbolTable> { * f12 -> "}" */ public R visit(MethodDeclaration n, SymbolTable symt) { - String cls = symt.getActive(TypeEnum.classname); + ClassInstance cls = (ClassInstance) symt.getActive(TypeEnum.classname); - String id = n.f2.f0.tokenImage; + TokenKey id = new TokenKey(n.f2.f0.tokenImage, n.f2.f0.beginLine); MethodInstance me = symt.getMethod(id); - symt.setActive(TypeEnum.method, id); + symt.setActive(TypeEnum.method, me); symt.addMethod(id); - symt.addClassInstance(me, cls); + symt.addClassInstance(me, cls.getName()); n.f0.accept(this, symt); @@ -179,7 +181,7 @@ public class SymTableTopDown<R> extends GJDepthFirst<R,SymbolTable> { * f1 -> Identifier() */ public R visit(FormalParameter n, SymbolTable symt) { - String id = n.f1.f0.tokenImage; + TokenKey id = new TokenKey(n.f1.f0.tokenImage, n.f1.f0.beginLine); symt.addParameter(id); diff --git a/st/SymbolTable.java b/st/SymbolTable.java index 77b8a93..e6c4738 100644 --- a/st/SymbolTable.java +++ b/st/SymbolTable.java @@ -9,18 +9,19 @@ import misc.*; * of each symbol consistent. */ public class SymbolTable { - private HashMap<String,AbstractInstance> symt; // the mapping of ids to Instances - private HashMap<TypeEnum,String> active; // the current scope of the visitor (class, method) + private HashMap<TokenKey,AbstractInstance> symt; // the mapping of ids to Instances + private HashMap<TypeEnum,AbstractInstance> active; // the current scope of the visitor (class, method) public SymbolTable() { + MinimalLogger.info("Creating a new SymbolTable..."); this.symt = new HashMap<>(); this.active = new HashMap<>(); } @Override public String toString() { StringBuilder mapAsString = new StringBuilder("{"); - for (String key : this.symt.keySet()) { - mapAsString.append(key + ":" + this.symt.get(key).getType() + ", "); + for (TokenKey key : this.symt.keySet()) { + mapAsString.append(key.toString() + ":" + this.symt.get(key).getType() + ", "); } mapAsString.delete(mapAsString.length()-2, mapAsString.length()).append("}"); return mapAsString.toString(); @@ -30,7 +31,10 @@ public class SymbolTable { /** * Methods intended to be used during the first pass */ - public void put(String id, AbstractInstance symbol) { + public void put(TokenKey id, AbstractInstance symbol) { + MinimalLogger.info(String.format("Inserting %s -> %s", + id, + symbol.getType())); this.symt.put(id, symbol); } @@ -38,71 +42,87 @@ public class SymbolTable { /** * Methods intended to be used during the second pass */ - public void setExtend(String arg) { - String str = this.active.get(TypeEnum.classname); - ClassInstance cls = this.getClass(str); + public void setExtend(TokenKey arg) { + ClassInstance cls = (ClassInstance) this.active.get(TypeEnum.classname); ClassInstance ext = this.getClass(arg); + MinimalLogger.info(String.format("%s found to extend %s", + cls.getName(), + ext.getName())); cls.setExtend(ext); // for (TypeInstance : ext.attrs) //FIXME add the extended classes' stuff // cls.add } - public void addLocal(String lvar) { + public void addLocal(TokenKey lvar) { TypeInstance var = this.getType(lvar); + AbstractInstance par; if (this.active.get(TypeEnum.method) != null) { // we are in a method - String str = this.active.get(TypeEnum.method); - MethodInstance mtd = this.getMethod(str); - mtd.addLocal(var); - var.setScope(mtd); + MethodInstance par1 = (MethodInstance) this.active.get(TypeEnum.method); + par1.addLocal(var); + var.setScope(par1); + par = par1; } else { - String str = this.active.get(TypeEnum.classname); - ClassInstance cls = this.getClass(str); - cls.addLocal(var); - var.setScope(cls); + ClassInstance par1 = (ClassInstance) this.active.get(TypeEnum.classname); + par1.addLocal(var); + var.setScope(par1); + par = par1; } + MinimalLogger.info(String.format("Added %s (%s) as a local var of %s (%s)", + var.getName(), var.getType(), + par.getName(), par.getType())); } - public void addMethod(String mtd) { - String str = this.active.get(TypeEnum.classname); - ClassInstance cls = this.getClass(str); + public void addMethod(TokenKey mtd) { + ClassInstance cls = (ClassInstance) this.active.get(TypeEnum.classname); MethodInstance lmtd = this.getMethod(mtd); lmtd.setScope(cls); cls.addMethod(lmtd); + + MinimalLogger.info(String.format("Added %s as a method of %s", + lmtd.getName(), cls.getName())); } - public void addParameter(String arg) { - String str = this.active.get(TypeEnum.method); - MethodInstance mtd = this.getMethod(str); + public void addParameter(TokenKey arg) { + MethodInstance mtd = (MethodInstance) this.active.get(TypeEnum.method); TypeInstance para = this.getType(arg); para.setScope(mtd); mtd.addArgument(para); // also adds to local vars + + MinimalLogger.info(String.format("Added %s as a parameter of %s", + para.getName(), mtd.getName())); } public void addClassInstance(AbstractInstance t, String c) { ClassInstance cls = (c != null) ? - this.getClass(c) : + this.getClass(new TokenKey(c, 0)) : null; t.addClassInstance(cls); } - /** * Methods to safely retrieve differentiable types * in `typecheck', `vaporize' libraries */ - public void setActive(TypeEnum type, String id) { + public void setActive(TypeEnum type, AbstractInstance id) { + MinimalLogger.info(String.format("%s is now the active %s.", + id.getName(), + type)); this.active.put(type, id); } public void removeActive(TypeEnum type) { + AbstractInstance id = this.getActive(type); + MinimalLogger.info(String.format("%s is no longer the active %s.", + id.getName(), + type)); this.active.remove(type); } - public TypeInstance getType(String id) { + public TypeInstance getType(TokenKey id) { AbstractInstance symbol; TypeInstance ret = ((symbol = this.symt.get(id)) != null && symbol instanceof TypeInstance) ? @@ -113,7 +133,7 @@ public class SymbolTable { return ret; } - public MethodInstance getMethod(String id) { + public MethodInstance getMethod(TokenKey id) { AbstractInstance symbol; MethodInstance ret = ((symbol = this.symt.get(id)) != null && symbol instanceof MethodInstance) ? @@ -124,7 +144,7 @@ public class SymbolTable { return ret; } - public ClassInstance getClass(String id) { + public ClassInstance getClass(TokenKey id) { AbstractInstance symbol; ClassInstance ret = ((symbol = this.symt.get(id)) != null && symbol instanceof ClassInstance) ? @@ -135,7 +155,7 @@ public class SymbolTable { return ret; } - public String getActive(TypeEnum type) { + public AbstractInstance getActive(TypeEnum type) { return this.active.get(type); } diff --git a/st/TokenKey.java b/st/TokenKey.java new file mode 100644 index 0000000..2319917 --- /dev/null +++ b/st/TokenKey.java @@ -0,0 +1,45 @@ +package st; + +/** + * This class is a data structure used to distinguish tokens in + * a given program. Tokens are considered unique if their "beginLine" + * and name are different. + */ +public class TokenKey { + + private String name; + private int beginLine; + + public TokenKey(String name, int beginLine) { + // classes CANNOT collide, so CALLEES ARE EXPECTED TO USE ZERO! + this.name = name; + this.beginLine = beginLine; + } + + @Override public String toString() { + return String.format("%s (%d)", + this.name, + this.beginLine); + } + + + @Override public boolean equals(Object other) { + boolean ret = false; + TokenKey o; + if (other instanceof TokenKey && + (o = (TokenKey) other).name == this.name && + o.beginLine == this.beginLine) { + ret = true; + } + return ret; + } + + @Override public int hashCode() { + return this.name.hashCode(); + } + + public String getName() { + return this.name; + } + +} |