summaryrefslogtreecommitdiff
path: root/st/SymbolTable.java
diff options
context:
space:
mode:
authorbd-912 <bdunahu@colostate.edu>2024-04-06 20:00:31 -0600
committerbd-912 <bdunahu@colostate.edu>2024-04-06 20:00:31 -0600
commit8e660afb356c1f6d0b9cd115426cf21129e5d304 (patch)
treea8c885c83b138762ca51af640355048bc305b437 /st/SymbolTable.java
parentb03859dce5991169b07d1d5040c8faf7ba82e5b5 (diff)
Untested SymbolTable full implementation
Diffstat (limited to 'st/SymbolTable.java')
-rw-r--r--st/SymbolTable.java77
1 files changed, 66 insertions, 11 deletions
diff --git a/st/SymbolTable.java b/st/SymbolTable.java
index 0757541..d6bba37 100644
--- a/st/SymbolTable.java
+++ b/st/SymbolTable.java
@@ -2,12 +2,18 @@ package st;
import java.util.*;
+/**
+ * Class which provides methods for interacting with and managing
+ * the symbol table. Maintains context-awareness to keep the state
+ * of each symbol consistent.
+ */
public class SymbolTable {
-
- private HashMap<String,AbstractInstance> symt;
+ private HashMap<String,AbstractInstance> symt; // the mapping of ids to Instances
+ private HashMap<TypeEnum,String> active; // the current scope of the visitor (class, method)
public SymbolTable() {
this.symt = new HashMap<>();
+ this.active = new HashMap<>();
}
public String toString() {
@@ -19,32 +25,81 @@ public class SymbolTable {
return mapAsString.toString();
}
- public void addMethod() {
- this.
- }
+ /**
+ * Methods intended to be used during the first pass
+ */
public void put(String id, AbstractInstance symbol) {
this.symt.put(id, symbol);
}
- public TypeInstance getType(String index) {
+
+ /**
+ * Methods intended to be used during the second pass
+ */
+ public void setActive(TypeEnum type, String id) {
+ this.active.put(type, id);
+ }
+
+ public void addAttribute(String arg) {
+ String str = this.active.get(TypeEnum.classname);
+ ClassInstance cls = this.getClass(str);
+ TypeInstance attr = this.getType(arg);
+
+ attr.setScope(cls);
+ cls.addAttribute(attr);
+ }
+
+ public void addMethod(String mtd) {
+ String str = this.active.get(TypeEnum.classname);
+ ClassInstance cls = this.getClass(str);
+ MethodInstance lmtd = this.getMethod(mtd);
+
+ lmtd.setScope(cls);
+ cls.addMethod(lmtd);
+ }
+
+ public void addParameter(String arg) {
+ String str = this.active.get(TypeEnum.method);
+ MethodInstance mtd = this.getMethod(str);
+ TypeInstance para = this.getType(arg);
+
+ para.setScope(mtd);
+ mtd.addArgument(para); // also adds to local vars
+ }
+
+ public void addLocal(String lvar) {
+ String str = this.active.get(TypeEnum.method);
+ MethodInstance mtd = this.getMethod(str);
+ TypeInstance var = this.getType(lvar);
+
+ var.setScope(mtd);
+ mtd.addArgument(var);
+ }
+
+
+ /**
+ * Methods to safely retrieve differentiable types
+ * in `typecheck', `vaporize' libraries
+ */
+ public TypeInstance getType(String id) {
AbstractInstance symbol;
- return ((symbol = this.symt.get(index)) !=
+ return ((symbol = this.symt.get(id)) !=
null && symbol.getType() != TypeEnum.classname &&
symbol.getType() != TypeEnum.method) ?
(TypeInstance) symbol : null;
}
- public MethodInstance getMethod(String index) {
+ public MethodInstance getMethod(String id) {
AbstractInstance symbol;
- return ((symbol = this.symt.get(index)) !=
+ return ((symbol = this.symt.get(id)) !=
null && symbol.getType() == TypeEnum.method) ?
(MethodInstance) symbol : null;
}
- public ClassInstance getClass(String index) {
+ public ClassInstance getClass(String id) {
AbstractInstance symbol;
- return ((symbol = this.symt.get(index)) !=
+ return ((symbol = this.symt.get(id)) !=
null && symbol.getType() == TypeEnum.classname) ?
(ClassInstance) symbol : null;
}