My Question: What is the cleanest way to pretty print an expression without redundant parentheses?
I have the following representation of lambda expressions:
Term ::= Fun(String x, Term t)
| App(Term t1, Term t2)
| Var(String x)
By convention App
is left associative, that is a b c
is interpreted as (a b) c
and function bodies stretch as far to the right as possible, that is, λ x. x y
is interpreted as λ x. (x y)
.
I have a parser that does a good job, but now I want a pretty printer. Here's what I currently have (pseudo 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
}
The above printer always puts (
)
around expressions (except for atomic variables). Thus for Fun(x, App(Fun(y, x), y))
it produces
(λ x.((λ y.x) y))
I would like to have
λ x.(λ y.x) y