Мой вопрос: Каков самый чистый способ красиво напечатать выражение без лишних скобок?
У меня есть следующее представление лямбда-выражений:
Term ::= Fun(String x, Term t)
| App(Term t1, Term t2)
| Var(String x)
По соглашению Приложение
является левоассоциативным, то есть abc
интерпретируется как (ab) c
, а тела функций растягиваются как можно дальше вправо, то есть λ x. x y
интерпретируется как λ x. (x y)
.
У меня есть парсер, который делает хорошую работу, но теперь мне нужен красивый принтер . Вот что у меня сейчас есть (псевдо-scala):
term match {
case Fun(v, t) => "(λ %s.%s)".format(v, prettyPrint(t))
case App(s, t) => "(%s %s)".format(prettyPrint(s), prettyPrint(t))
case Var(v) => v
}
Вышеупомянутый принтер всегда помещает (
)
вокруг выражений (кроме атомарных переменных). Таким образом, для Fun (x, App (Fun (y, x), y))
он производит
(λ x.((λ y.x) y))
Я хотел бы иметь
λ x.(λ y.x) y