[Fix] - Adding the remaining Expression node classes

This commit is contained in:
adnanioricce 2024-09-30 21:39:20 -03:00
parent 178793a13c
commit 503d2a0ffd
5 changed files with 54 additions and 2 deletions

@ -5,6 +5,10 @@ class AstPrinter implements Expr.Visitor<String> {
return expr.accept(this);
}
@Override
public String visitCallExpr(Expr.Call expr){
return "TODO";
}
@Override
public String visitLogicalExpr(Expr.Logical expr){
//throw exception
return "TODO";

@ -6,6 +6,7 @@ abstract class Expr {
interface Visitor<R> {
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<Expr> arguments) {
this.callee = callee;
this.paren = paren;
this.arguments = arguments;
}
@Override
<R> R accept(Visitor<R> visitor) {
return visitor.visitCallExpr(this);
}
final Expr callee;
final Token paren;
final List<Expr> arguments;
}
static class Grouping extends Expr {
Grouping(Expr expression) {
this.expression = expression;

@ -5,7 +5,6 @@ import java.util.List;
class Interpreter implements Expr.Visitor<Object>,Stmt.Visitor<Void> {
private Environment environment = new Environment();
final Environment globals = new Environment();
private Environment environment = globals;
Interpreter() {
globals.define("clock", new LoxCallable() {
@Override

@ -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();

@ -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<Token> params, List<Stmt> body) {
this.name = name;
this.params = params;
this.body = body;
}
@Override
<R> R accept(Visitor<R> visitor) {
return visitor.visitFunctionStmt(this);
}
final Token name;
final List<Token> params;
final List<Stmt> 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> R accept(Visitor<R> visitor) {
return visitor.visitReturnStmt(this);
}
final Token keyword;
final Expr value;
}
static class Var extends Stmt {
Var(Token name, Expr initializer) {
this.name = name;