summaryrefslogtreecommitdiffstats
path: root/src/com/craftinginterpreters/lox/AstPrinter.java
diff options
context:
space:
mode:
authorGravatar Tom Willemse2020-10-28 22:56:15 -0700
committerGravatar Tom Willemse2020-10-28 22:56:15 -0700
commit2e15e8bab840b6d13d1463709e3125bb2910dbab (patch)
tree41e805a0726990c175be46763b0bb029f7608856 /src/com/craftinginterpreters/lox/AstPrinter.java
parent5fcfc5a01582c6159593eaaf23ec0109d1230130 (diff)
downloadcrafting-interpreters-2e15e8bab840b6d13d1463709e3125bb2910dbab.tar.gz
crafting-interpreters-2e15e8bab840b6d13d1463709e3125bb2910dbab.zip
Add GenerateAst and AstPrinter
Diffstat (limited to 'src/com/craftinginterpreters/lox/AstPrinter.java')
-rw-r--r--src/com/craftinginterpreters/lox/AstPrinter.java53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/com/craftinginterpreters/lox/AstPrinter.java b/src/com/craftinginterpreters/lox/AstPrinter.java
new file mode 100644
index 0000000..cb494f0
--- /dev/null
+++ b/src/com/craftinginterpreters/lox/AstPrinter.java
@@ -0,0 +1,53 @@
+package com.craftinginterpreters.lox;
+
+/**
+ * AstPrinter
+ */
+class AstPrinter implements Expr.Visitor<String> {
+ String print(Expr expr) {
+ return expr.accept(this);
+ }
+
+ @Override
+ public String visitBinaryExpr(Expr.Binary expr) {
+ return parenthesize(expr.operator.lexeme, expr.left, expr.right);
+ }
+
+ @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 visitUnaryExpr(Expr.Unary expr) {
+ return parenthesize(expr.operator.lexeme, expr.right);
+ }
+
+ private String parenthesize(String name, 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();
+ }
+
+ 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));
+ }
+}