Expression pretty printer

This commit is contained in:
ctsk
2022-09-09 12:35:27 +02:00
parent 2d1bad5701
commit fcd8b75ed6
2 changed files with 40 additions and 1 deletions

View File

@@ -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<String> {
@Override
public String visitAssignExpr(Expr.Assign expr) {
@@ -62,4 +66,39 @@ public class AstPrinter {
}
}
}
private static class Pretty implements Expr.Visitor<String> {
@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();
}
}
}

View File

@@ -32,7 +32,7 @@ public class Interpreter implements Expr.Visitor<Object>, Stmt.Visitor<Void> {
return expr.accept(this);
}
private String stringify(Object object) {
static String stringify(Object object) {
if (object == null) return "nil";
var text = object.toString();