bump version
[haskell/symantic-parser.git] / src / Symantic / Parser / Grammar.hs
index 1cd0a36bdc8d50de364e2d68fd1b3a14f0f9b9d5..18a5c0a4ba3bb3463acf898990010d20c1227603 100644 (file)
@@ -1,12 +1,65 @@
+{-# LANGUAGE AllowAmbiguousTypes #-} -- For grammar
+{-# LANGUAGE ConstraintKinds #-} -- For Grammarable
 module Symantic.Parser.Grammar
- ( module Symantic.Parser.Grammar.Combinators
- , module Symantic.Parser.Grammar.Optimizations
- , module Symantic.Parser.Grammar.Observations
- , module Symantic.Parser.Grammar.Write
- , module Symantic.Parser.Grammar.Dump
- ) where
+  ( module Symantic.Parser.Grammar
+  , module Symantic.Parser.Grammar.Combinators
+  , module Symantic.Parser.Grammar.Fixity
+  , module Symantic.Parser.Grammar.Optimize
+  , module Symantic.Parser.Grammar.ObserveSharing
+  , module Symantic.Parser.Grammar.Production
+  , module Symantic.Parser.Grammar.Write
+  , module Symantic.Parser.Grammar.View
+  , Letable(..)
+  , Letsable(..)
+  ) where
 import Symantic.Parser.Grammar.Combinators
-import Symantic.Parser.Grammar.Optimizations
-import Symantic.Parser.Grammar.Observations
+import Symantic.Parser.Grammar.Fixity
+import Symantic.Parser.Grammar.ObserveSharing
+import Symantic.Parser.Grammar.Optimize
+import Symantic.Parser.Grammar.Production
+import Symantic.Parser.Grammar.View
 import Symantic.Parser.Grammar.Write
-import Symantic.Parser.Grammar.Dump
+
+import Control.DeepSeq (NFData)
+import Data.Eq (Eq(..))
+import Data.Function ((.))
+import Data.String (String)
+import Data.Typeable (Typeable)
+import Text.Show (Show(..))
+import qualified Language.Haskell.TH.Syntax as TH
+
+-- * Class 'Grammarable'
+type Grammarable tok repr =
+  ( CombAlternable repr
+  , CombApplicable repr
+  , CombFoldable repr
+  , Letable TH.Name repr
+  , Letsable TH.Name repr
+  , CombLookable repr
+  , CombMatchable repr
+  , CombSatisfiable tok repr
+  , CombSelectable repr
+  , Eq tok
+  , TH.Lift tok
+  , NFData tok
+  , Show tok
+  , Typeable tok
+  )
+
+-- | A usual pipeline to interpret 'Comb'inators:
+-- 'observeSharing' then 'optimizeGrammar' then a polymorphic @(repr)@.
+grammar ::
+  Grammarable tok repr =>
+  ObserveSharing TH.Name
+    (OptimizeGrammar repr) a ->
+  repr a
+grammar = optimizeGrammar . observeSharing
+
+-- | An usual pipeline to show 'Comb'inators:
+-- 'observeSharing' then 'optimizeGrammar' then 'viewGrammar' then 'show'.
+showGrammar :: forall showName a tok repr.
+  repr ~ ObserveSharing TH.Name (OptimizeGrammar (ViewGrammar showName)) =>
+  ShowLetName showName TH.Name =>
+  Grammarable tok repr =>
+  repr a -> String
+showGrammar = show . viewGrammar . grammar @tok