我的问题:如何以最简洁的方式漂亮地打印表达式而不带有冗余的括号?
我有以下lambda表达式的表示:
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))
I would like to have
λ x.(λ y.x) y