From 7775c18ab3cf9be049323f5270c07812b4f48da2 Mon Sep 17 00:00:00 2001 From: flyingalex <flyingalex@163.com> Date: Sat, 22 Feb 2020 22:43:39 +0800 Subject: [PATCH] add Resolver class --- Environment.cpp | 18 ++++- Environment.hpp | 5 +- Expr.hpp | 78 ++++++++++++------- Interpreter.cpp | 93 ++++++++++++++--------- Interpreter.hpp | 26 ++++--- Makefile | 5 +- Resolver.cpp | 197 ++++++++++++++++++++++++++++++++++++++++++++++++ Resolver.hpp | 61 +++++++++++++++ cpp_lox.files | 2 + lox.cpp | 7 +- test | Bin 61240 -> 222204 bytes test.cpp | 34 ++++----- test.lox | 16 ++-- 13 files changed, 436 insertions(+), 106 deletions(-) create mode 100644 Resolver.cpp create mode 100644 Resolver.hpp diff --git a/Environment.cpp b/Environment.cpp index 2409e7d..f496081 100644 --- a/Environment.cpp +++ b/Environment.cpp @@ -27,8 +27,12 @@ Object Environment::get(Token name) { throw RuntimeError(name, "Undefined variable '" + name.lexeme + "'."); } +Object Environment::getAt(int distance, string name) { + return ancestor(distance)->values[name]; +} + void Environment::assign(Token name, Object value) { - auto search = values.find(name.lexeme); + auto search = values.find(name.lexeme); if (search != values.end()) { search->second = value; return; @@ -39,4 +43,16 @@ void Environment::assign(Token name, Object value) { } throw RuntimeError(name, "Undefined variable '" + name.lexeme + "'."); +} + +void Environment::assignAt(int distance, Token name, Object value) { + ancestor(distance)->values[name.lexeme] = value; +} + +shared_ptr<Environment> Environment::ancestor(int distance) { + shared_ptr<Environment> environment = shared_from_this(); + for (int i = 0; i < distance; i++) { + environment = environment->enclosing; + } + return environment; } \ No newline at end of file diff --git a/Environment.hpp b/Environment.hpp index 740f31f..9929712 100644 --- a/Environment.hpp +++ b/Environment.hpp @@ -12,13 +12,16 @@ using std::map; using std::string; using std::shared_ptr; -class Environment { +class Environment: public std::enable_shared_from_this<Environment> { public: Environment() = default; explicit Environment(shared_ptr<Environment> enclosing); void define(string name, Object value); void assign(Token name, Object value); Object get(Token name); + Object getAt(int distance, string name); + void assignAt(int distance, Token name, Object value); + shared_ptr<Environment> ancestor(int distance); private: shared_ptr<Environment> enclosing; map<string, Object> values; diff --git a/Expr.hpp b/Expr.hpp index 2e841b5..50402fd 100644 --- a/Expr.hpp +++ b/Expr.hpp @@ -43,17 +43,17 @@ template <class R> class Visitor { public: virtual ~Visitor() = default; - virtual R visitLiteralExpr(const Literal<R>& expr) = 0; - virtual R visitAssignExpr(const Assign<R>& expr) = 0; - virtual R visitBinaryExpr(const Binary<R>& expr) = 0; - virtual R visitGroupingExpr(const Grouping<R>& expr) = 0; - virtual R visitUnaryExpr(const Unary<R>& expr) = 0; - virtual R visitVariableExpr(const Variable<R>& expr) = 0; - virtual R visitLogicalExpr(const Logical<R>& expr) = 0; - virtual R visitCallExpr(const Call<R>& expr) = 0; - // virtual string visitSetExpr(const Set& expr) = 0; - // virtual string visitSuperExpr(const Super& expr) = 0; - // virtual string visitThisExpr(const This& expr) = 0; + virtual R visitLiteralExpr(shared_ptr<Literal<R>> expr) = 0; + virtual R visitAssignExpr(shared_ptr<Assign<R>> expr) = 0; + virtual R visitBinaryExpr(shared_ptr<Binary<R>> expr) = 0; + virtual R visitGroupingExpr(shared_ptr<Grouping<R>> expr) = 0; + virtual R visitUnaryExpr(shared_ptr<Unary<R>> expr) = 0; + virtual R visitVariableExpr(shared_ptr<Variable<R>> expr) = 0; + virtual R visitLogicalExpr(shared_ptr<Logical<R>> expr) = 0; + virtual R visitCallExpr(shared_ptr<Call<R>> expr) = 0; + // virtual string visitSetExpr(Set& expr) = 0; + // virtual string visitSuperExpr(Super& expr) = 0; + // virtual string visitThisExpr(This& expr) = 0; }; template<class R> @@ -64,30 +64,39 @@ class Expr { }; template<class R> -class Literal: public Expr<R> { +class Literal: + public Expr<R>, + public std::enable_shared_from_this<Literal<R>> +{ public: explicit Literal(R value_): value(value_) { } R accept(shared_ptr<Visitor<R>> visitor) override { - return visitor->visitLiteralExpr(*this); + return visitor->visitLiteralExpr(this->shared_from_this()); } R value; }; template <class R> -class Assign: public Expr<R> { +class Assign: + public Expr<R>, + public std::enable_shared_from_this<Assign<R>> +{ public: Assign(Token name_, shared_ptr<Expr<R>> value_): name(name_), value(value_) {} R accept(shared_ptr<Visitor<R>> visitor) override { - return visitor->visitAssignExpr(*this); + return visitor->visitAssignExpr(this->shared_from_this()); } Token name; shared_ptr<Expr<R>> value; }; template <class R> -class Binary: public Expr<R> { +class Binary: + public Expr<R>, + public std::enable_shared_from_this<Binary<R>> +{ public: Binary( shared_ptr<Expr<R>> left_, @@ -96,7 +105,7 @@ class Binary: public Expr<R> { left(left_), operation(operation), right(right_) { } R accept(shared_ptr<Visitor<R>> visitor) override { - return visitor->visitBinaryExpr(*this); + return visitor->visitBinaryExpr(this->shared_from_this()); } shared_ptr<Expr<R>> left; Token operation; @@ -104,42 +113,54 @@ class Binary: public Expr<R> { }; template <class R> -class Grouping: public Expr<R> { +class Grouping: + public Expr<R>, + public std::enable_shared_from_this<Grouping<R>> +{ public: explicit Grouping(shared_ptr<Expr<R>> expression_): expression(expression_) { } R accept(shared_ptr<Visitor<R>> visitor) override { - return visitor->visitGroupingExpr(*this); + return visitor->visitGroupingExpr(this->shared_from_this()); } shared_ptr<Expr<R>> expression; }; template <class R> -class Unary: public Expr<R> { +class Unary: + public Expr<R>, + public std::enable_shared_from_this<Unary<R>> +{ public: Unary(Token operation, shared_ptr<Expr<R>> right_): operation(operation), right(right_) { } R accept(shared_ptr<Visitor<R>> visitor) override { - return visitor->visitUnaryExpr(*this); + return visitor->visitUnaryExpr(this->shared_from_this()); } Token operation; shared_ptr<Expr<R>> right; }; template <class R> -class Variable: public Expr<R> { +class Variable: + public Expr<R>, + public std::enable_shared_from_this<Variable<R>> +{ public: explicit Variable(Token name_): name(name_) { } R accept(shared_ptr<Visitor<R>> visitor) override { - return visitor->visitVariableExpr(*this); + return visitor->visitVariableExpr(this->shared_from_this()); }; Token name; }; template <class R> -class Logical: public Expr<R> { +class Logical: + public Expr<R>, + public std::enable_shared_from_this<Logical<R>> +{ public: Logical( shared_ptr<Expr<R>> left_, @@ -147,7 +168,7 @@ class Logical: public Expr<R> { shared_ptr<Expr<R>> right_): left(left_), operation(operation_), right(right_) { } R accept(shared_ptr<Visitor<R>> visitor) override { - return visitor->visitLogicalExpr(*this); + return visitor->visitLogicalExpr(this->shared_from_this()); }; shared_ptr<Expr<R>> left; Token operation; @@ -155,7 +176,10 @@ class Logical: public Expr<R> { }; template <class R> -class Call: public Expr<R> { +class Call: + public Expr<R>, + public std::enable_shared_from_this<Call<R>> +{ public: Call( shared_ptr<Expr<R>> callee_, @@ -163,7 +187,7 @@ class Call: public Expr<R> { vector<shared_ptr<Expr<R>>> arguments_): callee(callee_), paren(paren_), arguments(arguments_) { } R accept(shared_ptr<Visitor<R>> visitor) override { - return visitor->visitCallExpr(*this); + return visitor->visitCallExpr(this->shared_from_this()); } shared_ptr<Expr<R>> callee; Token paren; diff --git a/Interpreter.cpp b/Interpreter.cpp index 5d4717d..e7cb778 100644 --- a/Interpreter.cpp +++ b/Interpreter.cpp @@ -19,7 +19,6 @@ using std::stod; using std::shared_ptr; -using std::make_shared; using std::cout; using std::endl; using std::vector; @@ -53,26 +52,26 @@ string Interpreter::stringify(Object object) { } -Object Interpreter::visitLiteralExpr(const Literal<Object>& expr) { - switch (expr.value.type) { +Object Interpreter::visitLiteralExpr(shared_ptr<Literal<Object>> expr) { + switch (expr->value.type) { case Object::Object_bool: - return Object::make_bool_obj(expr.value.boolean); + return Object::make_bool_obj(expr->value.boolean); case Object::Object_nil: return Object::make_nil_obj(); case Object::Object_num: - return Object::make_num_obj(expr.value.num); + return Object::make_num_obj(expr->value.num); default: - return Object::make_str_obj(expr.value.str); + return Object::make_str_obj(expr->value.str); } } -Object Interpreter::visitGroupingExpr(const Grouping<Object>& expr) { - return evaluate(expr.expression); +Object Interpreter::visitGroupingExpr(shared_ptr<Grouping<Object>> expr) { + return evaluate(expr->expression); } -Object Interpreter::visitUnaryExpr(const Unary<Object>& expr) { - Object right = evaluate(expr.right); - switch (expr.operation.type) { +Object Interpreter::visitUnaryExpr(shared_ptr<Unary<Object>> expr) { + Object right = evaluate(expr->right); + switch (expr->operation.type) { case BANG: return Object::make_bool_obj(!isTruthy(right)); case MINUS: @@ -83,34 +82,34 @@ Object Interpreter::visitUnaryExpr(const Unary<Object>& expr) { } } -Object Interpreter::visitBinaryExpr(const Binary<Object>& expr) { - Object left = evaluate(expr.left); - Object right = evaluate(expr.right); +Object Interpreter::visitBinaryExpr(shared_ptr<Binary<Object>> expr) { + Object left = evaluate(expr->left); + Object right = evaluate(expr->right); bool result_bool = false; string result_str = ""; double result_num = 0; Object foo; - switch (expr.operation.type) { + switch (expr->operation.type) { case GREATER: - checkNumberOperands(expr.operation, left, right); + checkNumberOperands(expr->operation, left, right); result_bool = left.num > right.num; return Object::make_bool_obj(result_bool); case GREATER_EQUAL: - checkNumberOperands(expr.operation, left, right); + checkNumberOperands(expr->operation, left, right); result_bool = left.num >= right.num; return Object::make_bool_obj(result_bool); case LESS: - checkNumberOperands(expr.operation, left, right); + checkNumberOperands(expr->operation, left, right); result_bool = left.num < right.num; foo = Object::make_bool_obj(result_bool); foo = Object::make_bool_obj(result_bool); return Object::make_bool_obj(result_bool); case LESS_EQUAL: - checkNumberOperands(expr.operation, left, right); + checkNumberOperands(expr->operation, left, right); result_bool = left.num <= right.num; return Object::make_bool_obj(result_bool); case MINUS: - checkNumberOperand(expr.operation, right); + checkNumberOperand(expr->operation, right); result_num = left.num - right.num; return Object::make_num_obj(result_num); case PLUS: @@ -124,14 +123,14 @@ Object Interpreter::visitBinaryExpr(const Binary<Object>& expr) { result_str = left.toString() + right.toString(); return Object::make_str_obj(result_str); } - throw RuntimeError(expr.operation, + throw RuntimeError(expr->operation, "Operands must be two numbers or two strings."); case SLASH: - checkNumberOperands(expr.operation, left, right); + checkNumberOperands(expr->operation, left, right); result_num = left.num / right.num; return Object::make_num_obj(result_num); case STAR: - checkNumberOperands(expr.operation, left, right); + checkNumberOperands(expr->operation, left, right); result_num = left.num * right.num; return Object::make_num_obj(result_num); case BANG_EQUAL: return Object::make_bool_obj(!isEqual(left, right)); @@ -141,42 +140,58 @@ Object Interpreter::visitBinaryExpr(const Binary<Object>& expr) { } } -Object Interpreter::visitAssignExpr(const Assign<Object>& expr) { - Object value = evaluate(expr.value); - environment->assign(expr.name, value); +Object Interpreter::visitAssignExpr(shared_ptr<Assign<Object>> expr) { + Object value = evaluate(expr->value); + + // environment->assign(expr->name, value); + auto distance = locals.find(expr); + if (distance != locals.end()) { + environment->assignAt(distance->second, expr->name, value); + } else { + globals->assign(expr->name, value); + } return value; } -Object Interpreter::visitLogicalExpr(const Logical<Object>& expr) { - Object left = evaluate(expr.left); - if (expr.operation.type == OR) { +Object Interpreter::visitLogicalExpr(shared_ptr<Logical<Object>> expr) { + Object left = evaluate(expr->left); + if (expr->operation.type == OR) { if (isTruthy(left)) return left; } else { if (!isTruthy(left)) return left; } - return evaluate(expr.right); + return evaluate(expr->right); } -Object Interpreter::visitVariableExpr(const Variable<Object>& expr) { - return environment->get(expr.name); +Object Interpreter::visitVariableExpr(shared_ptr<Variable<Object>> expr) { + return lookUpVariable(expr->name, expr); } -Object Interpreter::visitCallExpr(const Call<Object>& expr) { - Object callee = evaluate(expr.callee); +Object Interpreter::lookUpVariable(Token name, shared_ptr<Variable<Object>> expr) { + auto distance = locals.find(expr); + if (distance != locals.end()) { + return environment->getAt(distance->second, name.lexeme); + } else { + return globals->get(name); + } +} + +Object Interpreter::visitCallExpr(shared_ptr<Call<Object>> expr) { + Object callee = evaluate(expr->callee); vector<Object> arguments; - for (auto argument : expr.arguments) { + for (auto argument : expr->arguments) { arguments.push_back(evaluate(argument)); } if (callee.type != Object::Object_fun) { - throw RuntimeError(expr.paren, + throw RuntimeError(expr->paren, "Can only call functions and classes."); } shared_ptr<LoxCallable> function = callee.function; if (arguments.size() != function->arity()) { - throw RuntimeError(expr.paren, "Expected " + + throw RuntimeError(expr->paren, "Expected " + to_string(function->arity()) + " arguments but got " + to_string(arguments.size()) + "."); } @@ -240,6 +255,10 @@ void Interpreter::execute(shared_ptr<Stmt> stmt) { stmt->accept(shared_from_this()); } +void Interpreter::resolve(shared_ptr<Expr<Object>> expr, int depth) { + locals[expr] = depth; +} + void Interpreter::executeBlock( vector<shared_ptr<Stmt>> statements, shared_ptr<Environment> env diff --git a/Interpreter.hpp b/Interpreter.hpp index aa1f40c..dba77b1 100644 --- a/Interpreter.hpp +++ b/Interpreter.hpp @@ -7,6 +7,7 @@ #include <utility> #include <string> #include <vector> +#include <map> #include "./Expr.hpp" #include "./Stmt.hpp" @@ -16,21 +17,23 @@ using std::shared_ptr; using std::string; using std::vector; +using std::map; class Interpreter: public Visitor<Object>, public Visitor_Stmt, - public std::enable_shared_from_this<Interpreter> { + public std::enable_shared_from_this<Interpreter> +{ public: void interpret(vector<shared_ptr<Stmt>> statements); - Object visitLiteralExpr(const Literal<Object>& expr); - Object visitAssignExpr(const Assign<Object>& expr); - Object visitBinaryExpr(const Binary<Object>& expr); - Object visitGroupingExpr(const Grouping<Object>& expr); - Object visitUnaryExpr(const Unary<Object>& expr); - Object visitVariableExpr(const Variable<Object>& expr); - Object visitLogicalExpr(const Logical<Object>& expr); - Object visitCallExpr(const Call<Object>& expr); + Object visitLiteralExpr(shared_ptr<Literal<Object>> expr); + Object visitAssignExpr(shared_ptr<Assign<Object>> expr); + Object visitBinaryExpr(shared_ptr<Binary<Object>> expr); + Object visitGroupingExpr(shared_ptr<Grouping<Object>> expr); + Object visitUnaryExpr(shared_ptr<Unary<Object>> expr); + Object visitVariableExpr(shared_ptr<Variable<Object>> expr); + Object visitLogicalExpr(shared_ptr<Logical<Object>> expr); + Object visitCallExpr(shared_ptr<Call<Object>> expr); void visitExpressionStmt(const Expression& stmt); void visitPrintStmt(const Print& stmt); void visitVarStmt(const Var& stmt); @@ -44,9 +47,11 @@ class Interpreter: shared_ptr<Environment> environment); shared_ptr<Environment> globals = shared_ptr<Environment>(new Environment()); + void resolve(shared_ptr<Expr<Object>> expr, int depth); private: shared_ptr<Environment> environment - = shared_ptr<Environment>(new Environment()); + = globals; + map<shared_ptr<Expr<Object>>, int> locals; Object evaluate(shared_ptr<Expr<Object>> expr); void execute(shared_ptr<Stmt> stmt); bool isTruthy(Object object); @@ -54,6 +59,7 @@ class Interpreter: void checkNumberOperand(Token operation, Object operand); void checkNumberOperands(Token operation, Object left, Object right); string stringify(Object object); + Object lookUpVariable(Token name, shared_ptr<Variable<Object>> expr); }; #endif // INTERPRETER_HPP_ diff --git a/Makefile b/Makefile index 4f28f04..7bafd9b 100644 --- a/Makefile +++ b/Makefile @@ -3,16 +3,17 @@ CXX = g++ all: main test demo +Resolver.o: Resolver.cpp Resolver.hpp Token.o: Token.cpp Token.hpp LoxFunction.o: LoxFunction.cpp LoxFunction.hpp Environment.o: Environment.cpp Environment.hpp Interpreter.o: Interpreter.cpp Interpreter.hpp Environment.o LoxFunction.o -lox.o: lox.cpp lox.hpp Interpreter.o +lox.o: lox.cpp lox.hpp Interpreter.o Resolver.o Parser.o: Parser.cpp Parser.hpp Scanner.o: Scanner.cpp Scanner.hpp AstPrinter.o: AstPrinter.hpp AstPrinter.cpp -main: main.cpp lox.o LoxFunction.o Token.o Scanner.o Parser.o Interpreter.o Environment.o +main: main.cpp lox.o LoxFunction.o Token.o Scanner.o Parser.o Interpreter.o Environment.o Resolver.o test: test.cpp AstPrinter.o Token.o demo: demo.cpp diff --git a/Resolver.cpp b/Resolver.cpp new file mode 100644 index 0000000..48f37c2 --- /dev/null +++ b/Resolver.cpp @@ -0,0 +1,197 @@ +// Copyright 2020.2.22 <Copyright hulin> + +#include <memory> +#include <vector> +#include <map> + +#include "./Stmt.hpp" +#include "./Expr.hpp" +#include "./Interpreter.hpp" +#include "./Resolver.hpp" +#include "./Token.hpp" +#include "./lox.hpp" + +using std::vector; +using std::map; +using std::shared_ptr; +using std::make_shared; + +Resolver::Resolver(shared_ptr<Interpreter> interpreter_): + interpreter(interpreter_) { } + +Object Resolver::visitLiteralExpr(shared_ptr<Literal<Object>> expr) { + return Object::make_nil_obj(); +} + +Object Resolver::visitAssignExpr(shared_ptr<Assign<Object>> expr) { + resolve(expr->value); + resolveLocal(expr, expr->name); + return Object::make_nil_obj(); +} + +Object Resolver::visitBinaryExpr(shared_ptr<Binary<Object>> expr) { + resolve(expr->left); + resolve(expr->right); + return Object::make_nil_obj(); +} + +Object Resolver::visitGroupingExpr(shared_ptr<Grouping<Object>> expr) { + resolve(expr->expression); + return Object::make_nil_obj(); +} + +Object Resolver::visitUnaryExpr(shared_ptr<Unary<Object>> expr) { + resolve(expr->right); + return Object::make_nil_obj(); +} + +Object Resolver::visitVariableExpr(shared_ptr<Variable<Object>> expr) { + if (scopes.size() != 0) { + auto last = scopes.back(); + auto searched = last.find(expr->name.lexeme); + if (searched != last.end() && !searched->second) { + lox::error(expr->name.line, + "Cannot read local variable in its own initializer."); + } + } + resolveLocal(expr, expr->name); + return Object::make_nil_obj(); +} + +Object Resolver::visitLogicalExpr(shared_ptr<Logical<Object>> expr) { + resolve(expr->left); + resolve(expr->right); + return Object::make_nil_obj(); +} + +Object Resolver::visitCallExpr(shared_ptr<Call<Object>> expr) { + resolve(expr->callee); + + for (auto argument : expr->arguments) { + resolve(argument); + } + return Object::make_nil_obj(); +} + +void Resolver::visitExpressionStmt(const Expression& stmt) { + resolve(stmt.expression); +} + +void Resolver::visitPrintStmt(const Print& stmt) { + resolve(stmt.expression); +} + +void Resolver::visitVarStmt(const Var& stmt) { + declare(stmt.name); + if (stmt.initializer != nullptr) { + resolve(stmt.initializer); + } + define(stmt.name); +} + +void Resolver::visitBlockStmt(const Block& stmt) { + beginScope(); + resolve(stmt.statements); + endScope(); +} + +void Resolver::visitIfStmt(const If& stmt) { + resolve(stmt.condition); + resolve(stmt.thenBranch); + if (stmt.elseBranch != nullptr) { + resolve(stmt.elseBranch); + } +} + +void Resolver::visitWhileStmt(const While& stmt) { + resolve(stmt.condition); + resolve(stmt.body); +} + +void Resolver::visitFunctionStmt(const Function& stmt) { + declare(stmt.name); + define(stmt.name); + resolveFunction(stmt, FUNCTION); +} + +void Resolver::visitReturnStmt(const Return& stmt) { + if (currentFunction == NONE) { + lox::error(stmt.name.line, "Cannot return from top-level code."); + } + + if (stmt.value != nullptr) { + resolve(stmt.value); + } +} + + +void Resolver::beginScope() { + map<string, bool> m; + scopes.push_back(m); +} + +void Resolver::endScope() { + scopes.pop_back(); +} + +void Resolver::resolve(vector<shared_ptr<Stmt>> statements) { + for (auto statement : statements) { + resolve(statement); + } +} + +void Resolver::resolve(shared_ptr<Stmt> stmt) { + stmt->accept(shared_from_this()); +} + +void Resolver::resolve(shared_ptr<Expr<Object>> expr) { + expr->accept(shared_from_this()); +} + +void Resolver::declare(Token name) { + if (scopes.empty()) return; + map<string, bool> scope = scopes.back(); + if (scope.find(name.lexeme) != scope.end()) { + lox::error(name.line, + "Variable with this name already declared in this scope."); + } + scope[name.lexeme] = false; + scopes.pop_back(); + scopes.emplace_back(scope); +} + +void Resolver::define(Token name) { + if (scopes.empty()) return; + map<string, bool> scope = scopes.back(); + scope[name.lexeme] = true; + scopes.pop_back(); + scopes.emplace_back(scope); +} + +void Resolver::resolveLocal(shared_ptr<Expr<Object>> expr, Token name) { + for (int i = scopes.size() - 1; i >= 0; i--) { + auto searched = scopes[i].find(name.lexeme); + if (searched != scopes[i].end()) { + interpreter->resolve(expr, scopes.size() - 1 - i); + return; + } + } + // Not found. Assume it is global. +} + +void Resolver::resolveFunction( + Function function, + FunctionType type +) { + FunctionType enclosingFunction = currentFunction; + currentFunction = type; + + beginScope(); + for (Token param : function.params) { + declare(param); + define(param); + } + resolve(function.body); + endScope(); + currentFunction = enclosingFunction; +} \ No newline at end of file diff --git a/Resolver.hpp b/Resolver.hpp new file mode 100644 index 0000000..af25f90 --- /dev/null +++ b/Resolver.hpp @@ -0,0 +1,61 @@ +// Copyright 2020.2.22 <Copyright hulin> +#ifndef RESOLVER_HPP_ +#define RESOLVER_HPP_ + +#include <memory> +#include <vector> +#include <string> +#include <map> + +#include "./Stmt.hpp" +#include "./Expr.hpp" +#include "./Interpreter.hpp" +#include "./Token.hpp" + +using std::shared_ptr; +using std::vector; +using std::string; +using std::map; + +class Resolver: + public Visitor<Object>, + public Visitor_Stmt, + public std::enable_shared_from_this<Resolver> { + public: + vector<map<string, bool>> scopes; + shared_ptr<Interpreter> interpreter; + explicit Resolver(shared_ptr<Interpreter> interpreter); + Object visitLiteralExpr(shared_ptr<Literal<Object>> expr); + Object visitAssignExpr(shared_ptr<Assign<Object>> expr); + Object visitBinaryExpr(shared_ptr<Binary<Object>> expr); + Object visitGroupingExpr(shared_ptr<Grouping<Object>> expr); + Object visitUnaryExpr(shared_ptr<Unary<Object>> expr); + Object visitVariableExpr(shared_ptr<Variable<Object>> expr); + Object visitLogicalExpr(shared_ptr<Logical<Object>> expr); + Object visitCallExpr(shared_ptr<Call<Object>> expr); + void visitExpressionStmt(const Expression& stmt); + void visitPrintStmt(const Print& stmt); + void visitVarStmt(const Var& stmt); + void visitBlockStmt(const Block& stmt); + void visitIfStmt(const If& stmt); + void visitWhileStmt(const While& stmt); + void visitFunctionStmt(const Function& stmt); + void visitReturnStmt(const Return& stmt); + void resolve(vector<shared_ptr<Stmt>> statements); + void resolve(shared_ptr<Stmt> stmt); + void resolve(shared_ptr<Expr<Object>> expr); + private: + enum FunctionType { + NONE, + FUNCTION + }; + FunctionType currentFunction = NONE; + void beginScope(); + void endScope(); + void declare(Token name); + void define(Token name); + void resolveLocal(shared_ptr<Expr<Object>>, Token name); + void resolveFunction(Function function, FunctionType type); +}; + +#endif // RESOLVER_HPP_ diff --git a/cpp_lox.files b/cpp_lox.files index af42267..184e433 100644 --- a/cpp_lox.files +++ b/cpp_lox.files @@ -12,6 +12,8 @@ ReturnError.hpp LoxCallable.hpp LoxFunction.cpp LoxFunction.hpp +Resolver.hpp +Resolver.cpp Scanner.cpp Scanner.hpp Stmt.hpp diff --git a/lox.cpp b/lox.cpp index a20580e..c68f297 100644 --- a/lox.cpp +++ b/lox.cpp @@ -14,6 +14,7 @@ #include "./Stmt.hpp" #include "./Interpreter.hpp" #include "./RuntimeError.hpp" +#include "./Resolver.hpp" using std::string; @@ -73,7 +74,7 @@ void lox::run(string source) { shared_ptr<Scanner> scannerObj(new Scanner(source)); vector<Token> tokens = scannerObj->scanTokens(); // for (auto token : tokens) { - // cout << token.toString() << endl; + // cout << token.toString() << endl; // } shared_ptr<Parser> parser(new Parser(tokens)); vector<shared_ptr<Stmt>> statements = parser->parse(); @@ -83,6 +84,10 @@ void lox::run(string source) { cout << "no value" << endl; } else { shared_ptr<Interpreter> interpreter(new Interpreter()); + shared_ptr<Resolver> resolver(new Resolver(interpreter)); + resolver->resolve(statements); + // Stop if there was a resolution error. + if (hadError) return; interpreter->interpret(statements); } } diff --git a/test b/test index a390db8bb6205872b2525acc9a78ecfe8bdf9f16..6dc42884dae7f208cabbe1edabdfca277e48a115 100755 GIT binary patch literal 222204 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 delta 11077 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 OGaUC0yxe)#kpBVChW+>e diff --git a/test.cpp b/test.cpp index 8243ab7..fec4704 100644 --- a/test.cpp +++ b/test.cpp @@ -2,39 +2,39 @@ #include <iostream> #include <string> #include <memory> +#include <map> #include <algorithm> #include <exception> +#include <vector> using std::cout; using std::endl; using std::shared_ptr; using std::string; - -class Bar; +using std::map; +using std::vector; class Foo { public: - Bar* bar; - explicit Foo(Bar* bar_); + int foo; + explicit Foo(int foo_); string foo_str = "foo"; string hey(); }; - -class Bar { - public: - Foo* foo; - explicit Bar(Foo* foo_): foo(foo_) { } - string bar_str = "foo"; - string hey() { - return foo->foo_str; - } -}; - -Foo::Foo(Bar* bar_):bar(bar_) { } +Foo::Foo(int foo_):foo(foo_) { } string Foo::hey() { - return bar->bar_str; + return foo_str; } int main(int argc, char const *argv[]) { + vector<map<string, int>> scopes; + map<string, int> m; + scopes.push_back(m); + auto res = scopes[scopes.size() - 1]; + res["hello"] = 10; + scopes.emplace_back(res); + auto res2 = scopes[scopes.size() - 1]; + cout << res["hello"] << endl; + cout << res2["hello"] << endl; return 0; } diff --git a/test.lox b/test.lox index b0d7cd4..9d74ecc 100644 --- a/test.lox +++ b/test.lox @@ -1,13 +1,9 @@ -fun makeCounter() { - var i = 0; - fun count() { - i = i + 1; - print i; +fun count(n) { + while (n < 10) { + if (n == 3) return n; + print n; + n = n + 1; } - - return count; } -var counter = makeCounter(); -counter(); // "1". -counter(); // "2". \ No newline at end of file +count(1); \ No newline at end of file