2021-09-18 03:02:57 +00:00
|
|
|
package lox;
|
|
|
|
|
2021-09-19 18:46:00 +00:00
|
|
|
import java.util.List;
|
|
|
|
|
2021-09-18 03:02:57 +00:00
|
|
|
abstract class Expr {
|
2021-09-18 17:21:50 +00:00
|
|
|
interface Visitor<R> {
|
2021-09-19 18:46:00 +00:00
|
|
|
R visitAssignExpr(Assign expr);
|
2021-09-18 17:21:50 +00:00
|
|
|
R visitBinaryExpr(Binary expr);
|
2021-09-26 16:54:32 +00:00
|
|
|
R visitCallExpr(Call expr);
|
2021-09-18 17:21:50 +00:00
|
|
|
R visitGroupingExpr(Grouping expr);
|
|
|
|
R visitLiteralExpr(Literal expr);
|
2021-09-23 01:42:06 +00:00
|
|
|
R visitLogicalExpr(Logical expr);
|
2021-09-18 17:21:50 +00:00
|
|
|
R visitUnaryExpr(Unary expr);
|
2021-09-19 18:13:47 +00:00
|
|
|
R visitVariableExpr(Variable expr);
|
2021-09-18 17:21:50 +00:00
|
|
|
}
|
|
|
|
|
2021-09-19 18:46:00 +00:00
|
|
|
static class Assign extends Expr {
|
|
|
|
Assign(Token name, Expr value) {
|
|
|
|
this.name = name;
|
|
|
|
this.value = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitAssignExpr(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
final Token name;
|
|
|
|
final Expr value;
|
|
|
|
}
|
|
|
|
|
2021-09-18 03:02:57 +00:00
|
|
|
static class Binary extends Expr {
|
|
|
|
Binary(Expr left, Token operator, Expr right) {
|
|
|
|
this.left = left;
|
|
|
|
this.operator = operator;
|
|
|
|
this.right = right;
|
|
|
|
}
|
|
|
|
|
2021-09-18 17:21:50 +00:00
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitBinaryExpr(this);
|
|
|
|
}
|
|
|
|
|
2021-09-18 03:02:57 +00:00
|
|
|
final Expr left;
|
|
|
|
final Token operator;
|
|
|
|
final Expr right;
|
|
|
|
}
|
|
|
|
|
2021-09-26 16:54:32 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2021-09-18 03:02:57 +00:00
|
|
|
static class Grouping extends Expr {
|
|
|
|
Grouping(Expr expression) {
|
|
|
|
this.expression = expression;
|
|
|
|
}
|
|
|
|
|
2021-09-18 17:21:50 +00:00
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitGroupingExpr(this);
|
|
|
|
}
|
|
|
|
|
2021-09-18 03:02:57 +00:00
|
|
|
final Expr expression;
|
|
|
|
}
|
|
|
|
|
|
|
|
static class Literal extends Expr {
|
|
|
|
Literal(Object value) {
|
|
|
|
this.value = value;
|
|
|
|
}
|
|
|
|
|
2021-09-18 17:21:50 +00:00
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitLiteralExpr(this);
|
|
|
|
}
|
|
|
|
|
2021-09-18 03:02:57 +00:00
|
|
|
final Object value;
|
|
|
|
}
|
|
|
|
|
2021-09-23 01:42:06 +00:00
|
|
|
static class Logical extends Expr {
|
|
|
|
Logical(Expr left, Token operator, Expr right) {
|
|
|
|
this.left = left;
|
|
|
|
this.operator = operator;
|
|
|
|
this.right = right;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitLogicalExpr(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
final Expr left;
|
|
|
|
final Token operator;
|
|
|
|
final Expr right;
|
|
|
|
}
|
|
|
|
|
2021-09-18 03:02:57 +00:00
|
|
|
static class Unary extends Expr {
|
|
|
|
Unary(Token operator, Expr right) {
|
|
|
|
this.operator = operator;
|
|
|
|
this.right = right;
|
|
|
|
}
|
|
|
|
|
2021-09-18 17:21:50 +00:00
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitUnaryExpr(this);
|
|
|
|
}
|
|
|
|
|
2021-09-18 03:02:57 +00:00
|
|
|
final Token operator;
|
|
|
|
final Expr right;
|
|
|
|
}
|
2021-09-18 17:21:50 +00:00
|
|
|
|
2021-09-19 18:13:47 +00:00
|
|
|
static class Variable extends Expr {
|
|
|
|
Variable(Token name) {
|
|
|
|
this.name = name;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitVariableExpr(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
final Token name;
|
|
|
|
}
|
|
|
|
|
2021-09-18 17:21:50 +00:00
|
|
|
abstract <R> R accept(Visitor<R> visitor);
|
2021-09-18 03:02:57 +00:00
|
|
|
}
|