symantic-parser-0.1.0.20210201: src/Symantic/Parser/Grammar.hs
{-# LANGUAGE AllowAmbiguousTypes #-} -- For grammar
{-# 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.View
, Letable(..)
) 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.Optimize
import Symantic.Parser.Grammar.Write
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