diff options
author | bd-912 <bdunahu@colostate.edu> | 2024-04-06 20:00:31 -0600 |
---|---|---|
committer | bd-912 <bdunahu@colostate.edu> | 2024-04-06 20:00:31 -0600 |
commit | 8e660afb356c1f6d0b9cd115426cf21129e5d304 (patch) | |
tree | a8c885c83b138762ca51af640355048bc305b437 /st/SymbolTable.java | |
parent | b03859dce5991169b07d1d5040c8faf7ba82e5b5 (diff) |
Untested SymbolTable full implementation
Diffstat (limited to 'st/SymbolTable.java')
-rw-r--r-- | st/SymbolTable.java | 77 |
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; } |