module Text.GrammarCombinators.Base.Processor (
GProcessor,
Processor,
identityProcessor,
trivialProcessor,
applyProcessor',
applyProcessor,
applyProcessorL,
applyProcessorLE,
applyProcessorE
) where
import Text.GrammarCombinators.Base.Grammar
import Text.GrammarCombinators.Base.Domain
import Text.GrammarCombinators.Base.MultiRec
import Text.GrammarCombinators.Base.ProductionRule
import Language.Haskell.TH.Syntax (Q, Exp)
type GProcessor phi r rr = forall ix. phi ix -> rr ix -> r ix
type Processor phi r = GProcessor phi r (PF phi r)
identityProcessor :: GProcessor phi r r
identityProcessor _ v = v
applyProcessor' ::
(ProductionRule p, EpsProductionRule p) =>
(forall ix . phi ix -> p (r ix)) ->
GProcessor phi r' r ->
(forall ix . phi ix -> p (r' ix))
applyProcessor' grammar proc idx =
proc idx $>> grammar idx
applyProcessor ::
GContextFreeGrammar phi t r rr ->
GProcessor phi rr' rr ->
GContextFreeGrammar phi t r rr'
applyProcessor gram proc idx = applyProcessor' gram proc idx
applyProcessorL ::
(LiftFam phi) =>
GLContextFreeGrammar phi t r rr ->
GProcessor phi rr' rr ->
Q Exp ->
GLContextFreeGrammar phi t r rr'
applyProcessorL gram proc q idx = (proc idx, [| $(q) $(return $ liftIdxE idx) |]) $|>> gram idx
applyProcessorE ::
GExtendedContextFreeGrammar phi t r rr ->
GProcessor phi rr' rr ->
GExtendedContextFreeGrammar phi t r rr'
applyProcessorE gram proc idx = applyProcessor' gram proc idx
applyProcessorLE ::
(LiftFam phi) =>
GLExtendedContextFreeGrammar phi t r rr ->
GProcessor phi rr' rr ->
Q Exp ->
GLExtendedContextFreeGrammar phi t r rr'
applyProcessorLE gram proc q idx = (proc idx, [| $(q) $(return $ liftIdxE idx) |]) $|>> gram idx
trivialProcessor :: Processor phi (K0 ())
trivialProcessor _ _ = K0 ()