有没有常用的方法或者库可以将带有结合性和优先级的(二元)操作符的语法树进行漂亮的打印(和解析),以便结果使用尽可能少的括号?
以命题演算公式为例:
data Formula
= Atom String
| Not (Formula)
| And (Formula) (Formula)
| Or (Formula) (Formula)
| Imp (Formula) (Formula)
假设优先级为
Imp
< Or
< And
< Not
(因此,Not
优先级最高),并且 And
, Or
和 Imp
应该向右结合; 因此,例如, Imp(And(Imp(Atom“ A”)(Atom“ B”))(Atom“ A”))(Atom“ B”)
应打印类似于(A -> B)/\ A -> B
的内容。
当然可以通过模式匹配来实现,但这很繁琐而且非常不愉快。我正在寻找与Coq证明助手的此表示法类似的东西:
Notation "A /\ B" := (and A B) (at level 80, right associativity).
生成一个解析器和一个漂亮的打印机。