| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /* 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> {
- 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();
- }
- }
|