change license to AGPL-3.0-or-later
[haskell/symantic-parser.git] / src / Symantic / Parser / Grammar.hs
index 1cd0a36bdc8d50de364e2d68fd1b3a14f0f9b9d5..d95c7c6417cf500676fe884328fcba4b744e9e79 100644 (file)
@@ -1,12 +1,52 @@
+{-# LANGUAGE AllowAmbiguousTypes #-} -- For grammar
+{-# LANGUAGE ConstraintKinds #-} -- For Grammar
 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.Write
+  , module Symantic.Parser.Grammar.View
+  , Letable(..)
+  ) where
 import Symantic.Parser.Grammar.Combinators
-import Symantic.Parser.Grammar.Optimizations
-import Symantic.Parser.Grammar.Observations
+import Symantic.Parser.Grammar.View
+import Symantic.Parser.Grammar.Fixity
+import Symantic.Parser.Grammar.ObserveSharing
+import Symantic.Parser.Grammar.Optimize
 import Symantic.Parser.Grammar.Write
-import Symantic.Parser.Grammar.Dump
+
+import Data.Function ((.))
+import Data.String (String)
+import Text.Show (Show(..))
+import qualified Language.Haskell.TH.Syntax as TH
+
+-- * Class 'Grammar'
+type Grammar tok repr =
+  ( Applicable repr
+  , Alternable repr
+  , Satisfiable tok repr
+  , Letable TH.Name repr
+  , Selectable repr
+  , Matchable repr
+  , Foldable repr
+  , Lookable repr
+  )
+
+-- | A usual pipeline to interpret 'Comb'inators:
+-- 'observeSharing' then 'optimizeGrammar' then a polymorphic @(repr)@.
+grammar ::
+  Grammar 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 ::
+  ObserveSharing TH.Name
+    (OptimizeGrammar (ViewGrammar showName)) a ->
+  String
+showGrammar = show . viewGrammar . optimizeGrammar . observeSharing