{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE NoMonomorphismRestriction #-} module Symantic.Parser.Grammar ( module Symantic.Parser.Grammar , module Symantic.Parser.Grammar.Combinators , module Symantic.Parser.Grammar.Optimize , module Symantic.Parser.Grammar.ObserveSharing , module Symantic.Parser.Grammar.Write , module Symantic.Parser.Grammar.Dump ) where import Symantic.Parser.Grammar.Combinators import Symantic.Parser.Grammar.Optimize import Symantic.Parser.Grammar.ObserveSharing import Symantic.Parser.Grammar.Write import Symantic.Parser.Grammar.Dump import Symantic.Univariant.Letable (Letable) import Data.Function ((.)) import Data.String (String) import System.IO (IO) import Text.Show (Show(..)) import qualified Data.Functor as Functor import qualified Language.Haskell.TH.Syntax as TH -- Class 'Grammar' type Grammar repr = ( Applicable repr , Alternable repr , Charable repr , Letable TH.Name repr , Selectable repr , Matchable repr , Foldable repr , Lookable repr ) -- | A usual pipeline to show 'Comb'inators: 'observeSharing' then 'optimizeComb' then 'dumpComb' then 'show'. -- Note that the 'IO' is required to 'observeSharing' which is required to avoid an infinite recursion when generating. grammar = (optimizeComb Functor.<$>) . observeSharing -- | A usual pipeline to show 'Comb'inators: 'observeSharing' then 'optimizeComb' then 'dumpComb' then 'show'. -- Note that the 'IO' is required to 'observeSharing' which is required to avoid an infinite recursion when the grammar is recursive. showGrammar :: ObserveSharing TH.Name (OptimizeComb TH.Name DumpComb) a -> IO String showGrammar = (show . dumpComb . optimizeComb Functor.<$>) . observeSharing