diff --git a/ASTPrinter.cs b/ASTPrinter.cs new file mode 100644 index 0000000..a5ae86c --- /dev/null +++ b/ASTPrinter.cs @@ -0,0 +1,46 @@ +using System; +using System.IO; +using Finn.AST; + +namespace Finn; + +class ASTPrinter : IVisitor +{ + string print(Expr expr) + { + return expr.accept(this); + } + + private string parenthesize(string name, params Expr[] exprs) + { + var w = new StringWriter(); + w.Write($"({name}"); + foreach (Expr expr in exprs) + { + w.Write(" "); + w.Write(expr.accept(this)); + } + w.Write(")"); + return w.ToString(); + } + + public string visitBinaryExpr(Binary expr) + { + return parenthesize(expr.Op.lexeme, expr.Left, expr.Right); + } + + public string visitGroupingExpr(Grouping expr) + { + return parenthesize("group", expr.Expression); + } + + public string visitLiteralExpr(Literal expr) + { + return expr.Value.ToString() ?? ""; + } + + public string visitUnaryExpr(Unary expr) + { + return parenthesize(expr.Op.lexeme, expr.Right); + } +}