regex-tdfa 1.3.1.2 → 1.3.1.3
raw patch · 12 files changed
+113/−92 lines, 12 files
Files
- CHANGELOG.md +13/−0
- README.md +28/−14
- lib/Text/Regex/TDFA/Common.hs +3/−3
- lib/Text/Regex/TDFA/CorePattern.hs +12/−22
- lib/Text/Regex/TDFA/NewDFA/Engine.hs +9/−9
- lib/Text/Regex/TDFA/NewDFA/Engine_FA.hs +10/−10
- lib/Text/Regex/TDFA/Pattern.hs +7/−4
- lib/Text/Regex/TDFA/ReadRegex.hs +1/−1
- lib/Text/Regex/TDFA/String.hs +1/−1
- lib/Text/Regex/TDFA/TDFA.hs +1/−1
- lib/Text/Regex/TDFA/TNFA.hs +8/−8
- regex-tdfa.cabal +20/−19
CHANGELOG.md view
@@ -1,5 +1,18 @@ For the package version policy (PVP), see http://pvp.haskell.org/faq . +### 1.3.1.3++_2022-07-14, Andreas Abel_++- Fix an `undefined` in `Show PatternSet` [#37](https://github.com/haskell-hvr/regex-tdfa/issues/37))+- Document POSIX character classes (e.g. `[[:digit:]]`)++### 1.3.1.2 Revision 1++_2022-05-25, Andreas Abel_++- Allow `base >= 4.17` (GHC 9.4)+ ### 1.3.1.2 _2022-02-19, Andreas Abel_
README.md view
@@ -55,7 +55,7 @@ λ> "alexis-de-tocqueville" =~ "[a-z]+" :: String >>> "alexis" -λ> "alexis-de-tocqueville" =~ "[0-9]+" :: String+λ> "alexis-de-tocqueville" =~ "[[:digit:]]+" :: String >>> "" ``` @@ -103,7 +103,7 @@ λ> getAllTextMatches ("john anne yifan" =~ "[a-z]+") :: [String] >>> ["john","anne","yifan"] -λ> getAllTextMatches ("0a0b0" =~ "0[a-z]0") :: [String]+λ> getAllTextMatches ("0a0b0" =~ "0[[:lower:]]0") :: [String] >>> ["0a0"] ``` Note that `"0b0"` is not included in the result since it overlaps with `"0a0"`.@@ -120,6 +120,17 @@ * `\b` — Match beginning or end of word * `\B` — Match neither beginning nor end of word +While shorthands like `\d` (for digit) are not recognized, one can use the respective+POSIX character class inside `[...]`. E.g., `[[:digit:][:lower:]_]` is short for+`[0-9a-z_]`. The supported character classes are listed on+[Wikipedia](https://en.wikipedia.org/w/index.php?title=Regular_expression&oldid=1095256273#Character_classes)+and defined in module+[`TNFA`](https://github.com/haskell-hvr/regex-tdfa/blob/95d47cb982d2cf636b2cb6260a866f9907341c45/lib/Text/Regex/TDFA/TNFA.hs#L804-L816).++Please also consult a variant of this documentation which is part of the+[Text.Regex.TDFA haddock](http://hackage.haskell.org/package/regex-tdfa/docs/Text-Regex-TDFA.html),+and the original documentation at the [Haskell wiki](https://wiki.haskell.org/Regular_expressions#regex-tdfa).+ ### Less common stuff #### Get match indices@@ -148,16 +159,6 @@ `regex-tdfa` does not provide find-and-replace. -## The relevant links--This documentation is also available in [Text.Regex.TDFA haddock](http://hackage.haskell.org/package/regex-tdfa-1.2.3.2/docs/Text-Regex-TDFA.html).--This was also documented at the [Haskell wiki](https://wiki.haskell.org/Regular_expressions#regex-tdfa). The original Darcs repository was at [code.haskell.org](http://code.haskell.org/regex-tdfa/). When not updated, this was forked and maintained by Roman Cheplyaka as [regex-tdfa-rc](http://hackage.haskell.org/package/regex-tdfa-rc).--Then the repository moved to <https://github.com/ChrisKuklewicz/regex-tdfa>, which was primarily maintained by [Artyom (neongreen)](https://github.com/neongreen).--Finally, maintainership was passed on again and the repository moved to its current location at <https://github.com/haskell-hvr/regex-tdfa>.- ## Avoiding backslashes If you find yourself writing a lot of regexes, take a look at@@ -193,10 +194,23 @@ Regardless of performance, nearly every single OS and Libra for POSIX regular expressions has bugs in sub-matches. This was detailed on the [Regex POSIX Haskell wiki page](https://wiki.haskell.org/Regex_Posix), and can be demonstrated with the [regex-posix-unittest](http://hackage.haskell.org/package/regex-posix-unittest) suite of checks. Test [regex-tdfa-unittest](http://hackage.haskell.org/package/regex-tdfa-unittest) should show regex-tdfa passing these same checks. I owe my understanding of the correct behvior and many of these unit tests to Glenn Fowler at AT&T ("An Interpretation of the POSIX regex Standard"). +### Maintainance history++The original Darcs repository was at [code.haskell.org](http://code.haskell.org/regex-tdfa/).+For a while a fork was maintained by Roman Cheplyaka as+[regex-tdfa-rc](http://hackage.haskell.org/package/regex-tdfa-rc).++Then the repository moved to <https://github.com/ChrisKuklewicz/regex-tdfa>,+which was primarily maintained by [Artyom (neongreen)](https://github.com/neongreen).++Finally, maintainership was passed on again and the repository moved to its current location+at <https://github.com/haskell-hvr/regex-tdfa>.+ ## Other related packages -You can find several other related packages by searching for "tdfa" on [hackage](http://hackage.haskell.org/packages/search?terms=tdfa).+Searching for "tdfa" on [hackage](http://hackage.haskell.org/packages/search?terms=tdfa)+finds some related packages (unmaintained as of 2022-07-14). ## Document notes -This was written 2016-04-30.+This README was originally written 2016-04-30.
lib/Text/Regex/TDFA/Common.hs view
@@ -94,7 +94,7 @@ , newSyntax :: Bool -- ^ False in blankCompOpt, True in defaultCompOpt. Add the extended non-POSIX syntax described in "Text.Regex.TDFA" haddock documentation. , lastStarGreedy :: Bool -- ^ False by default. This is POSIX correct but it takes space and is slower. -- Setting this to true will improve performance, and should be done- -- if you plan to set the captureGroups execoption to False.+ -- if you plan to set the captureGroups ExecOption to False. } deriving (Read,Show) data ExecOption = ExecOption {@@ -226,7 +226,7 @@ , dt_a,dt_b :: DT -- ^ use dt_a if test is True else use dt_b } --- | Internal type to repesent the commands for the tagged transition.+-- | Internal type to represent the commands for the tagged transition. -- The outer IntMap is for the destination Index and the inner IntMap -- is for the Source Index. This is convenient since all runtime data -- going to the same destination must be compared to find the best.@@ -246,7 +246,7 @@ -- Maximize Tag), the middle positions in the Seq, and the final -- position is NOT saved in the Orbits (only in a Maximize Tag). ----- The orderinal code is being written XXX TODO document it.+-- The original code is being written XXX TODO document it. data Orbits = Orbits { inOrbit :: !Bool -- True if enterOrbit, False if LeaveOrbit , basePos :: Position
lib/Text/Regex/TDFA/CorePattern.hs view
@@ -35,8 +35,10 @@ ,patternToQ,cleanNullView,cannotAccept,mustAccept) where import Control.Monad (liftM2, forM, replicateM)-import Control.Monad.RWS {- all -}+import Control.Monad.RWS (RWS, runRWS, ask, local, listens, tell, get, put)+ import Data.Array.IArray(Array,(!),accumArray,listArray)+import Data.Either (partitionEithers, rights) import Data.List(sort) import Data.IntMap.EnumMap2(EnumMap) import qualified Data.IntMap.EnumMap2 as Map(singleton,null,assocs,keysSet)@@ -44,6 +46,7 @@ import Data.IntSet.EnumSet2(EnumSet) import qualified Data.IntSet.EnumSet2 as Set(singleton,toList,isSubsetOf) import Data.Semigroup as Sem+ import Text.Regex.TDFA.Common {- all -} import Text.Regex.TDFA.Pattern(Pattern(..),starTrans) -- import Debug.Trace@@ -269,7 +272,7 @@ -- favoring pushing Apply into the child postTag makes PGroup happier type PM = RWS (Maybe GroupIndex) [Either Tag GroupInfo] ([OP]->[OP],Tag)-type HHQ = HandleTag -- m1 : info about left boundaary / preTag+type HHQ = HandleTag -- m1 : info about left boundary / preTag -> HandleTag -- m2 : info about right boundary / postTag -> PM Q @@ -278,18 +281,6 @@ makeGroupArray maxGroupIndex groups = accumArray (\earlier later -> later:earlier) [] (1,maxGroupIndex) filler where filler = map (\gi -> (thisIndex gi,gi)) groups -fromRight :: [Either Tag GroupInfo] -> [GroupInfo]-fromRight [] = []-fromRight ((Right x):xs) = x:fromRight xs-fromRight ((Left _):xs) = fromRight xs--partitionEither :: [Either Tag GroupInfo] -> ([Tag],[GroupInfo])-partitionEither = helper id id where- helper :: ([Tag]->[Tag]) -> ([GroupInfo]->[GroupInfo]) -> [Either Tag GroupInfo] -> ([Tag],[GroupInfo])- helper ls rs [] = (ls [],rs [])- helper ls rs ((Right x):xs) = helper ls (rs.(x:)) xs- helper ls rs ((Left x):xs) = helper (ls.(x:)) rs xs- -- Partial function: assumes starTrans has been run on the Pattern -- Note that the lazy dependency chain for this very zigzag: -- varies information is sent up the tree@@ -305,7 +296,7 @@ patternToQ compOpt (pOrig,(maxGroupIndex,_)) = (tnfa,aTags,aGroups) where (tnfa,(tag_dlist,nextTag),groups) = runRWS monad startReader startState aTags = listArray (0,pred nextTag) (tag_dlist [])- aGroups = makeGroupArray maxGroupIndex (fromRight groups)+ aGroups = makeGroupArray maxGroupIndex (rights groups) -- implicitly inside a PGroup 0 converted into a GroupInfo 0 undefined 0 1 monad = go (starTrans pOrig) (Advice 0) (Advice 1)@@ -354,8 +345,7 @@ -- withOrbit uses MonadWriter(listens to makeOrbit/Left), collects -- children at all depths withOrbit :: PM a -> PM (a,[Tag])- withOrbit = listens childStars- where childStars x = let (ts,_) = partitionEither x in ts+ withOrbit = listens $ fst . partitionEithers {-# INLINE makeGroup #-} -- makeGroup usesMonadWriter(tell/Right)@@ -380,7 +370,7 @@ withParent :: GroupIndex -> PM a -> PM (a,[Tag]) withParent this = local (const (Just this)) . listens childGroupInfo where childGroupInfo x =- let (_,gs) = partitionEither x+ let gs = snd $ partitionEithers x children :: [GroupIndex] children = norep . sort . map thisIndex -- filter to get only immediate children (efficiency)@@ -389,7 +379,7 @@ -- combineConcat is a partial function: Must not pass in an empty list -- Policy choices:- -- * pass tags to apply to children and have no preTag or postTag here (so none addded to nullQ)+ -- * pass tags to apply to children and have no preTag or postTag here (so none added to nullQ) -- * middle 'mid' tag: give to left/front child as postTag so a Group there might claim it as a stopTag -- * if parent is Group then preReset will become non-empty combineConcat :: [Pattern] -> HHQ@@ -465,7 +455,7 @@ newUniq = if needUniqTags then uniq "POr branch" else return bAdvice -- trace ("\nPOr sub "++show aAdvice++" "++show bAdvice++"needsTags is "++show needTags) $ return () -- The "bs" values are allocated in left-to-right order before the children in "qs"- -- optimiztion: low priority for last branch is implicit, do not create separate tag here.+ -- optimization: low priority for last branch is implicit, do not create separate tag here. bs <- fmap (++[bAdvice]) $ replicateM (pred $ length branches) newUniq -- 2 <= length ps -- create all the child branches in left-to-right order after the "bs" qs <- forM (zip branches bs) (\(branch,bTag) -> (go branch aAdvice bTag))@@ -544,7 +534,7 @@ -- -- If the parent index is Nothing then this is part of a -- non-capturing subtree and ignored. This is a lazy and- -- efficient alternative to rebuidling the tree with PGroup+ -- efficient alternative to rebuilding the tree with PGroup -- Nothing replacing PGroup (Just _). -- -- Guarded by the getParentIndex /= Nothing check is the@@ -593,7 +583,7 @@ -- PNonEmpty means the child pattern p can be skipped by -- bypassing the pattern. This is only used in the case p -- can accept 0 and can accept more than zero characters- -- (thus the assertions, enforcted by CorePattern.starTrans).+ -- (thus the assertions, enforced by CorePattern.starTrans). -- The important thing about this case is intercept the -- "accept 0" possibility and replace with "skip". PNonEmpty p -> mdo
lib/Text/Regex/TDFA/NewDFA/Engine.hs view
@@ -178,7 +178,7 @@ -- position and the basePos position. Entries in different groups -- will never be comparable in the future so they can be processed -- separately. Groups could probably be even more finely--- distinguished, as a futher optimization, but the justification will+-- distinguished, as a further optimization, but the justification will -- be tricky. -- -- Current Tag-0 values are at most offset and all newly spawned@@ -193,7 +193,7 @@ -- is avoided. -- -- An entry in a group can only collide with that group's--- descendents. compressOrbit sends each group to the compressGroup+-- descendants. compressOrbit sends each group to the compressGroup -- command. -- -- compressGroup on a single record checks whether it's Seq can be@@ -201,19 +201,19 @@ -- this this not particularly important). -- -- compressGroup on many records sorts and groups the members and zips--- the groups with their new ordinal value. The comparision is based+-- the groups with their new ordinal value. The comparison is based -- on the old ordinal value, then the inOrbit value, and then the (Seq -- Position) data. -- -- The old ordinals of the group will all be Nothing or all be Just, -- but this condition is neither checked nor violations detected.--- This comparision is justified because once records get different+-- This comparison is justified because once records get different -- ordinals assigned they will never change places. -- -- The inOrbit Bool is only different if one of them has set the stop--- position to at most (succ offset). They will obly be compared if+-- position to at most (succ offset). They will only be compared if -- the other one leaves, an its stop position will be at least offset.--- The previous sentence is justified by inspectin of the "assemble"+-- The previous sentence is justified by inspection of the "assemble" -- function in the TDFA module: there is no (PostUpdate -- LeaveOrbitTask) so the largest possible value for the stop Tag is -- (pred offset). Thus the record with inOrbit==False would beat (be@@ -221,7 +221,7 @@ -- -- The Seq comparison is safe because the largest existing Position -- value is (pred offset) and the smallest future Position value is--- offset. The previous sentence is justified by inspectin of the+-- offset. The previous sentence is justified by inspection of the -- "assemble" function in the TDFA module: there is no (PostUpdate -- EnterOrbitTags) so the largest possible value in the Seq is (pred -- offset).@@ -323,7 +323,7 @@ -- A non-empty winner from the startState might obscure a potential -- empty winner (form the startState at the current offset). This -- winEmpty possibility is also checked for. (unit test pattern ".*")--- (futher test "(.+|.+.)*" on "aa\n")+-- (further test "(.+|.+.)*" on "aa\n") {-# INLINE processWinner #-} processWinner s1 did dt w offset = {-# SCC "goNext.newWinnerThenProceed" #-} do@@ -716,7 +716,7 @@ -- This has been updated for ghc 6.8.3 and still works with ghc 6.10.1 {-# INLINE copySTU #-} copySTU :: (Show i,Ix i,MArray (STUArray s) e (S.ST s)) => STUArray s i e -> STUArray s i e -> S.ST s () -- (STUArray s i e)-copySTU _souce@(STUArray _ _ _ msource) _destination@(STUArray _ _ _ mdest) =+copySTU _source@(STUArray _ _ _ msource) _destination@(STUArray _ _ _ mdest) = -- do b1 <- getBounds s1 -- b2 <- getBounds s2 -- when (b1/=b2) (error ("\n\nWTF copySTU: "++show (b1,b2)))
lib/Text/Regex/TDFA/NewDFA/Engine_FA.hs view
@@ -115,14 +115,14 @@ -- compressOrbit. -- -- compressOrbit on such a Tag loops through all the NFS states'--- m_orbit record, discardind ones that are Nothing and discarding+-- m_orbit record, discarding ones that are Nothing and discarding -- ones that are too new to care about (after the cutoff value). -- -- compressOrbit then groups the Orbits records by the Tag-0 start--- position and the basePos position. Entried in different groups+-- position and the basePos position. Entries in different groups -- will never be comparable in the future so they can be processed -- separately. Groups could probably be even more finely--- distinguished, as a futher optimization, but the justification will+-- distinguished, as a further optimization, but the justification will -- be tricky. -- -- Current Tag-0 values are at most offset and all newly spawned@@ -137,7 +137,7 @@ -- is avoided. -- -- An entry in a group can only collide with that group's--- descendents. compressOrbit sends each group to the compressGroup+-- descendants. compressOrbit sends each group to the compressGroup -- command. -- -- compressGroup on a single record checks whether it's Seq can be@@ -145,19 +145,19 @@ -- this this not particularly important). -- -- compressGroup on many records sorts and groups the members and zips--- the groups with their new ordinal value. The comparision is based+-- the groups with their new ordinal value. The comparison is based -- on the old ordinal value, then the inOrbit value, and then the (Seq -- Position) data. -- -- The old ordinals of the group will all be Nothing or all be Just, -- but this condition is neither checked nor violations detected.--- This comparision is justified because once records get different+-- This comparison is justified because once records get different -- ordinals assigned they will never change places. -- -- The inOrbit Bool is only different if one of them has set the stop -- position to at most (succ offset). They will obly be compared if -- the other one leaves, an its stop position will be at least offset.--- The previous sentence is justified by inspectin of the "assemble"+-- The previous sentence is justified by inspection of the "assemble" -- function in the TDFA module: there is no (PostUpdate -- LeaveOrbitTask) so the largest possible value for the stop Tag is -- (pred offset). Thus the record with inOrbit==False would beat (be@@ -165,7 +165,7 @@ -- -- The Seq comparison is safe because the largest existing Position -- value is (pred offset) and the smallest future Position value is--- offset. The previous sentence is justified by inspectin of the+-- offset. The previous sentence is justified by inspection of the -- "assemble" function in the TDFA module: there is no (PostUpdate -- EnterOrbitTags) so the largest possible value in the Seq is (pred -- offset).@@ -269,7 +269,7 @@ -- A non-empty winner from the startState might obscure a potential -- empty winner (form the startState at the current offset). This -- winEmpty possibility is also checked for. (unit test pattern ".*")--- (futher test "(.+|.+.)*" on "aa\n")+-- (further test "(.+|.+.)*" on "aa\n") {-# INLINE processWinner #-} processWinner :: MScratch s -> IntMap Instructions -> Position -> ST s ()@@ -613,7 +613,7 @@ -- This has been updated for ghc 6.8.3 and still works with ghc 6.10.1 {-# INLINE copySTU #-} copySTU :: (Show i,Ix i,MArray (STUArray s) e (S.ST s)) => STUArray s i e -> STUArray s i e -> S.ST s () -- (STUArray s i e)-copySTU _souce@(STUArray _ _ _ msource) _destination@(STUArray _ _ _ mdest) =+copySTU _source@(STUArray _ _ _ msource) _destination@(STUArray _ _ _ mdest) = -- do b1 <- getBounds s1 -- b2 <- getBounds s2 -- when (b1/=b2) (error ("\n\nWTF copySTU: "++show (b1,b2)))
lib/Text/Regex/TDFA/Pattern.hs view
@@ -1,6 +1,9 @@+{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}+ -- | This "Text.Regex.TDFA.Pattern" module provides the 'Pattern' data -- type and its subtypes. This 'Pattern' type is used to represent -- the parsed form of a Regular Expression.+ module Text.Regex.TDFA.Pattern (Pattern(..) ,PatternSet(..)@@ -105,9 +108,9 @@ in shows charSpec . showsPrec i scc' . showsPrec i sce' . showsPrec i sec' . if '-' `elem` special then showChar '-' else id- where byRange xAll@(x:xs) | length xAll <=3 = xAll- | otherwise = groupRange x 1 xs- byRange _ = undefined+ where byRange xAll@(~(x:xs))+ | length xAll <=3 = xAll+ | otherwise = groupRange x 1 xs groupRange x n (y:ys) = if (fromEnum y)-(fromEnum x) == n then groupRange x (succ n) ys else (if n <=3 then take n [x..] else x:'-':(toEnum (pred n+fromEnum x)):[]) ++ groupRange y 1 ys@@ -139,7 +142,7 @@ starTrans :: Pattern -> Pattern starTrans = dfsPattern (simplify' . starTrans') --- | Apply a Pattern transfomation function depth first+-- | Apply a Pattern transformation function depth first dfsPattern :: (Pattern -> Pattern) -- ^ The transformation function -> Pattern -- ^ The Pattern to transform -> Pattern -- ^ The transformed Pattern
lib/Text/Regex/TDFA/ReadRegex.hs view
@@ -33,7 +33,7 @@ p_regex :: CharParser (GroupIndex,Int) Pattern p_regex = liftM POr $ sepBy1 p_branch (char '|') --- man re_format helps alot, it says one-or-more pieces so this is+-- man re_format helps a lot, it says one-or-more pieces so this is -- many1 not many. Use "()" to indicate an empty piece. p_branch = liftM PConcat $ many1 p_piece
lib/Text/Regex/TDFA/String.hs view
@@ -66,7 +66,7 @@ rest = map fst (tail (elems mt)) -- will be [] in Right (Just (pre,main,post,rest)) --- Minimal defintion for now+-- Minimal definition for now instance RegexLike Regex String where matchOnce r s = listToMaybe (matchAll r s) matchAll r s = execMatch r 0 '\n' s
lib/Text/Regex/TDFA/TDFA.hs view
@@ -1,5 +1,5 @@ -- | "Text.Regex.TDFA.TDFA" converts the QNFA from TNFA into the DFA.--- A DFA state corresponds to a Set of QNFA states, repesented as list+-- A DFA state corresponds to a Set of QNFA states, represented as list -- of Index which are used to lookup the DFA state in a lazy Trie -- which holds all possible subsets of QNFA states. module Text.Regex.TDFA.TDFA(patternToRegex,DFA(..),DT(..)
lib/Text/Regex/TDFA/TNFA.hs view
@@ -11,7 +11,7 @@ -- -- This holds every possible way to follow one state by another, while -- in the DFA these will be reduced by picking a single best--- transition for each (soure,destination) pair. The transitions are+-- transition for each (source,destination) pair. The transitions are -- heavily and often redundantly annotated with tasks to perform, and -- this redundancy is reduced when picking the best transition. So -- far, keeping all this information has helped fix bugs in both the@@ -19,7 +19,7 @@ -- -- The QNFA for a Pattern with a starTraned Q\/P form with N one -- character accepting leaves has at most N+1 nodes. These nodes--- repesent the future choices after accepting a leaf. The processing+-- represent the future choices after accepting a leaf. The processing -- of Or nodes often reduces this number by sharing at the end of the -- different paths. Turning off capturing while compiling the pattern -- may (future extension) reduce this further for some patterns by@@ -71,7 +71,7 @@ qtwin,qtlose :: QT -- qtwin is the continuation after matching the whole pattern. It has--- no futher transitions and sets tag #1 to the current position.+-- no further transitions and sets tag #1 to the current position. qtwin = Simple {qt_win=[(1,PreUpdate TagTask)],qt_trans=mempty,qt_other=mempty} -- qtlose is the continuation to nothing, used when ^ or $ tests fail. qtlose = Simple {qt_win=mempty,qt_trans=mempty,qt_other=mempty}@@ -221,7 +221,7 @@ -- are handled. -- -- mergeQT_2nd is used by the NonEmpty case and always discards the--- first argument's win and uses the second argment's win.+-- first argument's win and uses the second argument's win. -- -- mergeAltQT is used by the Or cases and is biased to the first -- argument's winning transition, if present.@@ -238,7 +238,7 @@ | nullQT q2 = q1 -- union wins | otherwise = mergeQTWith mappend q1 q2 -- no preference, win with combined SetTag XXX is the wrong thing! "(.?)*" --- This takes a function which implements a policy on mergining+-- This takes a function which implements a policy on merging -- winning transitions and then merges all the transitions. It opens -- the CharMap newtype for more efficient operation, then rewraps it. mergeQTWith :: (WinTags -> WinTags -> WinTags) -> QT -> QT -> QT@@ -408,7 +408,7 @@ getE (eLoop,Just accepting,_) = fromQT (mergeQT (getQT eLoop) (getQT accepting)) getE (eLoop,Nothing,_) = eLoop --- 2009: See coment for addTest. Here is a case where the third component might be a (Just qnfa) and it+-- 2009: See comment for addTest. Here is a case where the third component might be a (Just qnfa) and it -- is being lost even though the added test might be redundant. addTestAC :: TestInfo -> ActCont -> ActCont addTestAC ti (e,mE,_) = (addTest ti e@@ -756,7 +756,7 @@ let trans = toMap mempty . S.toAscList . addNewline . decodePatternSet $ ps in Simple { qt_win = mempty, qt_trans = trans, qt_other = target } _ -> err ("Cannot acceptTrans pattern "++show (qTop,pIn))- where -- Take a common destination and a sorted list of unique chraceters+ where -- Take a common destination and a sorted list of unique characters -- and create a map from those characters to the common destination toMap :: IntMap [(DoPa,[(Tag, TagUpdate)])] -> [Char] -> CharMap (IntMap [(DoPa,[(Tag, TagUpdate)])])@@ -795,7 +795,7 @@ withMSEC = foldl (flip S.insert) withMSCC (maybe [] (concatMap unSEC . S.toAscList) msec) in withMSEC --- | This returns the disctince ascending list of characters+-- | This returns the distinct ascending list of characters -- represented by [: :] values in legalCharacterClasses; unrecognized -- class names return an empty string decodeCharacterClass :: PatternSetCharacterClass -> String
regex-tdfa.cabal view
@@ -1,6 +1,6 @@ cabal-version: 1.12 name: regex-tdfa-version: 1.3.1.2+version: 1.3.1.3 build-Type: Simple license: BSD3@@ -25,18 +25,19 @@ test/cases/*.txt tested-with:- GHC == 7.4.2- GHC == 7.6.3- GHC == 7.8.4- GHC == 7.10.3- GHC == 8.0.2- GHC == 8.2.2- GHC == 8.4.4- GHC == 8.6.5- GHC == 8.8.4- GHC == 8.10.7+ GHC == 9.4.1+ GHC == 9.2.3 GHC == 9.0.2- GHC == 9.2.1+ GHC == 8.10.7+ GHC == 8.8.4+ GHC == 8.6.5+ GHC == 8.4.4+ GHC == 8.2.2+ GHC == 8.0.2+ GHC == 7.10.3+ GHC == 7.8.4+ GHC == 7.6.3+ GHC == 7.4.2 source-repository head type: git@@ -45,7 +46,7 @@ source-repository this type: git location: https://github.com/haskell-hvr/regex-tdfa.git- tag: v1.3.1.2+ tag: v1.3.1.3 flag force-O2 default: False@@ -96,14 +97,14 @@ if !impl(ghc >= 8.0) build-depends: fail == 4.9.* , semigroups == 0.18.* || == 0.19.*- build-depends: array >= 0.4 && < 0.6- , base >= 4.5 && < 4.17- , bytestring >= 0.9.2 && < 0.12- , containers >= 0.4.2 && < 0.7- , mtl >= 2.1.3 && < 2.4+ build-depends: array >= 0.4 && < 0.6+ , base >= 4.5 && < 5+ , bytestring >= 0.9.2 && < 0.12+ , containers >= 0.4.2 && < 0.7+ , mtl >= 2.1.3 && < 2.4 , parsec == 3.1.* , regex-base == 0.94.*- , text >= 1.2.3 && < 2.1+ , text >= 1.2.3 && < 2.1 default-language: Haskell2010 default-extensions: BangPatterns