packages feed

regexpr 0.1.5 → 0.1.6

raw patch · 6 files changed

+110/−32 lines, 6 files

Files

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" =>