packages feed

LParse 0.2.2.2 → 0.2.3.0

raw patch · 5 files changed

+27/−6 lines, 5 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Text.LParse.TokenStream: instance Text.LParse.TokenStream.TokenStream GHC.Base.Maybe
+ Text.LParse.Atomics: sInteger :: Parser r String Integer
+ Text.LParse.TokenStream: instance Text.LParse.TokenStream.TokenStream GHC.Maybe.Maybe
+ Text.LParse.Transformers: nParse :: (TokenStream s, Eq (s t)) => (t -> Bool) -> Parser r (s t) a -> String -> Parser r (s t) a
+ Text.LParse.Transformers: try :: TokenStream s => Parser r (s t) a -> Parser r (s t) (Maybe a)
- Control.DoubleContinuations: invoke :: DCont (Either e a) e a -> (Either e a)
+ Control.DoubleContinuations: invoke :: DCont (Either e a) e a -> Either e a
- Text.LParse.Atomics: consume :: (Eq t, Show (s t), TokenStream s) => (s t) -> Parser r (s t) ()
+ Text.LParse.Atomics: consume :: (Eq t, Show (s t), TokenStream s) => s t -> Parser r (s t) ()
- Text.LParse.Atomics: peek :: (TokenStream s) => (t -> Bool) -> String -> Parser r (s t) ()
+ Text.LParse.Atomics: peek :: TokenStream s => (t -> Bool) -> String -> Parser r (s t) ()
- Text.LParse.Atomics: tokenParse :: (TokenStream s) => (t -> a) -> Parser r (s t) a
+ Text.LParse.Atomics: tokenParse :: TokenStream s => (t -> a) -> Parser r (s t) a
- Text.LParse.Atomics: tokenReturn :: (TokenStream s) => Parser r (s a) a
+ Text.LParse.Atomics: tokenReturn :: TokenStream s => Parser r (s a) a
- Text.LParse.Parser: debugParse :: (Show a) => Parser (IO ()) t a -> t -> IO ()
+ Text.LParse.Parser: debugParse :: Show a => Parser (IO ()) t a -> t -> IO ()
- Text.LParse.TokenStream: sDrop :: (TokenStream s) => Int -> s a -> s a
+ Text.LParse.TokenStream: sDrop :: TokenStream s => Int -> s a -> s a
- Text.LParse.TokenStream: sFilter :: (TokenStream s) => (a -> Bool) -> s a -> s a
+ Text.LParse.TokenStream: sFilter :: TokenStream s => (a -> Bool) -> s a -> s a
- Text.LParse.TokenStream: sZip :: (TokenStream s) => s a -> s b -> s (a, b)
+ Text.LParse.TokenStream: sZip :: TokenStream s => s a -> s b -> s (a, b)
- Text.LParse.TokenStream: sZipWith :: (TokenStream s) => (a -> b -> c) -> s a -> s b -> s c
+ Text.LParse.TokenStream: sZipWith :: TokenStream s => (a -> b -> c) -> s a -> s b -> s c
- Text.LParse.TokenStream: skipN :: (TokenStream s) => Int -> s a -> s a
+ Text.LParse.TokenStream: skipN :: TokenStream s => Int -> s a -> s a
- Text.LParse.Transformers: (<<) :: (Monad m) => m a -> m b -> m a
+ Text.LParse.Transformers: (<<) :: Monad m => m a -> m b -> m a
- Text.LParse.Transformers: replace :: (TokenStream s) => (t -> t) -> Parser r (s t) a -> Parser r (s t) a
+ Text.LParse.Transformers: replace :: TokenStream s => (t -> t) -> Parser r (s t) a -> Parser r (s t) a
- Text.LParse.Transformers: skipBy :: (TokenStream s) => (t -> Bool) -> Parser r (s t) a -> Parser r (s t) a
+ Text.LParse.Transformers: skipBy :: TokenStream s => (t -> Bool) -> Parser r (s t) a -> Parser r (s t) a

Files

