-{-# LANGUAGE ConstraintKinds #-} -- For Grammar
+{-# LANGUAGE AllowAmbiguousTypes #-} -- For grammar
+{-# LANGUAGE ConstraintKinds #-} -- For Grammarable
module Symantic.Parser.Grammar
( 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.SharingObserver
+ , module Symantic.Parser.Grammar.Production
, module Symantic.Parser.Grammar.Write
, module Symantic.Parser.Grammar.View
- , Letable(..)
+ , Referenceable(..)
+ , Letsable(..)
) where
import Symantic.Parser.Grammar.Combinators
-import Symantic.Parser.Grammar.View
-import Symantic.Parser.Grammar.Fixity
-import Symantic.Parser.Grammar.ObserveSharing
+import Symantic.Parser.Grammar.SharingObserver
import Symantic.Parser.Grammar.Optimize
+import Symantic.Parser.Grammar.Production
+import Symantic.Parser.Grammar.View
import Symantic.Parser.Grammar.Write
-import Symantic.Univariant.Letable (Letable(..))
+import Control.DeepSeq (NFData)
+import Data.Eq (Eq)
+import Data.Ord (Ord)
import Data.Function ((.))
import Data.String (String)
+import Data.Typeable (Typeable)
import Text.Show (Show(..))
+import Language.Haskell.TH.HideName
import qualified Language.Haskell.TH.Syntax as TH
--- Class 'Grammar'
-type Grammar repr =
- ( Applicable repr
- , Alternable repr
- --, Satisfiable repr
- , Letable TH.Name repr
- , Selectable repr
- , Matchable repr
- , Foldable repr
- , Lookable repr
+-- * Type 'Grammar'
+type Grammar repr = SharingObserver TH.Name (OptimizeGrammar repr)
+
+-- ** Class 'Grammarable'
+type Grammarable tok repr =
+ ( CombAlternable repr
+ , CombApplicable repr
+ , CombFoldable repr
+ , Referenceable TH.Name repr
+ , Letsable TH.Name repr
+ , CombLookable repr
+ , CombMatchable repr
+ , CombSatisfiable tok repr
+ , CombSelectable repr
+ --, CombRegisterable repr
+ , CombRegisterableUnscoped repr
+ , Eq tok
+ , Ord 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 :: Grammar repr => ObserveSharing TH.Name (OptimizeGrammar TH.Name repr) a -> repr a
-grammar = optimizeGrammar . observeSharing
+-- 'sharingObserver' then 'optimizeGrammar' then a polymorphic @(repr)@.
+grammar :: Grammarable tok repr => Grammar repr a -> repr a
+grammar = optimizeGrammar . sharingObserver
--- | A usual pipeline to show 'Comb'inators:
--- 'observeSharing' then 'optimizeGrammar' then 'viewGrammar' then 'show'.
-showGrammar :: ObserveSharing TH.Name (OptimizeGrammar TH.Name ViewGrammar) a -> String
-showGrammar = show . viewGrammar . optimizeGrammar . observeSharing
+-- | An usual pipeline to show 'Comb'inators:
+-- 'sharingObserver' then 'optimizeGrammar' then 'viewGrammar' then 'show'.
+showGrammar :: forall showName a tok.
+ HideableName showName =>
+ Grammarable tok (Grammar (ViewGrammar showName)) =>
+ Grammar (ViewGrammar showName) a -> String
+showGrammar = show . viewGrammar . grammar @tok