Мой вопрос: Каков самый чистый способ красивого вывода выражения без лишних круглых скобок?
У меня есть следующее представление лямбда-выражений:
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