Мой вопрос: Каков самый чистый способ красивого вывода выражения без лишних круглых скобок?
У меня есть следующее представление лямбда-выражений:
Term ::= Fun(String x, Term t)
| App(Term t1, Term t2)
| Var(String x)
По соглашению App остается ассоциативным, то есть a b c интерпретируется как (a b) 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