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 +4/−0
- LParse.cabal +2/−2
- src/Text/LParse/Atomics.hs +4/−0
- src/Text/LParse/Transformers.hs +8/−0
- test/Test.hs +9/−4
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