我的問題:什麼是最乾淨的方式來漂亮打印一個沒有多餘括號的表達式?漂亮的打印表達式儘可能少括號?
我有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)
。
我有一個分析器,它做了很好的工作,但現在我希望有一個漂亮的打印。這是我現在有(僞階):
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
我知道的唯一參考是Norman Ramsey的「用前綴和後置運算符解析表達式」。如果你知道一點標準ML,你應該可以修改第4部分的代碼。 http://www.cs.tufts.edu/~nr/pubs/unparse-abstract.html – 2011-06-24 13:05:50
這種語言是不可知的,或者你正在尋找一個Scala答案?無論哪種方式,您可能想要標記問題以獲得更廣泛的受衆羣體。 – neontapir 2012-08-16 22:25:30