Haskell中具有运算符优先级和相关性的漂亮打印语法树

时间:2016-02-14 21:43:56

标签: haskell abstract-syntax-tree pretty-print

是否有任何常用的方法甚至是一个库,用于对具有关联性和优先级分配的(二元)运算符的语法树进行漂亮的打印(和解析),以便结果使用尽可能少的括号? / p>

以命题演算的公式为例:

data Formula
    = Atom String
    | Not (Formula)
    | And (Formula) (Formula)
    | Or (Formula) (Formula)
    | Imp (Formula) (Formula) 

假设优先级为Imp< Or< And< Not(因此Not绑定最多)AndOrImp应该与权利相关联;例如,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).

生成解析器和漂亮的打印机。

1 个答案:

答案 0 :(得分:4)

Show的{​​{1}}个实例可能如下所示:

Formula

允许任何instance Show Formula where showsPrec _ (Atom name) = showString name showsPrec p (Not formula) = showParen (p > 3) $ showString "\\+ " . showsPrec 3 formula showsPrec p (And lhs rhs) = showParen (p > 2) $ showsPrec 3 lhs . showString " /\\ " . showsPrec 2 rhs showsPrec p (Or lhs rhs) = showParen (p > 1) $ showsPrec 2 lhs . showString " \\/ " . showsPrec 1 rhs showsPrec p (Imp lhs rhs) = showParen (p > 0) $ showsPrec 1 lhs . showString " -> " . showsPrec 0 rhs Formula n适当的parens:

show

打印(main = print $ Imp (And (Imp (Atom "A") (Atom "B")) (Atom "A")) (Atom "B") print):

putStrLn . show