module Text.GrammarCombinators.Transform.UnfoldDead (
unfoldDead,
unfoldDeadE,
unfoldDeadLE
) where
import Text.GrammarCombinators.Base
import Text.GrammarCombinators.Utils.IsDead
newtype UnfoldDeadRule p (phi :: * -> *) (r :: * -> *) t v =
UDRule { unUDRule :: (forall ix. phi ix -> Bool) -> p v }
instance (ProductionRule p) =>
ProductionRule (UnfoldDeadRule p phi r t) where
a >>> b = UDRule $ \g -> unUDRule a g >>> unUDRule b g
a ||| b = UDRule $ \g -> unUDRule a g ||| unUDRule b g
die = UDRule $ \_ -> die
endOfInput = UDRule $ \_ -> endOfInput
instance (EpsProductionRule p) =>
EpsProductionRule (UnfoldDeadRule p phi r t) where
epsilon v = UDRule $ \_ -> epsilon v
instance (LiftableProductionRule p) =>
LiftableProductionRule (UnfoldDeadRule p phi r t) where
epsilonL v q = UDRule $ \_ -> epsilonL v q
instance (TokenProductionRule p t) =>
TokenProductionRule (UnfoldDeadRule p phi r t) t where
token t = UDRule $ \_ -> token t
instance (ProductionRule p,
RecProductionRule p phi r) =>
RecProductionRule (UnfoldDeadRule p phi r t) phi r where
ref idx = UDRule $ \g -> if g idx then die else ref idx
instance (ProductionRule p,
LiftableProductionRule p,
LoopProductionRule p phi r) =>
LoopProductionRule (UnfoldDeadRule p phi r t) phi r where
manyRef idx = UDRule $ \g -> if g idx then epsilonL [] [| [] |] else manyRef idx
many1Ref idx = UDRule $ \g -> if g idx then die else many1Ref idx
unfoldDeadE :: (EqFam phi, FoldFam phi, MemoFam phi) =>
GExtendedContextFreeGrammar phi r t rr ->
GExtendedContextFreeGrammar phi r t rr
unfoldDeadE gram idx = unUDRule (gram idx) $ isDead gram
unfoldDeadLE :: (EqFam phi, FoldFam phi, MemoFam phi) =>
GLExtendedContextFreeGrammar phi r t rr ->
GLExtendedContextFreeGrammar phi r t rr
unfoldDeadLE gram idx = unUDRule (gram idx) $ isDead gram
unfoldDead :: (EqFam phi, FoldFam phi, MemoFam phi) =>
GContextFreeGrammar phi r t rr ->
GContextFreeGrammar phi r t rr
unfoldDead gram idx = unUDRule (gram idx) $ isDead gram