jlox/src/lox/Expr.java

85 lines
1.6 KiB
Java
Raw Normal View History

2021-09-18 03:02:57 +00:00
package lox;
abstract class Expr {
2021-09-18 17:21:50 +00:00
interface Visitor<R> {
R visitBinaryExpr(Binary expr);
R visitGroupingExpr(Grouping expr);
R visitLiteralExpr(Literal expr);
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-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;
}
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;
}
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
}