Красивое печатное выражение с минимальным количеством круглых скобок?

Мой вопрос: Каков самый чистый способ красиво напечатать выражение без лишних скобок?


У меня есть следующее представление лямбда-выражений:

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
14
задан aioobe 8 June 2011 в 11:21
поделиться