|
|
@@ -4,12 +4,9 @@ import java.util.List;
|
|
|
|
|
|
/**
|
|
|
* @author GenerateAst
|
|
|
- * @date 2023-07-25 17:57
|
|
|
+ * @date 2023-07-26 10:50
|
|
|
*/
|
|
|
abstract class Stmt {
|
|
|
- abstract <R> R accept(Visitor<R> visitor);
|
|
|
-
|
|
|
-
|
|
|
interface Visitor<R> {
|
|
|
R visitBlockStmt(Block stmt);
|
|
|
|
|
|
@@ -21,15 +18,16 @@ abstract class Stmt {
|
|
|
|
|
|
R visitPrintStmt(Print stmt);
|
|
|
|
|
|
+ R visitReturnStmt(Return stmt);
|
|
|
+
|
|
|
R visitVarStmt(Var stmt);
|
|
|
|
|
|
R visitWhileStmt(While stmt);
|
|
|
|
|
|
}
|
|
|
|
|
|
- static class Block extends Stmt {
|
|
|
- final List<Stmt> statements;
|
|
|
|
|
|
+ static class Block extends Stmt {
|
|
|
Block(List<Stmt> statements) {
|
|
|
this.statements = statements;
|
|
|
}
|
|
|
@@ -38,11 +36,11 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitBlockStmt(this);
|
|
|
}
|
|
|
+
|
|
|
+ final List<Stmt> statements;
|
|
|
}
|
|
|
|
|
|
static class Expression extends Stmt {
|
|
|
- final Expr expression;
|
|
|
-
|
|
|
Expression(Expr expression) {
|
|
|
this.expression = expression;
|
|
|
}
|
|
|
@@ -51,12 +49,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;
|
|
|
@@ -67,12 +64,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;
|
|
|
@@ -83,11 +81,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;
|
|
|
}
|
|
|
@@ -96,12 +96,26 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitPrintStmt(this);
|
|
|
}
|
|
|
+
|
|
|
+ final Expr expression;
|
|
|
}
|
|
|
|
|
|
- static class Var extends Stmt {
|
|
|
- final Token name;
|
|
|
- final Expr initializer;
|
|
|
+ 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 {
|
|
|
Var(Token name, Expr initializer) {
|
|
|
this.name = name;
|
|
|
this.initializer = initializer;
|
|
|
@@ -111,12 +125,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;
|
|
|
@@ -126,5 +140,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);
|
|
|
}
|