|
|
@@ -2,45 +2,63 @@
|
|
|
* All right reserved.*/
|
|
|
package com.craftinginterpreters.lox;
|
|
|
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
/**
|
|
|
* @author simon
|
|
|
* @date 2023-06-05 13:19
|
|
|
* @desc
|
|
|
*/
|
|
|
-public class AstPrinter implements Expr.Visitor<String> {
|
|
|
- String print(Expr expr) {
|
|
|
- return expr.accept(this);
|
|
|
+public class AstPrinter implements Expr.Visitor<String>, Stmt.Visitor<String> {
|
|
|
+ String print(List<Stmt> statements) {
|
|
|
+ StringBuilder builder = new StringBuilder();
|
|
|
+ for (Stmt statement : statements) {
|
|
|
+ builder.append("\n ");
|
|
|
+ builder.append(statement.accept(this));
|
|
|
+ builder.append("\n");
|
|
|
}
|
|
|
+ return builder.toString();
|
|
|
+ }
|
|
|
|
|
|
- @Override
|
|
|
- public String visitBinaryExpr(Expr.Binary expr) {
|
|
|
- return parenthesize(expr.operator.lexeme, expr.left, expr.right);
|
|
|
- }
|
|
|
+ @Override
|
|
|
+ public String visitExpressionStmt(Stmt.Expression stmt) {
|
|
|
+ return stmt.expression.accept(this);
|
|
|
+ }
|
|
|
|
|
|
- @Override
|
|
|
- public String visitGroupingExpr(Expr.Grouping expr) {
|
|
|
- return parenthesize("group", expr.expression);
|
|
|
- }
|
|
|
+ @Override
|
|
|
+ public String visitPrintStmt(Stmt.Print stmt) {
|
|
|
+ return parenthesize("print", stmt.expression);
|
|
|
+ }
|
|
|
|
|
|
- @Override
|
|
|
- public String visitLiteralExpr(Expr.Literal expr) {
|
|
|
- if (expr.value == null) return "nil";
|
|
|
- return expr.value.toString();
|
|
|
- }
|
|
|
+ @Override
|
|
|
+ public String visitBinaryExpr(Expr.Binary expr) {
|
|
|
+ return parenthesize(expr.operator.lexeme, expr.left, expr.right);
|
|
|
+ }
|
|
|
|
|
|
- @Override
|
|
|
- public String visitUnaryExpr(Expr.Unary expr) {
|
|
|
- return parenthesize(expr.operator.lexeme, expr.right);
|
|
|
- }
|
|
|
+ @Override
|
|
|
+ public String visitGroupingExpr(Expr.Grouping expr) {
|
|
|
+ return parenthesize("group", expr.expression);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String visitLiteralExpr(Expr.Literal expr) {
|
|
|
+ if (expr.value == null) return "nil";
|
|
|
+ return expr.value.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String visitUnaryExpr(Expr.Unary expr) {
|
|
|
+ return parenthesize(expr.operator.lexeme, expr.right);
|
|
|
+ }
|
|
|
|
|
|
- private String parenthesize(String name, Expr... exprs) {
|
|
|
- StringBuilder builder = new StringBuilder();
|
|
|
- builder.append("(").append(name);
|
|
|
- for (Expr expr : exprs) {
|
|
|
- builder.append(" ");
|
|
|
- builder.append(expr.accept(this));
|
|
|
- }
|
|
|
- builder.append(")");
|
|
|
- return builder.toString();
|
|
|
+ private String parenthesize(String name, Expr... exprs) {
|
|
|
+ StringBuilder builder = new StringBuilder();
|
|
|
+ builder.append("(").append(name);
|
|
|
+ for (Expr expr : exprs) {
|
|
|
+ builder.append(" ");
|
|
|
+ builder.append(expr.accept(this));
|
|
|
}
|
|
|
+ builder.append(")");
|
|
|
+ return builder.toString();
|
|
|
+ }
|
|
|
}
|