aboutsummaryrefslogtreecommitdiffstats
path: root/jlox/src/com/craftinginterpreters/lox/AstPrinter.java
diff options
context:
space:
mode:
authorGravatar Tom Willemse2021-07-08 00:14:31 -0700
committerGravatar Tom Willemse2021-07-08 02:25:13 -0700
commit68a2ebd34fc94488e89ffb82b359ec6e7e152ae9 (patch)
tree0dbbe26aff8fc38805b4b3780ae7842c433b9522 /jlox/src/com/craftinginterpreters/lox/AstPrinter.java
parent62bd0f83dc909547a69abb8b0aed40cf098b4c95 (diff)
downloadcrafting-interpreters-68a2ebd34fc94488e89ffb82b359ec6e7e152ae9.tar.gz
crafting-interpreters-68a2ebd34fc94488e89ffb82b359ec6e7e152ae9.zip
Restructure project to make room for clox
Diffstat (limited to 'jlox/src/com/craftinginterpreters/lox/AstPrinter.java')
-rw-r--r--jlox/src/com/craftinginterpreters/lox/AstPrinter.java147
1 files changed, 147 insertions, 0 deletions
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<String>, Stmt.Visitor<String> {
+ 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<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();
+ }
+
+ private String parenthesizeStmt(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();
+ }
+
+ 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));
+ }
+}