From 68a2ebd34fc94488e89ffb82b359ec6e7e152ae9 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Thu, 8 Jul 2021 00:14:31 -0700 Subject: Restructure project to make room for clox --- .../com/craftinginterpreters/lox/AstPrinter.java | 147 +++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 jlox/src/com/craftinginterpreters/lox/AstPrinter.java (limited to 'jlox/src/com/craftinginterpreters/lox/AstPrinter.java') diff --git a/jlox/src/com/craftinginterpreters/lox/AstPrinter.java b/jlox/src/com/craftinginterpreters/lox/AstPrinter.java new file mode 100644 index 0000000..4c120d3 --- /dev/null +++ b/jlox/src/com/craftinginterpreters/lox/AstPrinter.java @@ -0,0 +1,147 @@ +package com.craftinginterpreters.lox; + +import java.util.List; + +/** + * AstPrinter + */ +class AstPrinter implements Expr.Visitor, Stmt.Visitor { + String print(Expr expr) { + return expr.accept(this); + } + + @Override + public String visitCallExpr(Expr.Call expr) { + StringBuilder builder = new StringBuilder(); + + builder.append(print(expr.callee)); + builder.append(parenthesizeExpr("", expr.arguments)); + + return builder.toString(); + } + + @Override + public String visitBinaryExpr(Expr.Binary expr) { + return parenthesizeExpr(expr.operator.lexeme, expr.left, expr.right); + } + + @Override + public String visitGroupingExpr(Expr.Grouping expr) { + return parenthesizeExpr("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 parenthesizeExpr(expr.operator.type.toString(), expr.left, expr.right); + } + + @Override + public String visitUnaryExpr(Expr.Unary expr) { + return parenthesizeExpr(expr.operator.lexeme, expr.right); + } + + @Override + public String visitVariableExpr(Expr.Variable expr) { + return expr.name.lexeme; + } + + @Override + public String visitAssignExpr(Expr.Assign expression) { + return parenthesizeExpr(expression.name.lexeme + " = ", expression.value); + } + + @Override + public String visitVarStmt(Stmt.Var statement) { + return parenthesizeExpr("define " + statement.name.lexeme + " = ", statement.initializer); + } + + @Override + public String visitWhileStmt(Stmt.While statement) { + StringBuilder builder = new StringBuilder(); + + builder.append('('); + builder.append(parenthesizeExpr("while", statement.condition)); + builder.append(parenthesizeStmt("do", statement.body)); + builder.append(')'); + + return builder.toString(); + } + + @Override + public String visitPrintStmt(Stmt.Print statement) { + return parenthesizeExpr("print", statement.expression); + } + + @Override + public String visitExpressionStmt(Stmt.Expression expression) { + return expression.expression.accept(this); + } + + @Override + public String visitIfStmt(Stmt.If stmt) { + StringBuilder builder = new StringBuilder(); + + builder.append("("); + builder.append(parenthesizeExpr("if", stmt.condition)); + builder.append(parenthesizeStmt("then", stmt.thenBranch)); + + if (stmt.elseBranch != null) { + builder.append(parenthesizeStmt("else", stmt.elseBranch)); + } + return builder.toString(); + } + + @Override + public String visitBlockStmt(Stmt.Block block) { + return parenthesizeStmt("", block.statements); + } + + private String parenthesizeExpr(String name, Expr... exprs) { + return parenthesizeExpr(name, exprs); + } + + private String parenthesizeExpr(String name, List 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(); + } + + private String parenthesizeStmt(String name, List 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(); + } + + private String parenthesizeStmt(String name, Stmt... statements) { + return parenthesizeStmt(name, statements); + } + + 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)); + } +} -- cgit v1.2.3-54-g00ecf