regexpr 0.1.5 → 0.1.6
raw patch · 6 files changed
+110/−32 lines, 6 files
Files
- Hidden/ParseRegexStr.hs +43/−16
- Hidden/RegexPRTypes.hs +14/−6
- Hidden/SrcRegActList.hs +19/−1
- Hidden/TestMain.hs +10/−0
- Hidden/Tools.hs +23/−7
- regexpr.cabal +1/−2
Hidden/ParseRegexStr.hs view
@@ -10,15 +10,17 @@ import Hidden.RegexPRTypes ( RegexSrcParser, RegexAction(..), reverseRegexAction,- getBR, modifyBR, isModeI, setModeI,+ getBR, modifyBR,+ isModeI, isModeM, isModeX, setMode, runRegexSrcParser ) import Hidden.ParseLib( runParse, spot, token, mplus, mzero, tokens, list, greedyList, optional, endOfInput ) import Control.Monad.State( liftM )-import Hidden.Tools ( isSymbol )-import Data.Char ( isAlphaNum, isAlpha, isDigit, toUpper, toLower )+import Hidden.Tools ( isSymbol, (|||) )+import Data.Char ( isAlphaNum, isAlpha, isDigit, isSpace,+ toUpper, toLower ) import Hidden.SrcRegActList- ( plusesList, oneCharList, backSlashesList, parensesList )+ ( plusesList, oneCharList, backSlashesList, parensesList, charClassList ) parseRegexStr :: String -> [RegexAction] parseRegexStr@@ -68,17 +70,28 @@ `mplus` do { token '['; isNotNot <- optional (token '^') >>= return . null; cl <- parseCharList; token ']';- return $ Select $ flip (if isNotNot then elem else notElem) cl }+ return $ Select $ (if isNotNot then id else (not.)) cl } `mplus` do { i <- getBR; token '('; modifyBR (+1); ras <- parseTokensOr; token ')'; return $ Note i ras } `mplus`- do { tokens "(?"; token 'i'; token ')'; setModeI True; return NopRegex }+ do { tokens "(?"; list parseMode >>= mapM_ (uncurry setMode); token ')';+ return NopRegex } `mplus`- do { tokens "(?"; token 'i'; token ':';- setModeI True; ras <- parseTokensOr; setModeI False;- token ')'; return $ Parens ras }+ do { tokens "(?";+ modes <- list parseMode;+ mapM_ (uncurry setMode) modes;+ token ':';+ ras <- parseTokensOr;+ mapM_ (\(m,b) -> setMode m $ not b) modes;+ token ')';+ return $ Parens ras } `mplus`+ do { m <- isModeM;+ if m then token '.' >> return (Select $ const True) else mzero }+ `mplus`+ do { x <- isModeX; if x then parseTokenX else mzero }+ `mplus` parseOneChar oneCharList `mplus` parseBackSlashes backSlashesList@@ -93,6 +106,16 @@ $ [toUpper c, toLower c] } else do { c <- spot isAlpha; return $ Select (==c) } +parseMode :: RegexSrcParser (Char, Bool)+parseMode = do b <- optional (token '-') >>= return . null+ spot (flip elem "imx") >>= return . flip (,) b++parseTokenX :: RegexSrcParser RegexAction+parseTokenX = do { spot isSpace; return NopRegex }+ `mplus`+ do { token '#'; c <- list $ spot (/='\n'); token '\n';+ return $ Comment c }+ parsePluses :: [ (String, RegexAction -> RegexAction) ] -> RegexSrcParser (RegexAction -> RegexAction)@@ -114,10 +137,14 @@ token ')' return $ act ras) -parseCharList :: RegexSrcParser String-parseCharList =- liftM concat $ greedyList- ((parseChar >>= return . (:[])) `mplus` parseCharArea)- where parseChar = spot isAlphaNum `mplus` ( token '\\' >> spot isSymbol )- parseCharArea = do { b <- parseChar; token '-'; e <- parseChar;- return [b..e] }+parseCharList :: RegexSrcParser (Char -> Bool)+parseCharList = do+ cl <- greedyList (parseChar `mplus` parseCharArea `mplus` parseCharClass)+ return $ \c -> or $ zipWith ($) cl (repeat c)+ where parseChar = (spot isAlphaNum `mplus` (token '\\' >> spot isSymbol))+ >>= return . (==)+ parseCharArea = do { b <- spot isAlphaNum; token '-'; e <- spot isAlphaNum;+ return $ flip elem [b..e] }+ parseCharClass = foldr mplus mzero $+ map (\(s, p) -> tokens ("[:"++s++":]") >> return p) charClassList+ -- tokens "[:alnum:]" >> return isAlphaNum
Hidden/RegexPRTypes.hs view
@@ -9,7 +9,9 @@ , getBR , modifyBR , isModeI-, setModeI+, isModeM+, isModeX+, setMode , runRegexSrcParser , RegexAction(..) @@ -22,7 +24,9 @@ import Hidden.ParseLib( Parse, runParse ) import Control.Monad.State( StateT, runStateT, gets, modify ) import Control.Monad.Reader( ReaderT(runReaderT) )-import Hidden.Tools( modifySnd, modifyFst, first, modifyFirst )+import Hidden.Tools( modifySnd, modifyFst,+ first, second, third,+ modifyFirst, modifySecond, modifyThird ) type RegexResult = ( String, (String, String) ) type MatchList = [ (Int, String) ]@@ -37,10 +41,14 @@ getBR = gets fst modifyBR :: (Int -> Int) -> RegexSrcParser () modifyBR = modify . modifyFst-setModeI :: Bool -> RegexSrcParser ()-setModeI = modify . modifySnd . modifyFirst . const-isModeI :: RegexSrcParser Bool-isModeI = gets $ first . snd+setMode :: Char -> Bool -> RegexSrcParser ()+setMode 'i' = modify . modifySnd . modifyFirst . const+setMode 'm' = modify . modifySnd . modifySecond . const+setMode 'x' = modify . modifySnd . modifyThird . const+isModeI, isModeM, isModeX :: RegexSrcParser Bool+isModeI = gets $ first . snd+isModeM = gets $ second . snd+isModeX = gets $ third . snd runRegexSrcParser :: RegexSrcParser a -> Parse Char (a, (Int,(Bool,Bool,Bool))) runRegexSrcParser = flip runStateT (1, (False, False, False))
Hidden/SrcRegActList.hs view
@@ -8,10 +8,13 @@ , oneCharList , backSlashesList , parensesList+, charClassList ) where import Hidden.RegexPRTypes( RegexAction(..), reverseRegexAction )-import Data.Char( isAlphaNum, isDigit )+import Hidden.Tools( (&&&), isSymbol )+import Data.Char( isAlphaNum, isAlpha, isUpper, isLower,+ isDigit, isHexDigit, isSpace, isPrint, isControl ) plusesList :: [ (String, RegexAction -> RegexAction) ] plusesList = [@@ -65,6 +68,21 @@ , ( "?=", Still ) , ( "?!", Still . (:[]) . RegActNot ) , ( "?:", Parens )+ ]++charClassList :: [ (String, Char -> Bool) ]+charClassList = [+ ( "alnum", isAlphaNum )+ , ( "alpha", isAlpha )+ , ( "cntrl", isControl )+ , ( "digit", isDigit )+ , ( "graph", isPrint &&& (not.) isSpace )+ , ( "lower", isLower )+ , ( "print", isPrint )+ , ( "punct", isSymbol )+ , ( "space", isSpace )+ , ( "upper", isUpper )+ , ( "xdigit", isHexDigit ) ] regexOr :: [[RegexAction]] -> RegexAction
Hidden/TestMain.hs view
@@ -140,4 +140,14 @@ , Just ( ("abCde", ("d", "fg")), [] ) ~=? matchRegexPR "ab(?i)cDe" "dabCdefg" , Just ( ("aBcdE", ("", "")), [] ) ~=? matchRegexPR "a(?i:bC)dE" "aBcdE" , Nothing ~=? matchRegexPR "a(?i:bC)dE" "aBcde"+ , Just ( ("abcDe", ("", "")), [] ) ~=?+ matchRegexPR "a(?i)bC(?-i)De" "abcDe"+ , Nothing ~=?+ matchRegexPR "a(?i)bC(?-i)De" "abcdE"+ , Just ( ("abc\nde", ("", "")), [] ) ~=? matchRegexPR "(?m).+" "abc\nde"+ , Just ( ("Abc", ("", "\nde")), [] ) ~=? matchRegexPR "(?im-m)a.+" "Abc\nde"+ , Just ( ("bcd", ("a", "e")), [] ) ~=?+ matchRegexPR "(?x)# hello\n# goodbye\n\t\tbcd\n\n" "abcde"+ , Just ( ("bcd", ("a", "e")), [] ) ~=? matchRegexPR "b[[:alnum:]]d" "abcde"+ , Just ( ("90af", ("", "g")), [] ) ~=? matchRegexPR "[[:xdigit:]]+" "90afg" ]
Hidden/Tools.hs view
@@ -8,8 +8,14 @@ , modifyFst , modifySnd , first+, second+, third , modifyFirst+, modifySecond+, modifyThird , guardEqual+, (|||)+, (&&&) ) where import Control.Monad.State( StateT(StateT, runStateT), lift, MonadTrans )@@ -19,9 +25,6 @@ isSymbol :: Char -> Bool isSymbol = (not . isAlphaNum) &&& (not . isSpace) &&& isPrint -(&&&) :: (a -> Bool) -> (a -> Bool) -> a -> Bool-(p1 &&& p2) x = p1 x && p2 x- modifyFst :: (a -> c) -> (a, b) -> (c, b) modifyFst f (x, y) = (f x, y) modifySnd :: (b -> c) -> (a, b) -> (a, c)@@ -30,8 +33,21 @@ guardEqual :: (MonadPlus m, Eq a) => m a -> m a -> m () guardEqual m1 m2 = do { x <- m1; y <- m2; guard (x == y) } -first :: (a,b,c) -> a-first (x,_,_) = x+first :: (a, b, c) -> a+first (x, _, _) = x+second :: (a, b, c) -> b+second (_, y, _) = y+third :: (a, b, c) -> c+third (_, _, z) = z -modifyFirst :: (a -> d) -> (a, b, c) -> (d, b, c)-modifyFirst f (x, y, z) = (f x, y, z)+modifyFirst :: (a -> d) -> (a, b, c) -> (d, b, c)+modifyFirst f (x, y, z) = (f x, y, z)+modifySecond :: (b -> d) -> (a, b, c) -> (a, d, c)+modifySecond f (x, y, z) = (x, f y, z)+modifyThird :: (c -> d) -> (a, b, c) -> (a, b, d)+modifyThird f (x, y, z) = (x, y, f z)++(|||),(&&&) :: (a -> Bool) -> (a -> Bool) -> a -> Bool+(p1 ||| p2) x = p1 x || p2 x+(p1 &&& p2) x = p1 x && p2 x+
regexpr.cabal view
@@ -1,5 +1,5 @@ Name: regexpr-Version: 0.1.5+Version: 0.1.6 License: GPL License-File: LICENSE Author: Yoshikuni Jujo <PAF01143@nifty.ne.jp>@@ -18,7 +18,6 @@ Regular expression library like Perl/Ruby's regular expression. This package has a module RegexPR. And RegexPR export function matchRegexPR and gsubRegexPR.- | some matchRegexPR :: String -> Maybe ((String, (String, String)), [(Int, String)]), gsubRegexPR :: String -> String -> String. Examples: matchRegexPR "ab(cde)f\\1" "kkkabcdefcdefgh" =>