regex-tdfa-1.1.1: Replaces/Enhances Text.RegexContentsIndex
Text.Regex.TDFA.CorePattern
Description

The CorePattern module deconstructs the Pattern tree created by ReadRegex.parseRegex and returns a simpler Q/P tree with annotations at each Q node. This will be converted by the TNFA module into a QNFA finite automata.

Of particular note, this Pattern to Q/P conversion creates and assigns all the internal Tags that will be used during the matching process, and associates the captures groups with the tags that represent their starting and ending locations and with their immediate parent group.

Each Maximize and Minimize tag is held as either a preTag or a postTag by one and only one location in the Q/P tree. The Orbit tags are each held by one and only one Star node. Tags that stop a Group are also held in perhaps numerous preReset lists.

The additional nullQ::nullView field of Q records the potentially complex information about what tests and tags must be used if the pattern unQ::P matches 0 zero characters. There can be redundancy in nullView, which is eliminated by cleanNullView.

Uses recursive do notation.

2009 XXX TODO: we can avoid needing tags in the part of the pattern after the last capturing group (when right-associative). This is flipped for left-associative where the front of the pattern before the first capturing group needs no tags. The edge of these regions is subtle: both case needs a Maximize tag. One ought to be able to check the Pattern: if the root is PConcat then a scan from the end (start) looking for the first with an embedded PGroup can be found and the PGroup free elements can be wrapped in some new PNOTAG semantic indicator.

Synopsis
data Q = Q {
nullQ :: NullView
takes :: (Position, Maybe Position)
preReset :: [Tag]
postSet :: [Tag]
preTag :: Maybe Tag
postTag :: Maybe Tag
tagged :: Bool
childGroups :: Bool
wants :: Wanted
unQ :: P
}
data P
= Empty
| Or [Q]
| Seq Q Q
| Star {
getOrbit :: Maybe Tag
resetOrbits :: [Tag]
firstNull :: Bool
unStar :: Q
}
| Test TestInfo
| OneChar Pattern
| NonEmpty Q
data WhichTest
= Test_BOL
| Test_EOL
| Test_BOB
| Test_EOB
| Test_BOW
| Test_EOW
| Test_EdgeWord
| Test_NotEdgeWord
data Wanted
= WantsQNFA
| WantsQT
| WantsBoth
| WantsEither
type TestInfo = (WhichTest, DoPa)
data OP
= Maximize
| Minimize
| Orbit
| Ignore
newtype SetTestInfo = SetTestInfo {
getTests :: EnumMap WhichTest (EnumSet DoPa)
}
type NullView = [(SetTestInfo, TagList)]
patternToQ :: CompOption -> (Pattern, (GroupIndex, DoPa)) -> (Q, Array Tag OP, Array GroupIndex [GroupInfo])
cleanNullView :: NullView -> NullView
cannotAccept :: Q -> Bool
mustAccept :: Q -> Bool
Documentation
data Q
Constructors
Q
nullQ :: NullView
takes :: (Position, Maybe Position)
preReset :: [Tag]
postSet :: [Tag]
preTag :: Maybe Tag
postTag :: Maybe Tag
tagged :: Bool
childGroups :: Bool
wants :: Wanted
unQ :: P
show/hide Instances
data P
Constructors
Empty
Or [Q]
Seq Q Q
Star
getOrbit :: Maybe Tag
resetOrbits :: [Tag]
firstNull :: Bool
unStar :: Q
Test TestInfo
OneChar Pattern
NonEmpty Q
show/hide Instances
data WhichTest
Known predicates, just Beginning of Line (^) and End of Line ($). Also support for GNU extensions is being added: ` beginning of buffer, ' end of buffer, < and > for begin and end of words, b and B for word boundary and not word boundary.
Constructors
Test_BOL
Test_EOL
Test_BOB
Test_EOB
Test_BOW
Test_EOW
Test_EdgeWord
Test_NotEdgeWord
show/hide Instances
data Wanted
Constructors
WantsQNFA
WantsQT
WantsBoth
WantsEither
show/hide Instances
type TestInfo = (WhichTest, DoPa)
data OP
Internal use to indicate type of tag and preference for larger or smaller Positions
Constructors
Maximize
Minimize
Orbit
Ignore
show/hide Instances
newtype SetTestInfo
Constructors
SetTestInfo
getTests :: EnumMap WhichTest (EnumSet DoPa)
show/hide Instances
type NullView = [(SetTestInfo, TagList)]
patternToQ :: CompOption -> (Pattern, (GroupIndex, DoPa)) -> (Q, Array Tag OP, Array GroupIndex [GroupInfo])
cleanNullView :: NullView -> NullView
cannotAccept :: Q -> Bool
mustAccept :: Q -> Bool
Produced by Haddock version 2.3.0