diff options
author | Tom Willemse | 2020-10-28 22:56:15 -0700 |
---|---|---|
committer | Tom Willemse | 2020-10-28 22:56:15 -0700 |
commit | 2e15e8bab840b6d13d1463709e3125bb2910dbab (patch) | |
tree | 41e805a0726990c175be46763b0bb029f7608856 /src/com/craftinginterpreters/lox | |
parent | 5fcfc5a01582c6159593eaaf23ec0109d1230130 (diff) | |
download | crafting-interpreters-2e15e8bab840b6d13d1463709e3125bb2910dbab.tar.gz crafting-interpreters-2e15e8bab840b6d13d1463709e3125bb2910dbab.zip |
Add GenerateAst and AstPrinter
Diffstat (limited to 'src/com/craftinginterpreters/lox')
-rw-r--r-- | src/com/craftinginterpreters/lox/AstPrinter.java | 53 |
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)); + } +} |