diff --git a/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java b/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java index 420b562..e590564 100644 --- a/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java +++ b/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java @@ -213,11 +213,11 @@ public class Interpreter implements Expr.Visitor, Stmt.Visitor { var msg = "Expected %d arguments but got %d.".formatted(function.arity(), arguments.size()); throw new RuntimeError(expr.paren(), msg); } + + return function.call(this, arguments); } else { throw new RuntimeError(expr.paren(), "Can only call functions and classes."); } - - return function.call(this, arguments); } @Override diff --git a/jlox/lox/src/main/java/xyz/ctsk/lox/Parser.java b/jlox/lox/src/main/java/xyz/ctsk/lox/Parser.java index 494b482..401c4e0 100644 --- a/jlox/lox/src/main/java/xyz/ctsk/lox/Parser.java +++ b/jlox/lox/src/main/java/xyz/ctsk/lox/Parser.java @@ -354,6 +354,7 @@ public class Parser { } else if (match(DOT)) { Token name = consume(IDENTIFIER, "Expect property name after '.'."); expr = new Expr.Get(expr, name); + } else { break; } } diff --git a/jlox/lox/src/main/java/xyz/ctsk/lox/Resolver.java b/jlox/lox/src/main/java/xyz/ctsk/lox/Resolver.java index 00c7fa2..b98fbeb 100644 --- a/jlox/lox/src/main/java/xyz/ctsk/lox/Resolver.java +++ b/jlox/lox/src/main/java/xyz/ctsk/lox/Resolver.java @@ -9,12 +9,11 @@ import java.util.Stack; public class Resolver implements Expr.Visitor, Stmt.Visitor { private final Interpreter interpreter; private final Stack> scopes = new Stack<>(); - private FunctionType currentFuntion = FunctionType.NONE; - - private enum ClassType { NONE, CLASS } + private FunctionType currentFunction = FunctionType.NONE; private ClassType currentClass = ClassType.NONE; + private enum ClassType { NONE, CLASS } Resolver(Interpreter interpreter) { this.interpreter = interpreter; @@ -56,8 +55,8 @@ public class Resolver implements Expr.Visitor, Stmt.Visitor { } private void resolveFunction(Stmt.Function function, FunctionType functionType) { - var enclosingFunction = currentFuntion; - currentFuntion = functionType; + var enclosingFunction = currentFunction; + currentFunction = functionType; beginScope(); for (var param : function.params()) { declare(param); @@ -65,7 +64,7 @@ public class Resolver implements Expr.Visitor, Stmt.Visitor { } resolve(function.body()); endScope(); - currentFuntion = enclosingFunction; + currentFunction = enclosingFunction; } @@ -142,12 +141,12 @@ public class Resolver implements Expr.Visitor, Stmt.Visitor { @Override public Void visitReturnStmt(Stmt.Return stmt) { - if (currentFuntion == FunctionType.NONE) { + if (currentFunction == FunctionType.NONE) { Lox.error(stmt.keyword(), "Can't return fom top-level code."); } if (stmt.value() != null) { - if (currentFuntion == FunctionType.INITIALIZER) { + if (currentFunction == FunctionType.INITIALIZER) { Lox.error(stmt.keyword(), "Can't return a value from an initializer."); } resolve(stmt.value()); diff --git a/jlox/lox/src/test/java/xyz/ctsk/lox/ResolverTest.java b/jlox/lox/src/test/java/xyz/ctsk/lox/ResolverTest.java deleted file mode 100644 index 4c04dc1..0000000 --- a/jlox/lox/src/test/java/xyz/ctsk/lox/ResolverTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package xyz.ctsk.lox; - -import org.junit.jupiter.api.Test; - -import java.io.IOException; - -public class ResolverTest { - @Test - void forLoopBug() throws IOException { - var canary = this.getClass().getResource("ResolverBug.lox").getPath(); - Lox.runFile(canary); - } -} diff --git a/jlox/lox/src/test/resources/xyz/ctsk/lox/ResolverBug.lox b/jlox/lox/src/test/resources/xyz/ctsk/lox/ResolverBug.lox deleted file mode 100644 index 34cfc7e..0000000 --- a/jlox/lox/src/test/resources/xyz/ctsk/lox/ResolverBug.lox +++ /dev/null @@ -1 +0,0 @@ -for (var i = 0; i < 2; i = i + 1) print i; \ No newline at end of file