|
@@ -1,14 +1,15 @@
|
|
|
package com.craftinginterpreters.lox;
|
|
package com.craftinginterpreters.lox;
|
|
|
|
|
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* @author GenerateAst
|
|
* @author GenerateAst
|
|
|
- * @date 2023-06-09 16:00
|
|
|
|
|
|
|
+ * @date 2023-06-13 10:59
|
|
|
*/
|
|
*/
|
|
|
abstract class Stmt {
|
|
abstract class Stmt {
|
|
|
- abstract <R> R accept(Visitor<R> visitor);
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
interface Visitor<R> {
|
|
interface Visitor<R> {
|
|
|
|
|
+ R visitBlockStmt(Block stmt);
|
|
|
|
|
+
|
|
|
R visitExpressionStmt(Expression stmt);
|
|
R visitExpressionStmt(Expression stmt);
|
|
|
|
|
|
|
|
R visitPrintStmt(Print stmt);
|
|
R visitPrintStmt(Print stmt);
|
|
@@ -17,9 +18,21 @@ abstract class Stmt {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- static class Expression extends Stmt {
|
|
|
|
|
- final Expr expression;
|
|
|
|
|
|
|
|
|
|
|
|
+ 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;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ static class Expression extends Stmt {
|
|
|
Expression(Expr expression) {
|
|
Expression(Expr expression) {
|
|
|
this.expression = expression;
|
|
this.expression = expression;
|
|
|
}
|
|
}
|
|
@@ -28,11 +41,11 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitExpressionStmt(this);
|
|
return visitor.visitExpressionStmt(this);
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- static class Print extends Stmt {
|
|
|
|
|
final Expr expression;
|
|
final Expr expression;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ static class Print extends Stmt {
|
|
|
Print(Expr expression) {
|
|
Print(Expr expression) {
|
|
|
this.expression = expression;
|
|
this.expression = expression;
|
|
|
}
|
|
}
|
|
@@ -41,12 +54,11 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitPrintStmt(this);
|
|
return visitor.visitPrintStmt(this);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ final Expr expression;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static class Var extends Stmt {
|
|
static class Var extends Stmt {
|
|
|
- final Token name;
|
|
|
|
|
- final Expr initializer;
|
|
|
|
|
-
|
|
|
|
|
Var(Token name, Expr initializer) {
|
|
Var(Token name, Expr initializer) {
|
|
|
this.name = name;
|
|
this.name = name;
|
|
|
this.initializer = initializer;
|
|
this.initializer = initializer;
|
|
@@ -56,5 +68,10 @@ abstract class Stmt {
|
|
|
<R> R accept(Visitor<R> visitor) {
|
|
<R> R accept(Visitor<R> visitor) {
|
|
|
return visitor.visitVarStmt(this);
|
|
return visitor.visitVarStmt(this);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ final Token name;
|
|
|
|
|
+ final Expr initializer;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ abstract <R> R accept(Visitor<R> visitor);
|
|
|
}
|
|
}
|