|
|
@@ -4,12 +4,9 @@ import java.util.List;
|
|
|
|
|
|
/**
|
|
|
* @author GenerateAst
|
|
|
- * @date 2023-08-03 18:00
|
|
|
+ * @date 2023-08-14 15:46
|
|
|
*/
|
|
|
abstract class Stmt {
|
|
|
- abstract <R> R accept(Visitor<R> visitor);
|
|
|
-
|
|
|
-
|
|
|
interface Visitor<R> {
|
|
|
R visitBlockStmt(Block stmt);
|
|
|
|
|
|
@@ -31,9 +28,8 @@ abstract class Stmt {
|
|
|
|
|
|
}
|
|
|
|
|
|
- static class Block extends Stmt {
|
|
|
- final List<Stmt> statements;
|
|
|
|
|
|
+ static class Block extends Stmt {
|
|
|
Block(List<Stmt> statements) {
|
|
|
this.statements = statements;
|
|
|
}
|
|
|
@@ -42,14 +38,14 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitBlockStmt(this);
|
|
|
}
|
|
|
+
|
|
|
+ final List<Stmt> statements;
|
|
|
}
|
|
|
|
|
|
static class Class extends Stmt {
|
|
|
- final Token name;
|
|
|
- final List<Stmt.Function> methods;
|
|
|
-
|
|
|
- Class(Token name, List<Stmt.Function> methods) {
|
|
|
+ Class(Token name, Expr.Variable superClass, List<Stmt.Function> methods) {
|
|
|
this.name = name;
|
|
|
+ this.superClass = superClass;
|
|
|
this.methods = methods;
|
|
|
}
|
|
|
|
|
|
@@ -57,11 +53,13 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitClassStmt(this);
|
|
|
}
|
|
|
+
|
|
|
+ final Token name;
|
|
|
+ final Expr.Variable superClass;
|
|
|
+ final List<Stmt.Function> methods;
|
|
|
}
|
|
|
|
|
|
static class Expression extends Stmt {
|
|
|
- final Expr expression;
|
|
|
-
|
|
|
Expression(Expr expression) {
|
|
|
this.expression = expression;
|
|
|
}
|
|
|
@@ -70,12 +68,11 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitExpressionStmt(this);
|
|
|
}
|
|
|
+
|
|
|
+ final Expr expression;
|
|
|
}
|
|
|
|
|
|
static class Function extends Stmt {
|
|
|
- final Token name;
|
|
|
- final List<Token> params;
|
|
|
- final List<Stmt> body;
|
|
|
Function(Token name, List<Token> params, List<Stmt> body) {
|
|
|
this.name = name;
|
|
|
this.params = params;
|
|
|
@@ -86,12 +83,13 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitFunctionStmt(this);
|
|
|
}
|
|
|
+
|
|
|
+ final Token name;
|
|
|
+ final List<Token> params;
|
|
|
+ final List<Stmt> body;
|
|
|
}
|
|
|
|
|
|
static class If extends Stmt {
|
|
|
- final Expr condition;
|
|
|
- final Stmt thenBranch;
|
|
|
- final Stmt elseBranch;
|
|
|
If(Expr condition, Stmt thenBranch, Stmt elseBranch) {
|
|
|
this.condition = condition;
|
|
|
this.thenBranch = thenBranch;
|
|
|
@@ -102,11 +100,13 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitIfStmt(this);
|
|
|
}
|
|
|
+
|
|
|
+ final Expr condition;
|
|
|
+ final Stmt thenBranch;
|
|
|
+ final Stmt elseBranch;
|
|
|
}
|
|
|
|
|
|
static class Print extends Stmt {
|
|
|
- final Expr expression;
|
|
|
-
|
|
|
Print(Expr expression) {
|
|
|
this.expression = expression;
|
|
|
}
|
|
|
@@ -115,12 +115,11 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitPrintStmt(this);
|
|
|
}
|
|
|
+
|
|
|
+ final Expr expression;
|
|
|
}
|
|
|
|
|
|
static class Return extends Stmt {
|
|
|
- final Token keyword;
|
|
|
- final Expr value;
|
|
|
-
|
|
|
Return(Token keyword, Expr value) {
|
|
|
this.keyword = keyword;
|
|
|
this.value = value;
|
|
|
@@ -130,12 +129,12 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitReturnStmt(this);
|
|
|
}
|
|
|
+
|
|
|
+ final Token keyword;
|
|
|
+ final Expr value;
|
|
|
}
|
|
|
|
|
|
static class Var extends Stmt {
|
|
|
- final Token name;
|
|
|
- final Expr initializer;
|
|
|
-
|
|
|
Var(Token name, Expr initializer) {
|
|
|
this.name = name;
|
|
|
this.initializer = initializer;
|
|
|
@@ -145,12 +144,12 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitVarStmt(this);
|
|
|
}
|
|
|
+
|
|
|
+ final Token name;
|
|
|
+ final Expr initializer;
|
|
|
}
|
|
|
|
|
|
static class While extends Stmt {
|
|
|
- final Expr condition;
|
|
|
- final Stmt body;
|
|
|
-
|
|
|
While(Expr condition, Stmt body) {
|
|
|
this.condition = condition;
|
|
|
this.body = body;
|
|
|
@@ -160,5 +159,10 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitWhileStmt(this);
|
|
|
}
|
|
|
+
|
|
|
+ final Expr condition;
|
|
|
+ final Stmt body;
|
|
|
}
|
|
|
+
|
|
|
+ abstract <R> R accept(Visitor<R> visitor);
|
|
|
}
|