2021-09-18 20:09:43 +00:00
|
|
|
package lox;
|
|
|
|
|
2021-09-19 18:46:00 +00:00
|
|
|
import java.util.List;
|
|
|
|
|
2021-09-18 20:09:43 +00:00
|
|
|
abstract class Stmt {
|
|
|
|
interface Visitor<R> {
|
2021-09-19 18:46:00 +00:00
|
|
|
R visitBlockStmt(Block stmt);
|
2021-09-18 20:09:43 +00:00
|
|
|
R visitExpressionStmt(Expression stmt);
|
2021-09-26 16:54:32 +00:00
|
|
|
R visitFunctionStmt(Function stmt);
|
2021-09-23 01:42:06 +00:00
|
|
|
R visitIfStmt(If stmt);
|
2021-09-19 18:13:47 +00:00
|
|
|
R visitVarStmt(Var stmt);
|
2021-09-18 20:09:43 +00:00
|
|
|
R visitPrintStmt(Print stmt);
|
2021-09-26 16:54:32 +00:00
|
|
|
R visitReturnStmt(Return stmt);
|
2021-09-23 01:42:06 +00:00
|
|
|
R visitWhileStmt(While stmt);
|
2021-09-18 20:09:43 +00:00
|
|
|
}
|
|
|
|
|
2021-09-19 18:46:00 +00:00
|
|
|
static class Block extends Stmt {
|
|
|
|
Block(List<Stmt> statements) {
|
|
|
|
this.statements = statements;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitBlockStmt(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
final List<Stmt> statements;
|
|
|
|
}
|
|
|
|
|
2021-09-18 20:09:43 +00:00
|
|
|
static class Expression extends Stmt {
|
|
|
|
Expression(Expr expression) {
|
|
|
|
this.expression = expression;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitExpressionStmt(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
final Expr expression;
|
|
|
|
}
|
|
|
|
|
2021-09-26 16:54:32 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2021-09-23 01:42:06 +00:00
|
|
|
static class If extends Stmt {
|
|
|
|
If(Expr condition, Stmt thenBranch, Stmt elseBranch) {
|
|
|
|
this.condition = condition;
|
|
|
|
this.thenBranch = thenBranch;
|
|
|
|
this.elseBranch = elseBranch;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitIfStmt(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
final Expr condition;
|
|
|
|
final Stmt thenBranch;
|
|
|
|
final Stmt elseBranch;
|
|
|
|
}
|
|
|
|
|
2021-09-19 18:13:47 +00:00
|
|
|
static class Var extends Stmt {
|
|
|
|
Var(Token name, Expr initializer) {
|
|
|
|
this.name = name;
|
|
|
|
this.initializer = initializer;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitVarStmt(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
final Token name;
|
|
|
|
final Expr initializer;
|
|
|
|
}
|
|
|
|
|
2021-09-18 20:09:43 +00:00
|
|
|
static class Print extends Stmt {
|
|
|
|
Print(Expr expression) {
|
|
|
|
this.expression = expression;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitPrintStmt(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
final Expr expression;
|
|
|
|
}
|
|
|
|
|
2021-09-26 16:54:32 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2021-09-23 01:42:06 +00:00
|
|
|
static class While extends Stmt {
|
|
|
|
While(Expr condition, Stmt body) {
|
|
|
|
this.condition = condition;
|
|
|
|
this.body = body;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
|
return visitor.visitWhileStmt(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
final Expr condition;
|
|
|
|
final Stmt body;
|
|
|
|
}
|
|
|
|
|
2021-09-18 20:09:43 +00:00
|
|
|
abstract <R> R accept(Visitor<R> visitor);
|
|
|
|
}
|