crafting-interpreters/src/com/craftinginterpreters/lox/AstPrinter.java

99 lines
2.7 KiB
Java
Raw Normal View History

2020-10-28 22:56:15 -07:00
package com.craftinginterpreters.lox;
2020-11-25 23:10:58 -08:00
import java.util.List;
2020-10-28 22:56:15 -07:00
/**
* AstPrinter
*/
2020-11-18 23:30:46 -08:00
class AstPrinter implements Expr.Visitor<String>, Stmt.Visitor<String> {
2020-10-28 22:56:15 -07:00
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);
}
2020-11-18 23:30:46 -08:00
@Override
public String visitVariableExpr(Expr.Variable expr) {
return expr.name.lexeme;
}
2020-11-25 22:06:42 -08:00
@Override
public String visitAssignExpr(Expr.Assign expression) {
return parenthesize(expression.name.lexeme + " = ", expression.value);
}
2020-11-18 23:30:46 -08:00
@Override
public String visitVarStmt(Stmt.Var statement) {
return parenthesize("define " + statement.name.lexeme + " = ", statement.initializer);
}
@Override
public String visitPrintStmt(Stmt.Print statement) {
return parenthesize("print", statement.expression);
}
@Override
public String visitExpressionStmt(Stmt.Expression expression) {
return expression.expression.accept(this);
}
2020-11-25 23:10:58 -08:00
@Override
public String visitBlockStmt(Stmt.Block block) {
return parenthesize("", block.statements);
}
2020-10-28 22:56:15 -07:00
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();
}
2020-11-25 23:10:58 -08:00
private String parenthesize(String name, List<Stmt> statements) {
StringBuilder builder = new StringBuilder();
builder.append("(").append(name);
for (Stmt statement : statements) {
builder.append(" ");
builder.append(statement.accept(this));
}
builder.append(")");
return builder.toString();
}
2020-10-28 22:56:15 -07:00
public static void main(String[] args) {
Expr expression = new Expr.Binary(
new Expr.Unary(new Token(TokenType.MINUS, "-", null, 1), new Expr.Literal(123)),
new Token(TokenType.STAR, "*", null, 1), new Expr.Grouping(new Expr.Literal(45.67)));
System.out.println(new AstPrinter().print(expression));
}
}