57 lines
1.0 KiB
C#
57 lines
1.0 KiB
C#
using System;
|
|
using System.IO;
|
|
using Finn.AST;
|
|
|
|
namespace Finn;
|
|
|
|
class ASTPrinter : IVisitor<string>
|
|
{
|
|
public 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);
|
|
}
|
|
|
|
public string visitIfExpr(If expr)
|
|
{
|
|
return parenthesize("if", expr.Condition, expr.Then, expr.Else);
|
|
}
|
|
|
|
public string visitSequenceExpr(Sequence expr)
|
|
{
|
|
return parenthesize("seq", expr.Left, expr.Right);
|
|
}
|
|
}
|