AstPrinter.java 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /* Copyright (C) 2019-2023 Hangzhou HSH Co. Ltd.
  2. * All right reserved.*/
  3. package com.craftinginterpreters.lox;
  4. /**
  5. * @author simon
  6. * @date 2023-06-05 13:19
  7. * @desc
  8. */
  9. public class AstPrinter implements Expr.Visitor<String> {
  10. String print(Expr expr) {
  11. return expr.accept(this);
  12. }
  13. @Override
  14. public String visitAssignExpr(Expr.Assign expr) {
  15. return parenthesize("assign", expr.value);
  16. }
  17. @Override
  18. public String visitBinaryExpr(Expr.Binary expr) {
  19. return parenthesize(expr.operator.lexeme, expr.left, expr.right);
  20. }
  21. @Override
  22. public String visitCallExpr(Expr.Call expr) {
  23. return null;
  24. }
  25. @Override
  26. public String visitGroupingExpr(Expr.Grouping expr) {
  27. return parenthesize("group", expr.expression);
  28. }
  29. @Override
  30. public String visitLiteralExpr(Expr.Literal expr) {
  31. if (expr.value == null) return "nil";
  32. return expr.value.toString();
  33. }
  34. @Override
  35. public String visitLogicalExpr(Expr.Logical expr) {
  36. return parenthesize(null, expr.left)
  37. + " "
  38. + expr.operator.lexeme.toUpperCase()
  39. + " "
  40. + parenthesize(null, expr.right);
  41. }
  42. @Override
  43. public String visitUnaryExpr(Expr.Unary expr) {
  44. return parenthesize(expr.operator.lexeme, expr.right);
  45. }
  46. @Override
  47. public String visitVariableExpr(Expr.Variable expr) {
  48. return parenthesize(expr.name.lexeme);
  49. }
  50. private String parenthesize(String name, Expr... exprs) {
  51. StringBuilder builder = new StringBuilder();
  52. builder.append("(").append(name == null ? "" : name);
  53. for (Expr expr : exprs) {
  54. builder.append(" ");
  55. builder.append(expr.accept(this));
  56. }
  57. builder.append(")");
  58. return builder.toString();
  59. }
  60. }