From 503d2a0ffdf49ae41083e76588e7d3b469e3df2a Mon Sep 17 00:00:00 2001 From: adnanioricce Date: Mon, 30 Sep 2024 21:39:20 -0300 Subject: [PATCH] [Fix] - Adding the remaining Expression node classes --- src/com/lox/AstPrinter.java | 4 ++++ src/com/lox/Expr.java | 17 +++++++++++++++++ src/com/lox/Interpreter.java | 1 - src/com/lox/Parser.java | 2 +- src/com/lox/Stmt.java | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/com/lox/AstPrinter.java b/src/com/lox/AstPrinter.java index 1774227..1e3e810 100644 --- a/src/com/lox/AstPrinter.java +++ b/src/com/lox/AstPrinter.java @@ -5,6 +5,10 @@ class AstPrinter implements Expr.Visitor { return expr.accept(this); } @Override + public String visitCallExpr(Expr.Call expr){ + return "TODO"; + } + @Override public String visitLogicalExpr(Expr.Logical expr){ //throw exception return "TODO"; diff --git a/src/com/lox/Expr.java b/src/com/lox/Expr.java index 0c9da99..d8820f2 100644 --- a/src/com/lox/Expr.java +++ b/src/com/lox/Expr.java @@ -6,6 +6,7 @@ abstract class Expr { interface Visitor { R visitAssignExpr(Assign expr); R visitBinaryExpr(Binary expr); + R visitCallExpr(Call expr); R visitGroupingExpr(Grouping expr); R visitLiteralExpr(Literal expr); R visitLogicalExpr(Logical expr); @@ -42,6 +43,22 @@ abstract class Expr { final Token operator; final Expr right; } + static class Call extends Expr { + Call(Expr callee, Token paren, List arguments) { + this.callee = callee; + this.paren = paren; + this.arguments = arguments; + } + + @Override + R accept(Visitor visitor) { + return visitor.visitCallExpr(this); + } + + final Expr callee; + final Token paren; + final List arguments; + } static class Grouping extends Expr { Grouping(Expr expression) { this.expression = expression; diff --git a/src/com/lox/Interpreter.java b/src/com/lox/Interpreter.java index d47c3ef..0fa6eec 100644 --- a/src/com/lox/Interpreter.java +++ b/src/com/lox/Interpreter.java @@ -5,7 +5,6 @@ import java.util.List; class Interpreter implements Expr.Visitor,Stmt.Visitor { private Environment environment = new Environment(); final Environment globals = new Environment(); - private Environment environment = globals; Interpreter() { globals.define("clock", new LoxCallable() { @Override diff --git a/src/com/lox/Parser.java b/src/com/lox/Parser.java index a79f54e..bdf2f48 100644 --- a/src/com/lox/Parser.java +++ b/src/com/lox/Parser.java @@ -268,7 +268,7 @@ class Parser { while(match(COMMA)); } Token paren = consume(RIGHT_PAREN,"Expect ')' after arguments"); - return new Expr.Call(calle,paren,arguments); + return new Expr.Call(callee,paren,arguments); } private Expr call(){ Expr expr = primary(); diff --git a/src/com/lox/Stmt.java b/src/com/lox/Stmt.java index 2162a03..05ca90b 100644 --- a/src/com/lox/Stmt.java +++ b/src/com/lox/Stmt.java @@ -7,7 +7,9 @@ abstract class Stmt { R visitBlockStmt(Block stmt); R visitIfStmt(If stmt); R visitExpressionStmt(Expression stmt); + R visitFunctionStmt(Function stmt); R visitPrintStmt(Print stmt); + R visitReturnStmt(Return stmt); R visitVarStmt(Var stmt); R visitWhileStmt(While stmt); } @@ -51,6 +53,22 @@ abstract class Stmt { final Expr expression; } + static class Function extends Stmt { + Function(Token name, List params, List body) { + this.name = name; + this.params = params; + this.body = body; + } + + @Override + R accept(Visitor visitor) { + return visitor.visitFunctionStmt(this); + } + + final Token name; + final List params; + final List body; + } static class Print extends Stmt { Print(Expr expression) { this.expression = expression; @@ -63,6 +81,20 @@ abstract class Stmt { final Expr expression; } + static class Return extends Stmt { + Return(Token keyword, Expr value) { + this.keyword = keyword; + this.value = value; + } + + @Override + R accept(Visitor visitor) { + return visitor.visitReturnStmt(this); + } + + final Token keyword; + final Expr value; + } static class Var extends Stmt { Var(Token name, Expr initializer) { this.name = name;