summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd-912 <bdunahu@colostate.edu>2024-04-25 00:17:56 -0600
committerbd-912 <bdunahu@colostate.edu>2024-04-25 00:18:51 -0600
commit765337c53286db39ffc3c64eede602afe3899647 (patch)
tree893b488f70b22c4d18cec6934ed479feb0943b54
parentd2017d232557b45792857b972ca8883df6e79506 (diff)
Rewrote SymbolTable to add uniqueness to stored tokens
-rw-r--r--st/SymTableBottomUp.java36
-rw-r--r--st/SymTableTopDown.java32
-rw-r--r--st/SymbolTable.java80
-rw-r--r--st/TokenKey.java45
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;
+ }
+
+}