1 {-# LANGUAGE ConstraintKinds #-}
2 module Symantic.Parser.Grammar
3 ( module Symantic.Parser.Grammar
4 , module Symantic.Parser.Grammar.Combinators
5 , module Symantic.Parser.Grammar.Fixity
6 , module Symantic.Parser.Grammar.Optimize
7 , module Symantic.Parser.Grammar.ObserveSharing
8 , module Symantic.Parser.Grammar.Write
9 , module Symantic.Parser.Grammar.Dump
12 import Symantic.Parser.Grammar.Combinators
13 import Symantic.Parser.Grammar.Dump
14 import Symantic.Parser.Grammar.Fixity
15 import Symantic.Parser.Grammar.ObserveSharing
16 import Symantic.Parser.Grammar.Optimize
17 import Symantic.Parser.Grammar.Write
18 import Symantic.Univariant.Letable (Letable(..))
20 import Data.Function ((.))
21 import Data.String (String)
22 import Text.Show (Show(..))
23 import qualified Language.Haskell.TH.Syntax as TH
30 , Letable TH.Name repr
37 -- | A usual pipeline to interpret 'Comb'inators:
38 -- 'observeSharing' then 'optimizeComb' then a polymorphic @(repr)@.
39 grammar :: Grammar repr => ObserveSharing TH.Name (OptimizeComb TH.Name repr) a -> repr a
40 grammar = optimizeComb . observeSharing
42 -- | A usual pipeline to show 'Comb'inators:
43 -- 'observeSharing' then 'optimizeComb' then 'dumpComb' then 'show'.
44 showGrammar :: ObserveSharing TH.Name (OptimizeComb TH.Name DumpComb) a -> String
45 showGrammar = show . dumpComb . optimizeComb . observeSharing