From 580a5acb580a858c8ffa705f5f64f095cb0b4b37 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Wed, 17 Mar 2021 22:52:35 -0700 Subject: Chapter 12, Sections 1, 2, and 3 --- src/com/craftinginterpreters/lox/Interpreter.java | 31 +++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/com/craftinginterpreters/lox/Interpreter.java') diff --git a/src/com/craftinginterpreters/lox/Interpreter.java b/src/com/craftinginterpreters/lox/Interpreter.java index 4092191..5c1ea50 100644 --- a/src/com/craftinginterpreters/lox/Interpreter.java +++ b/src/com/craftinginterpreters/lox/Interpreter.java @@ -49,6 +49,19 @@ class Interpreter implements Expr.Visitor, Stmt.Visitor { return evaluate(expr.right); } + @Override + public Object visitSetExpr(Expr.Set expr) { + Object object = evaluate(expr.object); + + if (!(object instanceof LoxInstance)) { + throw new RuntimeError(expr.name, "Only instances have fields."); + } + + Object value = evaluate(expr.value); + ((LoxInstance) object).set(expr.name, value); + return value; + } + @Override public Object visitUnaryExpr(Expr.Unary expr) { Object right = evaluate(expr.right); @@ -161,6 +174,14 @@ class Interpreter implements Expr.Visitor, Stmt.Visitor { return null; } + @Override + public Void visitClassStmt(Stmt.Class stmt) { + environment.define(stmt.name.lexeme, null); + LoxClass klass = new LoxClass(stmt.name.lexeme); + environment.assign(stmt.name, klass); + return null; + } + @Override public Void visitExpressionStmt(Stmt.Expression stmt) { evaluate(stmt.expression); @@ -304,6 +325,16 @@ class Interpreter implements Expr.Visitor, Stmt.Visitor { return function.call(this, arguments); } + @Override + public Object visitGetExpr(Expr.Get expr) { + Object object = evaluate(expr.object); + if (object instanceof LoxInstance) { + return ((LoxInstance) object).get(expr.name); + } + + throw new RuntimeError(expr.name, "Only instances have properties."); + } + public void interpret(List statements) { try { for (Stmt statement : statements) { -- cgit v1.2.3-54-g00ecf