symantic-parser-0.0.0.20210101: src/Symantic/Parser/Grammar.hs
{-# LANGUAGE ConstraintKinds #-} -- For Grammar
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.Write
, module Symantic.Parser.Grammar.Dump
, Letable(..)
) where
import Symantic.Parser.Grammar.Combinators
import Symantic.Parser.Grammar.Dump
import Symantic.Parser.Grammar.Fixity
import Symantic.Parser.Grammar.ObserveSharing
import Symantic.Parser.Grammar.Optimize
import Symantic.Parser.Grammar.Write
import Symantic.Univariant.Letable (Letable(..))
import Data.Function ((.))
import Data.String (String)
import Text.Show (Show(..))
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
)
-- | A usual pipeline to interpret 'Comb'inators:
-- 'observeSharing' then 'optimizeComb' then a polymorphic @(repr)@.
grammar :: Grammar repr => ObserveSharing TH.Name (OptimizeComb TH.Name repr) a -> repr a
grammar = optimizeComb . observeSharing
-- | A usual pipeline to show 'Comb'inators:
-- 'observeSharing' then 'optimizeComb' then 'dumpComb' then 'show'.
showGrammar :: ObserveSharing TH.Name (OptimizeComb TH.Name DumpComb) a -> String
showGrammar = show . dumpComb . optimizeComb . observeSharing