|
|
@@ -2,91 +2,110 @@ package com.craftinginterpreters.lox;
|
|
|
|
|
|
/**
|
|
|
* @author GenerateAst
|
|
|
- * @date 2023-06-09 16:00
|
|
|
+ * @date 2023-06-12 16:03
|
|
|
*/
|
|
|
abstract class Expr {
|
|
|
- interface Visitor<R> {
|
|
|
- R visitBinaryExpr(Binary expr);
|
|
|
+ interface Visitor<R> {
|
|
|
+ R visitAssignExpr(Assign expr);
|
|
|
|
|
|
- R visitGroupingExpr(Grouping expr);
|
|
|
+ R visitBinaryExpr(Binary expr);
|
|
|
|
|
|
- R visitLiteralExpr(Literal expr);
|
|
|
+ R visitGroupingExpr(Grouping expr);
|
|
|
|
|
|
- R visitUnaryExpr(Unary expr);
|
|
|
+ R visitLiteralExpr(Literal expr);
|
|
|
|
|
|
- R visitVariableExpr(Variable expr);
|
|
|
- }
|
|
|
+ R visitUnaryExpr(Unary expr);
|
|
|
|
|
|
- static class Binary extends Expr {
|
|
|
- Binary(Expr left, Token operator, Expr right) {
|
|
|
- this.left = left;
|
|
|
- this.operator = operator;
|
|
|
- this.right = right;
|
|
|
- }
|
|
|
+ R visitVariableExpr(Variable expr);
|
|
|
|
|
|
- @Override
|
|
|
- <R> R accept(Visitor<R> visitor) {
|
|
|
- return visitor.visitBinaryExpr(this);
|
|
|
}
|
|
|
|
|
|
- final Expr left;
|
|
|
- final Token operator;
|
|
|
- final Expr right;
|
|
|
- }
|
|
|
|
|
|
- static class Grouping extends Expr {
|
|
|
- Grouping(Expr expression) {
|
|
|
- this.expression = expression;
|
|
|
+ static class Assign extends Expr {
|
|
|
+ Assign(Token name, Expr value) {
|
|
|
+ this.name = name;
|
|
|
+ this.value = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ <R> R accept(Visitor<R> visitor) {
|
|
|
+ return visitor.visitAssignExpr(this);
|
|
|
+ }
|
|
|
+
|
|
|
+ final Token name;
|
|
|
+ final Expr value;
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- <R> R accept(Visitor<R> visitor) {
|
|
|
- return visitor.visitGroupingExpr(this);
|
|
|
+ static class Binary extends Expr {
|
|
|
+ Binary(Expr left, Token operator, Expr right) {
|
|
|
+ this.left = left;
|
|
|
+ this.operator = operator;
|
|
|
+ this.right = right;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ <R> R accept(Visitor<R> visitor) {
|
|
|
+ return visitor.visitBinaryExpr(this);
|
|
|
+ }
|
|
|
+
|
|
|
+ final Expr left;
|
|
|
+ final Token operator;
|
|
|
+ final Expr right;
|
|
|
}
|
|
|
|
|
|
- final Expr expression;
|
|
|
- }
|
|
|
+ static class Grouping extends Expr {
|
|
|
+ Grouping(Expr expression) {
|
|
|
+ this.expression = expression;
|
|
|
+ }
|
|
|
|
|
|
- static class Literal extends Expr {
|
|
|
- Literal(Object value) {
|
|
|
- this.value = value;
|
|
|
- }
|
|
|
+ @Override
|
|
|
+ <R> R accept(Visitor<R> visitor) {
|
|
|
+ return visitor.visitGroupingExpr(this);
|
|
|
+ }
|
|
|
|
|
|
- @Override
|
|
|
- <R> R accept(Visitor<R> visitor) {
|
|
|
- return visitor.visitLiteralExpr(this);
|
|
|
+ final Expr expression;
|
|
|
}
|
|
|
|
|
|
- final Object value;
|
|
|
- }
|
|
|
+ static class Literal extends Expr {
|
|
|
+ Literal(Object value) {
|
|
|
+ this.value = value;
|
|
|
+ }
|
|
|
|
|
|
- static class Unary extends Expr {
|
|
|
- Unary(Token operator, Expr right) {
|
|
|
- this.operator = operator;
|
|
|
- this.right = right;
|
|
|
- }
|
|
|
+ @Override
|
|
|
+ <R> R accept(Visitor<R> visitor) {
|
|
|
+ return visitor.visitLiteralExpr(this);
|
|
|
+ }
|
|
|
|
|
|
- @Override
|
|
|
- <R> R accept(Visitor<R> visitor) {
|
|
|
- return visitor.visitUnaryExpr(this);
|
|
|
+ final Object value;
|
|
|
}
|
|
|
|
|
|
- final Token operator;
|
|
|
- final Expr right;
|
|
|
- }
|
|
|
+ static class Unary extends Expr {
|
|
|
+ Unary(Token operator, Expr right) {
|
|
|
+ this.operator = operator;
|
|
|
+ this.right = right;
|
|
|
+ }
|
|
|
|
|
|
- static class Variable extends Expr {
|
|
|
- Variable(Token name) {
|
|
|
- this.name = name;
|
|
|
- }
|
|
|
+ @Override
|
|
|
+ <R> R accept(Visitor<R> visitor) {
|
|
|
+ return visitor.visitUnaryExpr(this);
|
|
|
+ }
|
|
|
|
|
|
- @Override
|
|
|
- <R> R accept(Visitor<R> visitor) {
|
|
|
- return visitor.visitVariableExpr(this);
|
|
|
+ final Token operator;
|
|
|
+ final Expr right;
|
|
|
}
|
|
|
|
|
|
- final Token name;
|
|
|
- }
|
|
|
+ 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;
|
|
|
+ }
|
|
|
|
|
|
- abstract <R> R accept(Visitor<R> visitor);
|
|
|
+ abstract <R> R accept(Visitor<R> visitor);
|
|
|
}
|