diff --git a/src/main/java/chocopy/pa2/DeclarationAnalyzer.java b/src/main/java/chocopy/pa2/DeclarationAnalyzer.java index 839bf960b6013de6f9d49bddab13c254eaa4a4d6..8a135a4e8a1cfa868ac3b62a8a6dfd1b555ffbee 100644 --- a/src/main/java/chocopy/pa2/DeclarationAnalyzer.java +++ b/src/main/java/chocopy/pa2/DeclarationAnalyzer.java @@ -60,7 +60,6 @@ public class DeclarationAnalyzer extends AbstractNodeAnalyzer<SymbolType> { @Override public SymbolType analyze(ClassDef classDef) { System.out.println("debug: classdef"); - // TODO: check how do I create a obj type. return new ClassValueType(classDef.name.name); } @@ -69,6 +68,7 @@ public class DeclarationAnalyzer extends AbstractNodeAnalyzer<SymbolType> { System.out.println("debug: start funcDef: " + funcDef.getClass().getName()); assert funcDef.symTable == null; sym = funcDef.symTable = new SymbolTable<SymbolType>(sym); + assert funcDef.symTable != null; // may suck if partial-compiling happens... // Func parameter list for(TypedVar param : funcDef.params) { @@ -85,6 +85,30 @@ public class DeclarationAnalyzer extends AbstractNodeAnalyzer<SymbolType> { return new FuncType(ValueType.annotationToValueType(funcDef.returnType)); } + @Override + public SymbolType analyze(GlobalDecl globalDecl) { + String name = globalDecl.variable.name; + SymbolType T = globals.get(name); + if(T == null) + errors.semError(globalDecl, "global id '" + name + "' not found in global scope.."); + if(sym == globals) + errors.semError(globalDecl, "global declaration '" + name + "' not allowed in global scope."); + //sym.put(name, T); + return T; + } + + @Override + public SymbolType analyze(NonLocalDecl nonLocalDecl) { + String name = nonLocalDecl.variable.name; + SymbolType T = sym.get(name); // auto-iterate through the tree. + if(T == null) + errors.semError(nonLocalDecl, "nonlocal id '" + name + "' not found in parent scope.."); + if(sym == globals) + errors.semError(nonLocalDecl, "nonlocal declaration '" + name + "' not allowed in global scope."); + return T; + } + + // Just a helper.. @Override public SymbolType analyze(TypedVar node) { return ValueType.annotationToValueType(node.type);