From 6b771591b674bad3a0acb5c02883897a7c2398ea Mon Sep 17 00:00:00 2001 From: Recolic Keghart <root@recolic.net> Date: Mon, 8 Apr 2019 19:57:55 -0700 Subject: [PATCH] nonlocal_forward pass --- src/main/java/chocopy/pa2/TypeChecker.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/chocopy/pa2/TypeChecker.java b/src/main/java/chocopy/pa2/TypeChecker.java index 1a24a45..4fc8662 100644 --- a/src/main/java/chocopy/pa2/TypeChecker.java +++ b/src/main/java/chocopy/pa2/TypeChecker.java @@ -196,7 +196,6 @@ public class TypeChecker extends AbstractNodeAnalyzer<SymbolType> { public SymbolType analyze(GlobalDecl globalDecl) { String name = globalDecl.variable.name; SymbolType T = globals.get(name); - System.out.println("DEBUG< GOL< " + isBuildingSym + " buildingSym, name=" + name + ", Type=" + T); if(T == null) { if(isBuildingSym) return OBJECT_TYPE; // workaround for fucking use-before-decl @@ -213,14 +212,16 @@ public class TypeChecker extends AbstractNodeAnalyzer<SymbolType> { @Override public SymbolType analyze(NonLocalDecl nonLocalDecl) { String name = nonLocalDecl.variable.name; - SymbolType T = sym.get(name); // auto-iterate through the tree. + if(sym.getParent() == null) { + errors.semError(nonLocalDecl, "nonlocal declaration '" + name + "' not allowed in global scope."); + } + SymbolType T = sym.getParent().get(name); // auto-iterate through the tree. + System.out.println("DEBUG< NONL< " + isBuildingSym + " buildingSym, name=" + name + ", Type=" + T); if(T == null) { if(isBuildingSym) return OBJECT_TYPE; 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."); if(!isBuildingSym) // dirty! see comment in StudentAnalysis.java sym.overwrite_put(name, T); -- GitLab