Expression pretty printer
This commit is contained in:
@@ -9,6 +9,10 @@ public class AstPrinter {
|
|||||||
return expr.accept(new Polish(parentheses, true));
|
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> {
|
private record Polish(boolean parentheses, boolean reverse) implements Expr.Visitor<String> {
|
||||||
@Override
|
@Override
|
||||||
public String visitAssignExpr(Expr.Assign expr) {
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public class Interpreter implements Expr.Visitor<Object>, Stmt.Visitor<Void> {
|
|||||||
return expr.accept(this);
|
return expr.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String stringify(Object object) {
|
static String stringify(Object object) {
|
||||||
if (object == null) return "nil";
|
if (object == null) return "nil";
|
||||||
|
|
||||||
var text = object.toString();
|
var text = object.toString();
|
||||||
|
|||||||
Reference in New Issue
Block a user