[Fix] - Adding the remaining Expression node classes
This commit is contained in:
parent
178793a13c
commit
503d2a0ffd
@ -5,6 +5,10 @@ class AstPrinter implements Expr.Visitor<String> {
|
|||||||
return expr.accept(this);
|
return expr.accept(this);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
|
public String visitCallExpr(Expr.Call expr){
|
||||||
|
return "TODO";
|
||||||
|
}
|
||||||
|
@Override
|
||||||
public String visitLogicalExpr(Expr.Logical expr){
|
public String visitLogicalExpr(Expr.Logical expr){
|
||||||
//throw exception
|
//throw exception
|
||||||
return "TODO";
|
return "TODO";
|
||||||
|
@ -6,6 +6,7 @@ abstract class Expr {
|
|||||||
interface Visitor<R> {
|
interface Visitor<R> {
|
||||||
R visitAssignExpr(Assign expr);
|
R visitAssignExpr(Assign expr);
|
||||||
R visitBinaryExpr(Binary expr);
|
R visitBinaryExpr(Binary expr);
|
||||||
|
R visitCallExpr(Call expr);
|
||||||
R visitGroupingExpr(Grouping expr);
|
R visitGroupingExpr(Grouping expr);
|
||||||
R visitLiteralExpr(Literal expr);
|
R visitLiteralExpr(Literal expr);
|
||||||
R visitLogicalExpr(Logical expr);
|
R visitLogicalExpr(Logical expr);
|
||||||
@ -42,6 +43,22 @@ abstract class Expr {
|
|||||||
final Token operator;
|
final Token operator;
|
||||||
final Expr right;
|
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 {
|
static class Grouping extends Expr {
|
||||||
Grouping(Expr expression) {
|
Grouping(Expr expression) {
|
||||||
this.expression = expression;
|
this.expression = expression;
|
||||||
|
@ -5,7 +5,6 @@ import java.util.List;
|
|||||||
class Interpreter implements Expr.Visitor<Object>,Stmt.Visitor<Void> {
|
class Interpreter implements Expr.Visitor<Object>,Stmt.Visitor<Void> {
|
||||||
private Environment environment = new Environment();
|
private Environment environment = new Environment();
|
||||||
final Environment globals = new Environment();
|
final Environment globals = new Environment();
|
||||||
private Environment environment = globals;
|
|
||||||
Interpreter() {
|
Interpreter() {
|
||||||
globals.define("clock", new LoxCallable() {
|
globals.define("clock", new LoxCallable() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -268,7 +268,7 @@ class Parser {
|
|||||||
while(match(COMMA));
|
while(match(COMMA));
|
||||||
}
|
}
|
||||||
Token paren = consume(RIGHT_PAREN,"Expect ')' after arguments");
|
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(){
|
private Expr call(){
|
||||||
Expr expr = primary();
|
Expr expr = primary();
|
||||||
|
@ -7,7 +7,9 @@ abstract class Stmt {
|
|||||||
R visitBlockStmt(Block stmt);
|
R visitBlockStmt(Block stmt);
|
||||||
R visitIfStmt(If stmt);
|
R visitIfStmt(If stmt);
|
||||||
R visitExpressionStmt(Expression stmt);
|
R visitExpressionStmt(Expression stmt);
|
||||||
|
R visitFunctionStmt(Function stmt);
|
||||||
R visitPrintStmt(Print stmt);
|
R visitPrintStmt(Print stmt);
|
||||||
|
R visitReturnStmt(Return stmt);
|
||||||
R visitVarStmt(Var stmt);
|
R visitVarStmt(Var stmt);
|
||||||
R visitWhileStmt(While stmt);
|
R visitWhileStmt(While stmt);
|
||||||
}
|
}
|
||||||
@ -51,6 +53,22 @@ abstract class Stmt {
|
|||||||
|
|
||||||
final Expr expression;
|
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 {
|
static class Print extends Stmt {
|
||||||
Print(Expr expression) {
|
Print(Expr expression) {
|
||||||
this.expression = expression;
|
this.expression = expression;
|
||||||
@ -63,6 +81,20 @@ abstract class Stmt {
|
|||||||
|
|
||||||
final Expr expression;
|
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 {
|
static class Var extends Stmt {
|
||||||
Var(Token name, Expr initializer) {
|
Var(Token name, Expr initializer) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
Loading…
Reference in New Issue
Block a user