git.iko.soy/typeable/attoparsec
on master help sign in
Switch from backtracking by default to *not* backtracking.
d8469fbBryan O'Sullivan
Data/Attoparsec/Internal.hs+17−3
@@ -69,6 +69,7 @@ import Control.Monad (when)
69import Data.Attoparsec.Combinator
69import Data.Attoparsec.Combinator
70import Data.Attoparsec.FastSet (charClass, memberWord8)
70import Data.Attoparsec.FastSet (charClass, memberWord8)
71import Data.Attoparsec.Internal.Types
71import Data.Attoparsec.Internal.Types
72+import Data.Monoid (Monoid(..))
72import Data.Word (Word8)
73import Data.Word (Word8)
73import Foreign.ForeignPtr (withForeignPtr)
74import Foreign.ForeignPtr (withForeignPtr)
74import Foreign.Ptr (castPtr, minusPtr, plusPtr)
75import Foreign.Ptr (castPtr, minusPtr, plusPtr)
@@ -98,7 +99,7 @@ prompt :: Input -> Added -> More
98prompt i0 a0 _m0 kf ks = Partial $ \s ->
99prompt i0 a0 _m0 kf ks = Partial $ \s ->
99 if B.null s
100 if B.null s
100 then kf i0 a0 Complete
101 then kf i0 a0 Complete
101− else ks (I (unI i0 +++ s)) (A (unA a0 +++ s)) Incomplete
102+ else ks (i0 `mappend` I s) (a0 `mappend` Added s) Incomplete
102
103
103-- | Immediately demand more input via a 'Partial' continuation
104-- | Immediately demand more input via a 'Partial' continuation
104-- result.
105-- result.
@@ -140,6 +141,19 @@ try p = Parser $ \i0 a0 m0 kf ks ->
140 noAdds i0 a0 m0 $ \i1 a1 m1 ->
141 noAdds i0 a0 m0 $ \i1 a1 m1 ->
141 let kf' i2 a2 m2 = addS i0 a0 m0 i2 a2 m2 kf
142 let kf' i2 a2 m2 = addS i0 a0 m0 i2 a2 m2 kf
142 in runParser p i1 a1 m1 kf' ks
143 in runParser p i1 a1 m1 kf' ks
144+ where noAdds i0 _a0 m0 f = f i0 mempty m0
145+
146+addS :: Input -> Added -> More
147+ -> Input -> Added -> More
148+ -> (Input -> Added -> More -> r) -> r
149+addS i0 a0 m0 _i1 a1 m1 f =
150+ let !i = case a1 of
151+ Dropped -> i0
152+ Added s -> i0 `mappend` I s
153+ !a = a0 `mappend` a1
154+ !m = m0 `mappend` m1
155+ in f i a m
156+{-# INLINE addS #-}
143
157
144-- | The parser @satisfy p@ succeeds for any byte for which the
158-- | The parser @satisfy p@ succeeds for any byte for which the
145-- predicate @p@ returns 'True'. Returns the byte that is actually
159-- predicate @p@ returns 'True'. Returns the byte that is actually
@@ -441,12 +455,12 @@ successK i0 _a0 _m0 a = Done (unI i0) a
441
455
442-- | Run a parser.
456-- | Run a parser.
443parse :: Parser a -> B.ByteString -> Result a
457parse :: Parser a -> B.ByteString -> Result a
444−parse m s = runParser m (I s) (A B.empty) Incomplete failK successK
458+parse m s = runParser m (I s) mempty Incomplete failK successK
445{-# INLINE parse #-}
459{-# INLINE parse #-}
446
460
447-- | Run a parser that cannot be resupplied via a 'Partial' result.
461-- | Run a parser that cannot be resupplied via a 'Partial' result.
448parseOnly :: Parser a -> B.ByteString -> Either String a
462parseOnly :: Parser a -> B.ByteString -> Either String a
449−parseOnly m s = case runParser m (I s) (A B.empty) Complete failK successK of
463+parseOnly m s = case runParser m (I s) mempty Complete failK successK of
450 Fail _ _ err -> Left err
464 Fail _ _ err -> Left err
451 Done _ a -> Right a
465 Done _ a -> Right a
452 _ -> error "parseOnly: impossible error!"
466 _ -> error "parseOnly: impossible error!"
Data/Attoparsec/Internal/Types.hs+22−24
@@ -20,8 +20,6 @@ module Data.Attoparsec.Internal.Types
20 , Input(..)
20 , Input(..)
21 , Added(..)
21 , Added(..)
22 , More(..)
22 , More(..)
23− , addS
24− , noAdds
25 , (+++)
23 , (+++)
26 ) where
24 ) where
27
25
@@ -70,7 +68,21 @@ instance Functor Result where
70 {-# INLINE fmap #-}
68 {-# INLINE fmap #-}
71
69
72newtype Input = I {unI :: B.ByteString}
70newtype Input = I {unI :: B.ByteString}
71+ deriving (Show)
72+
73+instance Monoid Input where
74+ mempty = I B.empty
75+ mappend (I a) (I b) = I (a +++ b)
76+
77+data Added = Dropped
73−newtype Added = A {unA :: B.ByteString}
78+ | Added B.ByteString
79+ deriving (Show)
80+
81+instance Monoid Added where
82+ mempty = Dropped
83+ mappend a@Dropped _ = a
84+ mappend a Dropped = a
85+ mappend (Added a) (Added b) = Added (a +++ b)
74
86
75-- | The 'Parser' type is a monad.
87-- | The 'Parser' type is a monad.
76newtype Parser a = Parser {
88newtype Parser a = Parser {
@@ -87,19 +99,11 @@ type Success a r = Input -> Added -> More -> a -> Result r
87data More = Complete | Incomplete
99data More = Complete | Incomplete
88 deriving (Eq, Show)
100 deriving (Eq, Show)
89
101
90−addS :: Input -> Added -> More
102+instance Monoid More where
91− -> Input -> Added -> More
103+ mempty = Incomplete
92− -> (Input -> Added -> More -> r) -> r
104+ mappend Complete _ = Complete
93−addS i0 a0 m0 _i1 a1 m1 f =
94− let !i = I (unI i0 +++ unA a1)
95− a = A (unA a0 +++ unA a1)
96− !m = m0 <> m1
97− in f i a m
98− where
99− Complete <> _ = Complete
100− _ <> Complete = Complete
105+ mappend _ Complete = Complete
101− _ <> _ = Incomplete
106+ mappend _ _ = Incomplete
102−{-# INLINE addS #-}
103
107
104bindP :: Parser a -> (a -> Parser b) -> Parser b
108bindP :: Parser a -> (a -> Parser b) -> Parser b
105bindP m g =
109bindP m g =
@@ -116,16 +120,10 @@ instance Monad Parser where
116 (>>=) = bindP
120 (>>=) = bindP
117 fail = failDesc
121 fail = failDesc
118
122
119−noAdds :: Input -> Added -> More
120− -> (Input -> Added -> More -> r) -> r
121−noAdds i0 _a0 m0 f = f i0 (A B.empty) m0
122−{-# INLINE noAdds #-}
123−
124plus :: Parser a -> Parser a -> Parser a
123plus :: Parser a -> Parser a -> Parser a
125plus a b = Parser $ \i0 a0 m0 kf ks ->
124plus a b = Parser $ \i0 a0 m0 kf ks ->
126− let kf' i1 a1 m1 _ _ = addS i0 a0 m0 i1 a1 m1 $
127− \ i2 a2 m2 -> runParser b i2 a2 m2 kf ks
125+ let kf' i1 a1 m1 _ _ = runParser b i1 a1 m1 kf ks
128− in noAdds i0 a0 m0 $ \i2 a2 m2 -> runParser a i2 a2 m2 kf' ks
126+ in runParser a i0 a0 m0 kf' ks
129{-# INLINE plus #-}
127{-# INLINE plus #-}
130
128
131instance MonadPlus Parser where
129instance MonadPlus Parser where
attoparsec.cabal+1−1
@@ -1,5 +1,5 @@
1name: attoparsec
1name: attoparsec
2−version: 0.8.6.1
2+version: 0.9.0.0
3license: BSD3
3license: BSD3
4license-file: LICENSE
4license-file: LICENSE
5category: Text, Parsing
5category: Text, Parsing