regexpr 0.2.3 → 0.2.5
raw patch · 10 files changed
+88/−21 lines, 10 files
Files
- BUGS.ja.utf-8 +4/−0
- Hidden/ParseLibCore.hs +11/−6
- Hidden/ParseRegexStr.hs +3/−1
- Hidden/RegexPRCore.hs +6/−5
- Hidden/RegexPRTypes.hs +2/−1
- Hidden/SrcRegActList.hs +12/−4
- Hidden/TestMain.hs +12/−1
- TODO.ja.utf-8 +15/−0
- Text/RegexPR.hs +18/−1
- regexpr.cabal +5/−2
+ BUGS.ja.utf-8 view
@@ -0,0 +1,4 @@+2008.1.20 Sun.+(?i)と[...]の組み合わせがうまくない。+[...]に関してはどうもうまくない感じがする。+あとで根本的な解決が必要だ。
Hidden/ParseLibCore.hs view
@@ -9,7 +9,7 @@ module Hidden.ParseLibCore ( Parse , runParse-, MonadParse(spot, spotBack, still, parseNot, askHere)+, MonadParse(spot, spotBack, still, parseNot, askHere, noBacktrack) , MonadPlus(mzero, mplus) , MonadReader(ask, local) ) where@@ -25,11 +25,12 @@ import Data.Monoid ( Monoid(mempty) ) class Monad m => MonadParse a m | m -> a where- spot :: (a -> Bool) -> m a- spotBack :: (a -> Bool) -> m a- still :: m b -> m b- parseNot :: b -> m b -> m b- askHere :: m ([a],[a])+ spot :: (a -> Bool) -> m a+ spotBack :: (a -> Bool) -> m a+ still :: m b -> m b+ parseNot :: b -> m b -> m b+ askHere :: m ([a],[a])+ noBacktrack :: m b -> m b instance (MonadParse a m) => MonadParse a (ReaderT s m) where spot = lift . spot@@ -37,6 +38,7 @@ still = mapReaderT still parseNot x p = ReaderT $ \r -> parseNot x (runReaderT p r) askHere = lift askHere+ noBacktrack = mapReaderT noBacktrack instance (MonadParse a m, Monoid w) => MonadParse a (WriterT w m) where spot = lift . spot@@ -44,6 +46,7 @@ still = mapWriterT still parseNot x p = WriterT $ parseNot (x, mempty) (runWriterT p) askHere = lift askHere+ noBacktrack = mapWriterT noBacktrack instance (MonadParse a m) => MonadParse a (StateT r m) where spot = lift . spot@@ -51,6 +54,7 @@ still = mapStateT still parseNot x p = StateT $ \s -> parseNot (x,s) (runStateT p s) askHere = lift askHere+ noBacktrack = mapStateT noBacktrack newtype Parse a b = Parse { runParse :: ([a],[a]) -> [(b,([a],[a]))] } @@ -77,6 +81,7 @@ [] -> [(x,inp)] _ -> [] askHere = ask+ noBacktrack p = Parse $ (:[]) . head . runParse p instance Monad (Parse a) where return = Parse . \val inp -> [(val,inp)]
Hidden/ParseRegexStr.hs view
@@ -20,7 +20,7 @@ toUpper, toLower ) import Data.Ix ( inRange ) import Hidden.SrcRegActList( plusesList, oneCharList, backSlashesList,- parensesList, charClassList )+ parensesList, charClassList, selfList ) parseRegexStr :: String -> [RegexAction] parseRegexStr =@@ -86,6 +86,8 @@ do { x <- isModeX; if x then parseTokenX else mzero } `mplus` parseOneChar oneCharList+ `mplus`+ ( foldr mplus mzero $ map ((>>= return . Select . (==)) . token) selfList ) `mplus` parseBackSlashes backSlashesList `mplus`
Hidden/RegexPRCore.hs view
@@ -8,11 +8,11 @@ ) where import Hidden.RegexPRTypes ( RegexParser, MatchList, runRegexParser )-import Hidden.ParseLib ( spot, spotBack, still, parseNot,- build, tokens, tokensBack,- repeatParse, greedyRepeatParse,- beginningOfInput, endOfInput,- MonadPlus(..), (>++>) )+import Hidden.ParseLib ( spot, spotBack, still, noBacktrack, parseNot,+ build, tokens, tokensBack,+ repeatParse, greedyRepeatParse,+ beginningOfInput, endOfInput,+ MonadPlus(..), (>++>) ) import Hidden.ParseRegexStr ( RegexAction(..), parseRegexStr ) import Control.Monad.State ( StateT, runStateT, gets, modify, lift, liftM ) import Control.Monad.Reader( ask )@@ -65,6 +65,7 @@ Parens acts -> mkRegexParser isBack acts Comment _ -> return "" NopRegex -> return ""+ NoBacktrack acts -> noBacktrack $ mkRegexParser isBack acts >++> mkRegexParser isBack ras where selectParserFB = if isBack then selectParserBack else selectParser
Hidden/RegexPRTypes.hs view
@@ -66,7 +66,8 @@ RegActNot [RegexAction] | BeginningOfInput | EndOfInput | PreMatchPoint | Parens [RegexAction] |- Comment String | NopRegex+ Comment String | NopRegex |+ NoBacktrack [RegexAction] reverseRegexAction :: RegexAction -> RegexAction reverseRegexAction (Note i ras)
Hidden/SrcRegActList.hs view
@@ -9,6 +9,7 @@ , backSlashesList , parensesList , charClassList+, selfList ) where import Hidden.RegexPRTypes( RegexAction(..), reverseRegexAction )@@ -27,15 +28,18 @@ , ( "??", RepeatNotGreedy 0 $ Just 1 ) ] +selfList :: [ Char ]+selfList = ", <>-!:#@\n"+ oneCharList :: [ (Char, RegexAction) ] oneCharList = [ ('.', Select (/='\n')) , ('$', RegexOr [EndOfInput] [Still [Select (=='\n')]]) , ('^', RegexOr [BeginningOfInput] [Still [Backword [Select (=='\n')]]])- , (',', Select (==','))- , (' ', Select (==' '))- , ('<', Select (=='<'))- , ('>', Select (=='>'))+-- , (',', Select (==','))+-- , (' ', Select (==' '))+-- , ('<', Select (=='<'))+-- , ('>', Select (=='>')) ] backSlashesList :: [ (Char, RegexAction) ]@@ -67,9 +71,13 @@ parensesList :: [ (String, [RegexAction] -> RegexAction) ] parensesList = [ ( "?<=", Still . (:[]) . Backword . reverse . map reverseRegexAction )+ , ( "?<!", Still . (:[]) . RegActNot . (:[]) . Backword . reverse+ . map reverseRegexAction) , ( "?=", Still ) , ( "?!", Still . (:[]) . RegActNot ) , ( "?:", Parens )+ , ( "?>", NoBacktrack )+ , ( "$>", NoBacktrack ) ] charClassList :: [ (String, Char -> Bool) ]
Hidden/TestMain.hs view
@@ -159,5 +159,16 @@ , Just ( ("\227\129\130", ("", "")), [] ) ~=? matchRegexPR "\227\129\130" "\227\129\130"- , "abc!abc!abc!bc" ~=? gsubRegexPR "(?ixm) aBc . # comment " "abc!" "abc\nABCDAbcAbc"+ , "abc!abc!abc!bc" ~=?+ gsubRegexPR "(?ixm) aBc . # comment " "abc!" "abc\nABCDAbcAbc"+ , Just ( ("FGH-12345", ("abcDE", "67")), [] )+ ~=?+ matchRegexPR "[A-Z]{3}-\\d{5}" "abcDEFGH-1234567"+-- , Just ( ("ABc", ("", " de")), [] ) ~=? matchRegexPR "(?i)[A-Z]+" "ABcde"+-- , Just ( ("?", ("", "!abc")), [] ) ~=? matchRegexPR "[\\--z]*" "?!abc"+-- , Just ( ("?!abc-A", ("", " b")), [] ) ~=? matchRegexPR "[!-z]*" "?!abc-A b"+ , Just ( ("!!:!", ("!", "!!")), [] ) ~=?+ matchRegexPR "(?<=!)!{1,3}:!(?=!)" "!!!:!!!"+ , Nothing ~=? matchRegexPR "(?>a*)ab" "aaab"+ , Just ( ("\n\n", ("abc", "def")), [] )~=? matchRegexPR "\n\n" "abc\n\ndef" ]
TODO.ja.utf-8 view
@@ -17,3 +17,18 @@ \08とかについて (?> ) 日本語(UTF-8)対応。++2008.1.20 Sun.+正規表現のparseに失敗したときのerror messageの改善。+subで使える表現の追加。++(?> )は実装。++TODO LIST+ (?<! ... )+ 日本語対応+ \w\W\s\S\d\D in char class([ .. ])+ subで使える表現の追加。+ 正規表現のparseに失敗したときのerror messageの改善。+ ParseLibを公開できるくらいに洗練する。+ homepageの作成。
Text/RegexPR.hs view
@@ -5,6 +5,7 @@ module Text.RegexPR ( matchRegexPR+, gmatchRegexPR -- EXPERIMENTAL , gsubRegexPR , subRegexPR ) where@@ -18,11 +19,27 @@ = fmap ( \( (pre, ret, (_, rest)), ml ) -> ( (ret, (pre, rest)), ml ) ) $ matchRegexPRVerbose reg ("", str) +gmatchRegexPR :: String -> String -> [ ( RegexResult, MatchList ) ]+gmatchRegexPR reg str = gmatchRegexPRGen Nothing reg ("", str)++gmatchRegexPRGen ::+ Maybe (String, String) -> String -> (String, String) -> [ ( RegexResult, MatchList ) ]+gmatchRegexPRGen pmp reg str+ = case matchRegexPRVerbose reg str of+ Just ((pre, ret, sp@(p,rest@(~(x:xs)))), ml)+ -> case (pmp, sp) of+ (Just (_, ""), _) -> [ ( (ret, (pre, rest)), ml ) ]+ _ | Just sp == pmp -> ( (ret, (pre, rest)), ml ) :+ gmatchRegexPRGen pmp reg (x:p, xs)+ | otherwise -> ( (ret, (pre, rest)), ml ) :+ gmatchRegexPRGen (Just sp) reg sp+ Nothing -> []+ subRegexPR :: String -> String -> String -> String subRegexPR reg sub src = case matchRegexPRVerbose reg ("",src) of Just al@((pre, _, sp), _) -> pre ++ subBackRef al sub ++ snd sp- Nothing -> src+ Nothing -> src gsubRegexPR :: String -> String -> String -> String gsubRegexPR reg sub src = gsubRegexPRGen Nothing reg sub ("", src)
regexpr.cabal view
@@ -1,5 +1,5 @@ Name: regexpr-Version: 0.2.3+Version: 0.2.5 License: GPL License-File: LICENSE Author: Yoshikuni Jujo <PAF01143@nifty.ne.jp>@@ -28,6 +28,9 @@ . gsubRegexPR "(?ixm) aBc . # comment \n\n" "abc!" "abc\nABCDAbcAbc" => "abc!abc!abc!bc"+ .+ gmatchRegexPR "(?=(?<!(?!abc)))abc" "abcdefdefabc" =>+ [(("abc", ("", "defdefabc")), []), (("abc", ("defdef", "")), [])] Category: Text Build-Depends: base, mtl, HUnit Build-Type: Simple@@ -36,5 +39,5 @@ Hidden.ParseLibCore, Hidden.RegexPRCore, Hidden.ParseRegexStr, Hidden.SrcRegActList, Hidden.TestMain-Extra-source-files: TODO.ja.utf-8, localConfigure+Extra-source-files: TODO.ja.utf-8, localConfigure, BUGS.ja.utf-8 ghc-options: -Wall -O2 -optl-Wl,-s