2021-09-18 17:21:50 +00:00
|
|
|
package lox;
|
|
|
|
|
|
|
|
class ASTPrinter implements Expr.Visitor<String> {
|
|
|
|
String print(Expr expr) {
|
|
|
|
return expr.accept(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String visitBinaryExpr(Expr.Binary expr) {
|
|
|
|
return parenthesize(expr.operator.lexeme, expr.left, 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);
|
|
|
|
}
|
|
|
|
|
2021-09-26 16:54:32 +00:00
|
|
|
@Override
|
|
|
|
public String visitCallExpr(Expr.Call expr) {
|
|
|
|
StringBuilder builder = new StringBuilder();
|
|
|
|
|
|
|
|
builder.append(expr.callee.toString()).append("(");
|
|
|
|
for (Expr arg : expr.arguments) {
|
|
|
|
builder.append(arg.accept(this)).append(", ");
|
|
|
|
}
|
|
|
|
builder.append(")");
|
|
|
|
|
|
|
|
return builder.toString();
|
|
|
|
}
|
|
|
|
|
2021-09-19 18:13:47 +00:00
|
|
|
@Override
|
|
|
|
public String visitVariableExpr(Expr.Variable expr) {
|
|
|
|
return expr.name.toString();
|
|
|
|
}
|
|
|
|
|
2021-09-23 01:42:06 +00:00
|
|
|
@Override
|
|
|
|
public String visitLogicalExpr(Expr.Logical expr) {
|
|
|
|
return expr.left.accept(this) + expr.operator.toString() + expr.right.accept(this);
|
|
|
|
}
|
|
|
|
|
2021-09-19 18:46:00 +00:00
|
|
|
@Override
|
|
|
|
public String visitAssignExpr(Expr.Assign expr) {
|
|
|
|
return expr.name.toString();
|
|
|
|
}
|
|
|
|
|
2021-09-18 17:21:50 +00:00
|
|
|
private String parenthesize(String name, Expr... exprs) {
|
|
|
|
StringBuilder builder = new StringBuilder();
|
|
|
|
|
|
|
|
builder.append("(").append(name);
|
|
|
|
for (Expr expr : exprs) {
|
|
|
|
builder.append(" ").append(expr.accept(this));
|
|
|
|
}
|
|
|
|
builder.append(")");
|
|
|
|
|
|
|
|
return builder.toString();
|
|
|
|
}
|
|
|
|
}
|