+{-# 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