diff options
| author | bd-912 <bdunahu@colostate.edu> | 2024-04-25 12:58:10 -0600 | 
|---|---|---|
| committer | bd-912 <bdunahu@colostate.edu> | 2024-04-25 12:58:10 -0600 | 
| commit | c28a1cc9d206bdde41a621b018c01980b3c8a617 (patch) | |
| tree | 90e9de370313682558172c8cebac9389b48c0855 /st/SymTableMethods.java | |
| parent | bd44adf2b180fcc1198d612a8ae0d2a28468088d (diff) | |
Rewrote Symbol Table to be more context aware and avoid collisions
Diffstat (limited to 'st/SymTableMethods.java')
| -rw-r--r-- | st/SymTableMethods.java | 169 | 
1 files changed, 169 insertions, 0 deletions
diff --git a/st/SymTableMethods.java b/st/SymTableMethods.java new file mode 100644 index 0000000..6dc7d68 --- /dev/null +++ b/st/SymTableMethods.java @@ -0,0 +1,169 @@ +package st; + +import syntaxtree.*; +import visitor.*; +import java.util.*; +import misc.*; + +/** + * Performs a bottom-up preliminary visit through the AST + * initializing all Instances and placing them in the passed ST + */ +public class SymTableMethods<R> extends GJDepthFirst<R,SymbolTable> { + +    /** +     * f0 -> "class" +     * f1 -> Identifier() +     * f2 -> "{" +     * f3 -> "public" +     * f4 -> "static" +     * f5 -> "void" +     * f6 -> "main" +     * f7 -> "(" +     * f8 -> "String" +     * f9 -> "[" +     * f10 -> "]" +     * f11 -> Identifier() +     * f12 -> ")" +     * f13 -> "{" +     * f14 -> ( VarDeclaration() )* +     * f15 -> ( Statement() )* +     * f16 -> "}" +     * f17 -> "}" +     */ +    public R visit(MainClass n, SymbolTable symt) { +        String act = n.f1.f0.tokenImage; +        symt.setActive(TypeEnum.classname, symt.getClass(act)); +        n.f0.accept(this, symt); +        n.f1.accept(this, symt); +        n.f2.accept(this, symt); +        n.f3.accept(this, symt); +        n.f4.accept(this, symt); +        n.f5.accept(this, symt); +        n.f6.accept(this, symt); +        n.f7.accept(this, symt); +        n.f8.accept(this, symt); +        n.f9.accept(this, symt); +        n.f10.accept(this, symt); +        n.f11.accept(this, symt); +        n.f12.accept(this, symt); +        n.f13.accept(this, symt); +        n.f14.accept(this, symt); +        n.f15.accept(this, symt); +        n.f16.accept(this, symt); +        n.f17.accept(this, symt); + +        TokenKey id = new TokenKey(n.f6.tokenImage, (ClassInstance) symt.getActive(TypeEnum.classname), null); +        MethodInstance main = new MethodInstance(id.getName(), TypeEnum.ERROR, (ClassInstance) symt.getActive(TypeEnum.classname)); +        symt.put(id, main); + + +        symt.removeActive(TypeEnum.classname); +        return null; +    } + +    /** +     * f0 -> "class" +     * f1 -> Identifier() +     * f2 -> "{" +     * f3 -> ( VarDeclaration() )* +     * f4 -> ( MethodDeclaration() )* +     * f5 -> "}" +     */ +    public R visit(ClassDeclaration n, SymbolTable symt) { +        String act = n.f1.f0.tokenImage; +        symt.setActive(TypeEnum.classname, symt.getClass(act)); +        n.f0.accept(this, symt); +        n.f1.accept(this, symt); +        n.f2.accept(this, symt); +        n.f3.accept(this, symt); +        n.f4.accept(this, symt); +        n.f5.accept(this, symt); + + +        symt.removeActive(TypeEnum.classname); +        return null; +    } + +    /** +     * f0 -> "class" +     * f1 -> Identifier() +     * f2 -> "extends" +     * f3 -> Identifier() +     * f4 -> "{" +     * f5 -> ( VarDeclaration() )* +     * f6 -> ( MethodDeclaration() )* +     * f7 -> "}" +     */ +    public R visit(ClassExtendsDeclaration n, SymbolTable symt) { +        String act = n.f1.f0.tokenImage; +        symt.setActive(TypeEnum.classname, symt.getClass(act)); +        n.f0.accept(this, symt); +        n.f1.accept(this, symt); +        n.f2.accept(this, symt); +        n.f3.accept(this, symt); +        n.f4.accept(this, symt); +        n.f5.accept(this, symt); +        n.f6.accept(this, symt); +        n.f7.accept(this, symt); + + +        symt.removeActive(TypeEnum.classname); +        return null; +    } + +    /** +     * f0 -> "public" +     * f1 -> Type() +     * f2 -> Identifier() +     * f3 -> "(" +     * f4 -> ( FormalParameterList() )? +     * f5 -> ")" +     * f6 -> "{" +     * f7 -> ( VarDeclaration() )* +     * f8 -> ( Statement() )* +     * f9 -> "return" +     * f10 -> Expression() +     * f11 -> ";" +     * f12 -> "}" +     */ +    public R visit(MethodDeclaration n, SymbolTable symt) { +        n.f0.accept(this, symt); +        n.f1.accept(this, symt); +        n.f2.accept(this, symt); +        n.f3.accept(this, symt); +        n.f4.accept(this, symt); +        n.f5.accept(this, symt); +        n.f6.accept(this, symt); +        n.f7.accept(this, symt); +        n.f8.accept(this, symt); +        n.f9.accept(this, symt); +        n.f10.accept(this, symt); +        n.f11.accept(this, symt); +        n.f12.accept(this, symt); + + + +        TokenKey id = new TokenKey(n.f2.f0.tokenImage, (ClassInstance) symt.getActive(TypeEnum.classname), null); +        TypeEnum rtrn = TypeEnum.ERROR; +        switch (n.f1.f0.which) { +        case 0: +            rtrn = TypeEnum.intarray; break; +        case 1: +            rtrn = TypeEnum.bool; break; +        case 2: +            rtrn = TypeEnum.integer; break; +        case 3: +            rtrn = TypeEnum.classname; break; +        default: +            MinimalLogger.severe("Unsupported case"); +        } + +        MethodInstance instance = new MethodInstance(id.getName(), rtrn, (ClassInstance) symt.getActive(TypeEnum.classname)); +        symt.put(id, instance); + + +        return null; +    } + +}  | 
