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