/* Copyright (C) 2019-2023 Hangzhou HSH Co. Ltd. * All right reserved.*/ package com.craftinginterpreters.lox; /** * @author simon * @date 2023-06-05 13:19 * @desc */ public class AstPrinter implements Expr.Visitor { String print(Expr expr) { return expr.accept(this); } @Override public String visitAssignExpr(Expr.Assign expr) { return parenthesize("assign", expr.value); } @Override public String visitBinaryExpr(Expr.Binary expr) { return parenthesize(expr.operator.lexeme, expr.left, expr.right); } @Override public String visitCallExpr(Expr.Call expr) { return null; } @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 visitLogicalExpr(Expr.Logical expr) { return parenthesize(null, expr.left) + " " + expr.operator.lexeme.toUpperCase() + " " + parenthesize(null, expr.right); } @Override public String visitUnaryExpr(Expr.Unary expr) { return parenthesize(expr.operator.lexeme, expr.right); } @Override public String visitVariableExpr(Expr.Variable expr) { return parenthesize(expr.name.lexeme); } private String parenthesize(String name, Expr... exprs) { StringBuilder builder = new StringBuilder(); builder.append("(").append(name == null ? "" : name); for (Expr expr : exprs) { builder.append(" "); builder.append(expr.accept(this)); } builder.append(")"); return builder.toString(); } }