module Grammar where import Pretty data Grammar = Empty | Alt Grammar Grammar | Seq Grammar Grammar | Many Grammar | Opt Grammar | Terminal String | Nonterminal String Grammar | Grammar :--- String ppGrammar :: Grammar -> (Doc,[Doc]) ppGrammar p = case p of Empty -> (empty,[]) Seq p1 p2 -> (m1<+>m2,a1++a2) where (m1,a1) = ppGrammar p1 (m2,a2) = ppGrammar p2 Nonterminal s p -> (text "<"<>text s<>text ">",(text s<+>text "="<+>m): a) where (m,a) = ppGrammar p p :--- s -> (m<+>text "--"<+>text s,a) where (m,a) = ppGrammar p Terminal s -> (text s,[]) Opt p1 -> (brackets m,as) where (m,as) = ppGrammar p1 Alt p1 p2 -> (vcat ms,concat as) where (ms,as) = unzip (map ppGrammar [p1,p2]) Many p -> (braces m,a) where (m,a) = ppGrammar p