CHANGELOG.md view
@@ -6,6 +6,10 @@  * Switching from list-based parsing to `TokenStream` +### 0.2.3++* Added `nParse` (cParse for single token) and `try` (parse with Maybe) Transformers, `sInteger` (signed integers) Atomic+ ### 0.2.2  * Added Either instance for `TokenStream`
LParse.cabal view
@@ -1,5 +1,5 @@ name:                LParse-version:             0.2.2.2+version:             0.2.3.0 synopsis:            A continuation-based parser library description:         A parser library using continuations with a possibility for failure to build parsers in a clear and concise manner. homepage:            https://github.com/MarcusVoelker/LParse#readme@@ -7,7 +7,7 @@ license-file:        LICENSE author:              Marcus Völker maintainer:          marcus.voelker@rwth-aachen.de-copyright:           (c) 2017 Marcus Völker+copyright:           (c) 2017-2018 Marcus Völker category:            Parsing build-type:          Simple extra-source-files:  README.md CHANGELOG.md
src/Text/LParse/Atomics.hs view
@@ -66,6 +66,10 @@ integer :: Parser r String Integer integer = foldl (\x y -> x*10+y) 0 <$> some digit +-- | Extracts the first signed integer (i.e. contiguous string of digits) from the input and returns it+sInteger :: Parser r String Integer+sInteger = (\m i -> case m of (Just _) -> -i; Nothing -> i) <$> try (consumeSingle '-') <*> integer+ -- | Succeeds if the first token matches the given function, without consuming it peek :: (TokenStream s) => (t -> Bool) -> String -> Parser r (s t) () peek c = cParse (c . top) noop
src/Text/LParse/Transformers.hs view
@@ -24,6 +24,10 @@ cParse :: (t -> Bool) -> Parser r t a -> String -> Parser r t a cParse c p err = Parser (\s -> if c s then pFunc p s else throw err) +-- | Takes a condition the next token has to fulfil in order for the parser to succeed+nParse :: (TokenStream s, Eq (s t)) => (t -> Bool) -> Parser r (s t) a -> String -> Parser r (s t) a+nParse c p err = cParse (\s -> not (nil == s) && c (top s)) p err+ -- | Transforms the input before applying the parser pParse :: (t -> t) -> Parser r t a -> Parser r t a pParse f p = Parser (pFunc p . f)@@ -52,3 +56,7 @@ -- | Replaces the first token by applying the given function replace :: (TokenStream s) => (t -> t) -> Parser r (s t) a -> Parser r (s t) a replace f p = Parser (pFunc p . (\x -> f (top x) `cons` rest x))++-- | Tries to run the given parser, giving back Just result or Nothing+try :: (TokenStream s) => Parser r (s t) a -> Parser r (s t) (Maybe a)+try p = (Just <$> p) <|> return Nothing
test/Test.hs view
@@ -33,7 +33,9 @@     (letter >> eoi, "b"),     (digit >> eoi, "4"),     (word >> eoi, "banana"),-    (nesting >> eoi, "({()}[])")+    (nesting >> eoi, "({()}[])"),+    (try word >> integer >> eoi, "123"),+    (try word >> integer >> eoi, "super123")     ]  failCases :: [(Parser r String (),String)]@@ -44,7 +46,8 @@     (letter >> eoi, "banana"),     (digit >> eoi, "42"),     (word >> eoi, "banana bread"),-    (nesting >> eoi, "({(})[])")+    (nesting >> eoi, "({(})[])"),+    (void $ nParse (=='1') integer "Expected '1'", "234")     ]  stringCases :: [(Parser r String String, String, String)]@@ -59,14 +62,16 @@     (digit,"123 is a nice number",1),     (sum <$> sepMany (consume " ") integer,"1 4 12 61 192",1+4+12+61+192),     (integer >>> (sum <$> bDigits 2), "19", 3),-    (integer >>> (foldr (\x y -> x + y * 2) 0 <$> bDigits 2), "19", 19)+    (integer >>> (foldr (\x y -> x + y * 2) 0 <$> bDigits 2), "19", 19),+    ((\x y -> x*10+y) <$> sInteger <*> ((consumeSingle ' ') >> sInteger), "-123 123", (-123*10) + 123),+    (nParse (=='1') integer "Expected '1'", "123", 123)     ]  runTests :: [(Parser (Either String a) t a,t)] -> [Either String a] runTests = map (uncurry doParse)  eqTest :: (Eq a, Show a) => (Parser (Either String ()) t a, t, a) -> Either String ()-eqTest (p,i,e) = parse p i (\r -> if r == e then Right () else Left ("Expected " ++ show e ++ ", but got " ++ show r)) (const $ Left "Parser error")+eqTest (p,i,e) = parse p i (\r -> if r == e then Right () else Left ("Expected " ++ show e ++ ", but got " ++ show r)) (\e -> Left $ "Parser error: " ++ e)  succTest :: [Either String a] -> IO () succTest res = if all isRight res then return () else putStrLn (head $ lefts res) >> exitFailure