parsec1 1.0.0.3 → 1.0.0.4
raw patch · 2 files changed
+53/−60 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- Text/ParserCombinators/Parsec/Prim.hs +51/−59
- parsec1.cabal +2/−1
Text/ParserCombinators/Parsec/Prim.hs view
@@ -3,13 +3,13 @@ -- Module : Text.ParserCombinators.Parsec.Prim -- Copyright : (c) Daan Leijen 1999-2001 -- License : BSD-style (see the file libraries/parsec/LICENSE)--- +-- -- Maintainer : Antoine Latter <aslatter@gmail.com> -- Stability : provisional -- Portability : portable -- -- The primitive parser combinators.--- +-- ----------------------------------------------------------------------------- module Text.ParserCombinators.Parsec.Prim@@ -19,7 +19,7 @@ -- basic types , Parser, GenParser , runParser, parse, parseFromFile, parseTest- + -- primitive parsers: -- instance Functor Parser : fmap -- instance Monad Parser : return, >>=, fail@@ -29,14 +29,14 @@ -- primitive because of space behaviour , many, skipMany- + -- user state manipulation , getState, setState, updateState -- state manipulation , getPosition, setPosition- , getInput, setInput - , State(..), getParserState, setParserState + , getInput, setInput+ , State(..), getParserState, setParserState ) where import Prelude@@ -44,14 +44,6 @@ import Text.ParserCombinators.Parsec.Error import Control.Monad -{-# INLINE parsecMap #-}-{-# INLINE parsecReturn #-}-{-# INLINE parsecBind #-}-{-# INLINE parsecZero #-}-{-# INLINE parsecPlus #-}-{-# INLINE token #-}-{-# INLINE tokenPrim #-}- ----------------------------------------------------------- -- Operators: -- <?> gives a name to a parser (which is used in error messages)@@ -137,7 +129,7 @@ setPosition pos = do{ updateParserState (\(State input _ user) -> State input pos user) ; return () }- + -- | @setInput input@ continues parsing with @input@. setInput :: [tok] -> GenParser tok st () setInput input = do{ updateParserState (\(State _ pos user) -> State input pos user)@@ -146,7 +138,7 @@ -- | Returns the full parser state as a 'State' record. getParserState :: GenParser tok st (State tok st)-getParserState = updateParserState id +getParserState = updateParserState id -- | @setParserState st@ set the full parser state to @st@. setParserState :: State tok st -> GenParser tok st (State tok st)@@ -158,7 +150,7 @@ ----------------------------------------------------------- -- Parser definition. -- GenParser tok st a:--- General parser for tokens of type "tok", +-- General parser for tokens of type "tok", -- a user state "st" and a result type "a" ----------------------------------------------------------- type Parser a = GenParser Char () a@@ -168,7 +160,7 @@ data Consumed a = Consumed a --input is consumed | Empty !a --no input is consumed- + data Reply tok st a = Ok !a !(State tok st) ParseError --parsing succeeded with "a" | Error ParseError --parsing failed @@ -229,7 +221,7 @@ Ok x _ _ -> Right x Error err -> Left err -parserReply result +parserReply result = case result of Consumed reply -> reply Empty reply -> reply@@ -243,7 +235,7 @@ parsecMap :: (a -> b) -> GenParser tok st a -> GenParser tok st b parsecMap f (Parser p)- = Parser (\state -> + = Parser (\state -> case (p state) of Consumed reply -> Consumed (mapReply reply) Empty reply -> Empty (mapReply reply)@@ -251,28 +243,28 @@ where mapReply reply = case reply of- Ok x state err -> let fx = f x + Ok x state err -> let fx = f x in seq fx (Ok fx state err) Error err -> Error err- + ----------------------------------------------------------- -- Monad: return, sequence (>>=) and fail------------------------------------------------------------ +----------------------------------------------------------- instance Monad (GenParser tok st) where- return x = parsecReturn x + return x = parsecReturn x p >>= f = parsecBind p f fail msg = parsecFail msg parsecReturn :: a -> GenParser tok st a parsecReturn x- = Parser (\state -> Empty (Ok x state (unknownError state))) + = Parser (\state -> Empty (Ok x state (unknownError state))) parsecBind :: GenParser tok st a -> (a -> GenParser tok st b) -> GenParser tok st b parsecBind (Parser p) f = Parser (\state ->- case (p state) of - Consumed reply1 + case (p state) of+ Consumed reply1 -> Consumed $ case (reply1) of Ok x state1 err1 -> case runP (f x) state1 of@@ -280,13 +272,13 @@ Consumed reply2 -> reply2 Error err1 -> Error err1 - Empty reply1 + Empty reply1 -> case (reply1) of Ok x state1 err1 -> case runP (f x) state1 of Empty reply2 -> Empty (mergeErrorReply err1 reply2)- other -> other + other -> other Error err1 -> Empty (Error err1)- ) + ) mergeErrorReply err1 reply = case reply of@@ -296,7 +288,7 @@ parsecFail :: String -> GenParser tok st a parsecFail msg- = Parser (\state -> + = Parser (\state -> Empty (Error (newErrorMessage (Message msg) (statePos state)))) @@ -306,8 +298,8 @@ instance MonadPlus (GenParser tok st) where mzero = parsecZero mplus p1 p2 = parsecPlus p1 p2- + pzero :: GenParser tok st a pzero = parsecZero @@ -321,7 +313,7 @@ parsecPlus :: GenParser tok st a -> GenParser tok st a -> GenParser tok st a parsecPlus (Parser p1) (Parser p2) = Parser (\state ->- case (p1 state) of + case (p1 state) of Empty (Error err) -> case (p2 state) of Empty reply -> Empty (mergeErrorReply err reply) consumed -> consumed@@ -329,7 +321,7 @@ ) -{- +{- -- variant that favors a consumed reply over an empty one, even it is not the first alternative. empty@(Empty reply) -> case reply of Error err ->@@ -376,7 +368,7 @@ -- > identifier = many1 letter try :: GenParser tok st a -> GenParser tok st a try (Parser p)- = Parser (\state@(State input pos user) -> + = Parser (\state@(State input pos user) -> case (p state) of Consumed (Error err) -> Empty (Error (setErrorPos pos err)) Consumed ok -> Consumed ok -- was: Empty ok@@ -399,7 +391,7 @@ -- > showTok (pos,t) = show t -- > posFromTok (pos,t) = pos -- > testTok (pos,t) = if x == t then Just t else Nothing-token :: (tok -> String) -> (tok -> SourcePos) -> (tok -> Maybe a) -> GenParser tok st a +token :: (tok -> String) -> (tok -> SourcePos) -> (tok -> Maybe a) -> GenParser tok st a token show tokpos test = tokenPrim show nextpos test where@@ -431,47 +423,47 @@ -- error messages using @show@. The position is calculated using @nextpos@, and finally, @mbnextstate@, -- can hold a function that updates the user state on every token recognised (nice to count tokens :-). -- The function is packed into a 'Maybe' type for performance reasons.-tokenPrimEx :: (tok -> String) -> - (SourcePos -> tok -> [tok] -> SourcePos) -> +tokenPrimEx :: (tok -> String) ->+ (SourcePos -> tok -> [tok] -> SourcePos) -> Maybe (SourcePos -> tok -> [tok] -> st -> st) ->- (tok -> Maybe a) -> + (tok -> Maybe a) -> GenParser tok st a tokenPrimEx show nextpos mbNextState test = case mbNextState of- Nothing - -> Parser (\state@(State input pos user) -> + Nothing+ -> Parser (\state@(State input pos user) -> case input of (c:cs) -> case test c of Just x -> let newpos = nextpos pos c cs newstate = State cs newpos user- in seq newpos $ seq newstate $ + in seq newpos $ seq newstate $ Consumed (Ok x newstate (newErrorUnknown newpos)) Nothing -> Empty (sysUnExpectError (show c) pos) [] -> Empty (sysUnExpectError "" pos) ) Just nextState- -> Parser (\state@(State input pos user) -> + -> Parser (\state@(State input pos user) -> case input of (c:cs) -> case test c of Just x -> let newpos = nextpos pos c cs newuser = nextState pos c cs user newstate = State cs newpos newuser- in seq newpos $ seq newstate $ + in seq newpos $ seq newstate $ Consumed (Ok x newstate (newErrorUnknown newpos)) Nothing -> Empty (sysUnExpectError (show c) pos) [] -> Empty (sysUnExpectError "" pos) ) -label :: GenParser tok st a -> String -> GenParser tok st a +label :: GenParser tok st a -> String -> GenParser tok st a label p msg = labels p [msg] labels :: GenParser tok st a -> [String] -> GenParser tok st a labels (Parser p) msgs- = Parser (\state -> + = Parser (\state -> case (p state) of- Empty reply -> Empty $ + Empty reply -> Empty $ case (reply) of Error err -> Error (setExpectErrors err msgs) Ok x state1 err | errorIsUnknown err -> reply@@ -482,10 +474,10 @@ -- | @updateParserState f@ applies function @f@ to the parser state. updateParserState :: (State tok st -> State tok st) -> GenParser tok st (State tok st)-updateParserState f +updateParserState f = Parser (\state -> let newstate = f state in Empty (Ok state newstate (unknownError newstate)))- + -- | The parser @unexpected msg@ always fails with an unexpected error -- message @msg@ without consuming any input. --@@ -496,11 +488,11 @@ unexpected :: String -> GenParser tok st a unexpected msg = Parser (\state -> Empty (Error (newErrorMessage (UnExpect msg) (statePos state))))- + setExpectErrors err [] = setErrorMessage (Expect "") err setExpectErrors err [msg] = setErrorMessage (Expect msg) err-setExpectErrors err (msg:msgs) = foldr (\msg err -> addErrorMessage (Expect msg) err) +setExpectErrors err (msg:msgs) = foldr (\msg err -> addErrorMessage (Expect msg) err) (setErrorMessage (Expect msg) err) msgs sysUnExpectError msg pos = Error (newErrorMessage (SysUnExpect msg) pos)@@ -510,7 +502,7 @@ -- Parsers unfolded for space: -- if many and skipMany are not defined as primitives, -- they will overflow the stack on large inputs------------------------------------------------------------ +----------------------------------------------------------- -- | @many p@ applies the parser @p@ /zero/ or more times. Returns a -- list of the returned values of @p@.@@ -537,7 +529,7 @@ manyAccum :: (a -> [a] -> [a]) -> GenParser tok st a -> GenParser tok st [a] manyAccum accum (Parser p)- = Parser (\state -> + = Parser (\state -> let walk xs state r = case r of Empty (Error err) -> Ok xs state err Empty ok -> error "Text.ParserCombinators.Parsec.Prim.many: combinator 'many' is applied to a parser that accepts an empty string."@@ -553,16 +545,16 @@ -------------------------------------------------------------- Parsers unfolded for speed: +-- Parsers unfolded for speed: -- tokens------------------------------------------------------------ +----------------------------------------------------------- {- specification of @tokens@: tokens showss nextposs s = scan s where scan [] = return s- scan (c:cs) = do{ token show nextpos c <?> shows s; scan cs } + scan (c:cs) = do{ token show nextpos c <?> shows s; scan cs } show c = shows [c] nextpos pos c = nextposs pos [c]@@ -570,13 +562,13 @@ tokens :: Eq tok => ([tok] -> String) -> (SourcePos -> [tok] -> SourcePos) -> [tok] -> GenParser tok st [tok] tokens shows nextposs s- = Parser (\state@(State input pos user) -> + = Parser (\state@(State input pos user) -> let ok cs = let newpos = nextposs pos s newstate = State cs newpos user- in seq newpos $ seq newstate $ + in seq newpos $ seq newstate $ (Ok s newstate (newErrorUnknown newpos))- + errEof = Error (setErrorMessage (Expect (shows s)) (newErrorMessage (SysUnExpect "") pos)) errExpect c = Error (setErrorMessage (Expect (shows s))
parsec1.cabal view
@@ -1,6 +1,6 @@ cabal-version: >= 1.2 name: parsec1-version: 1.0.0.3+version: 1.0.0.4 license: BSD3 license-file: LICENSE author: Daan Leijen <daan@cs.uu.nl>@@ -27,6 +27,7 @@ Your own module ambiguities are best avoided by hiding packages. . This version only differs from pervious ones by a changed description.+ (In version 1.0.0.4 only the inline pragmas have been removed #4849.) build-type: Simple cabal-version: >= 1.6 library {