git.iko.soy/typeable/attoparsec
on master help sign in
Make binary parsing a little easier.
commit0b76b78100b322a5a3b04164d3699774243bc530 authorBryan O'Sullivan <bos@serpentine.com> dateMon 25 Jan 2010, 00:11 (17 years ago) parentece4eec
7 files changed+45−2
Data/Attoparsec.hs+4 Data/Attoparsec/Char8.hs+3−1 Data/Attoparsec/Char8Boilerplate.h+5 Data/Attoparsec/Incremental.hs+5 Data/Attoparsec/Incremental/Char8.hs+3−1 Data/Attoparsec/Internal.hs+5 Data/Attoparsec/Word8Boilerplate.h+20
Data/Attoparsec.hs+4
@@ -34,6 +34,10 @@ module Data.Attoparsec
3434 , word8
3535 , satisfy
3636
37+ -- ** Byte classes
38+ , inClass
39+ , notInClass
40+
3741 -- * Efficient string handling
3842 , string
3943 , skipWhile
Data/Attoparsec/Char8.hs+3−1
@@ -36,6 +36,7 @@ module Data.Attoparsec.Char8
3636 -- * Parsing individual characters
3737 , anyChar
3838 , char
39+ , char8
3940 , digit
4041 , letter
4142 , notChar
@@ -80,9 +81,10 @@ module Data.Attoparsec.Char8
8081 ) where
8182
8283import qualified Data.ByteString.Lazy.Char8 as LB
83−import Data.ByteString.Internal (w2c)
84+import Data.ByteString.Internal (c2w, w2c)
8485import Data.Char (isDigit, isLetter, isSpace, toLower)
8586import Data.Attoparsec.FastSet (charClass, memberChar)
87+import Data.Word (Word8)
8688import qualified Data.Attoparsec.Internal as I
8789import Data.Attoparsec.Combinator
8890import Data.Attoparsec.Internal
Data/Attoparsec/Char8Boilerplate.h+5
@@ -26,6 +26,11 @@ char :: Char -> PARSER Char
2626char c = satisfy (== c) <?> [c]
2727{-# INLINE char #-}
2828
29+-- | Match a specific character.
30+char8 :: Char -> PARSER Word8
31+char8 c = I.satisfy (== c2w c) <?> [c]
32+{-# INLINE char8 #-}
33+
2934-- | Match any character except the given one.
3035notChar :: Char -> PARSER Char
3136notChar c = satisfy (/= c) <?> "not " ++ [c]
Data/Attoparsec/Incremental.hs+5
@@ -41,6 +41,10 @@ module Data.Attoparsec.Incremental
4141 , anyWord8
4242 , satisfy
4343
44+ -- ** Byte classes
45+ , inClass
46+ , notInClass
47+
4448 -- * Efficient string handling
4549 , string
4650 , skipWhile
@@ -59,6 +63,7 @@ module Data.Attoparsec.Incremental
5963
6064import Data.Attoparsec.Combinator
6165import Control.Monad (MonadPlus(..), ap)
66+import Data.Attoparsec.FastSet (charClass, memberWord8)
6267import Data.Attoparsec.Internal ((+:))
6368import Data.Word (Word8)
6469import qualified Data.ByteString as S
Data/Attoparsec/Incremental/Char8.hs+3−1
@@ -42,6 +42,7 @@ module Data.Attoparsec.Incremental.Char8
4242 , anyChar
4343 , space
4444 , char
45+ , char8
4546 , notChar
4647
4748 -- ** Character classes
@@ -74,8 +75,9 @@ module Data.Attoparsec.Incremental.Char8
7475 ) where
7576
7677import qualified Data.ByteString.Lazy.Char8 as LB
77−import Data.ByteString.Internal (w2c)
78+import Data.ByteString.Internal (c2w, w2c)
7879import Data.Char (isDigit, isLetter, isSpace)
80+import Data.Word (Word8)
7981import Data.Attoparsec.FastSet (charClass, memberChar)
8082import qualified Data.Attoparsec.Incremental as I
8183import Data.Attoparsec.Incremental
Data/Attoparsec/Internal.hs+5
@@ -34,6 +34,10 @@ module Data.Attoparsec.Internal
3434 , word8
3535 , notWord8
3636
37+ -- ** Byte classes
38+ , inClass
39+ , notInClass
40+
3741 -- * Efficient string handling
3842 , match
3943 , notEmpty
@@ -62,6 +66,7 @@ import Control.Applicative
6266 (Alternative(..), Applicative(..), (*>))
6367import Control.Monad (MonadPlus(..), ap)
6468import Control.Monad.Fix (MonadFix(..))
69+import Data.Attoparsec.FastSet (charClass, memberWord8)
6570import qualified Data.ByteString as SB
6671import qualified Data.ByteString.Lazy as LB
6772import qualified Data.ByteString.Lazy.Char8 as L8
Data/Attoparsec/Word8Boilerplate.h+20
@@ -13,6 +13,26 @@ instance Alternative (PARSER) where
1313 empty = zero
1414 (<|>) = plus
1515
16+-- | Match any character in a set.
17+--
18+-- > vowel = inClass "aeiou"
19+--
20+-- Range notation is supported.
21+--
22+-- > halfAlphabet = inClass "a-nA-N"
23+--
24+-- To add a literal \'-\' to a set, place it at the beginning or end
25+-- of the string.
26+inClass :: String -> Word8 -> Bool
27+inClass s = (`memberWord8` mySet)
28+ where mySet = charClass s
29+{-# INLINE inClass #-}
30+
31+-- | Match any character not in a set.
32+notInClass :: String -> Word8 -> Bool
33+notInClass s = not . inClass s
34+{-# INLINE notInClass #-}
35+
1636-- | Skip over bytes while the predicate is true.
1737skipWhile :: (Word8 -> Bool) -> PARSER ()
1838skipWhile p = takeWhile p *> pure ()