【发布时间】:2011-09-10 18:55:18
【问题描述】:
我的问题:在没有多余括号的情况下漂亮地打印表达式的最简洁方法是什么?
我有以下 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))
我想要
λ x.(λ y.x) y
【问题讨论】:
-
我知道的唯一参考文献是 Norman Ramsey 的“Unparsing Expressions with Prefix and Post Operators”。如果您了解一点标准机器学习,您应该能够修改第 4 节中的代码。 cs.tufts.edu/~nr/pubs/unparse-abstract.html
-
这种语言是不可知论的,还是您正在寻找 Scala 的答案?无论哪种方式,您都可能希望标记问题以吸引更广泛的受众。