From fcd8b75ed6a5faa1cc87e1209fa4d7dfbef30628 Mon Sep 17 00:00:00 2001 From: ctsk <9384305+ctsk@users.noreply.github.com> Date: Fri, 9 Sep 2022 12:35:27 +0200 Subject: [PATCH] Expression pretty printer --- .../main/java/xyz/ctsk/lox/AstPrinter.java | 39 +++++++++++++++++++ .../main/java/xyz/ctsk/lox/Interpreter.java | 2 +- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/jlox/lox/src/main/java/xyz/ctsk/lox/AstPrinter.java b/jlox/lox/src/main/java/xyz/ctsk/lox/AstPrinter.java index fa0be09..60ae97c 100644 --- a/jlox/lox/src/main/java/xyz/ctsk/lox/AstPrinter.java +++ b/jlox/lox/src/main/java/xyz/ctsk/lox/AstPrinter.java @@ -9,6 +9,10 @@ public class AstPrinter { return expr.accept(new Polish(parentheses, true)); } + public static String pretty(Expr expr) { + return expr.accept(new Pretty()); + } + private record Polish(boolean parentheses, boolean reverse) implements Expr.Visitor { @Override public String visitAssignExpr(Expr.Assign expr) { @@ -62,4 +66,39 @@ public class AstPrinter { } } } + + private static class Pretty implements Expr.Visitor { + @Override + public String visitAssignExpr(Expr.Assign expr) { + return String.join(" ", expr.name().lexeme(), "=", expr.value().accept(this)); + } + + @Override + public String visitBinaryExpr(Expr.Binary expr) { + return String.join(" ", + expr.left().accept(this), + expr.operator().lexeme(), + expr.right().accept(this)); + } + + @Override + public String visitGroupingExpr(Expr.Grouping expr) { + return '(' + expr.expression().accept(this) + ')'; + } + + @Override + public String visitLiteralExpr(Expr.Literal expr) { + return Interpreter.stringify(expr.value()); + } + + @Override + public String visitUnaryExpr(Expr.Unary expr) { + return expr.operator().lexeme() + expr.right().accept(this); + } + + @Override + public String visitVariableExpr(Expr.Variable expr) { + return expr.name().lexeme(); + } + } } diff --git a/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java b/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java index e9f0bfe..a40c565 100644 --- a/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java +++ b/jlox/lox/src/main/java/xyz/ctsk/lox/Interpreter.java @@ -32,7 +32,7 @@ public class Interpreter implements Expr.Visitor, Stmt.Visitor { return expr.accept(this); } - private String stringify(Object object) { + static String stringify(Object object) { if (object == null) return "nil"; var text = object.toString();