Text.Megaparsec.Prim

Description

The primitive parser combinators.

Synopsis

Data types

data State s Source #

This is Megaparsec's state, it's parametrized over stream type s.

Constructors

 State FieldsstateInput :: s statePos :: NonEmpty SourcePos stateTabWidth :: Pos

Instances

 Eq s => Eq (State s) Source # Methods(==) :: State s -> State s -> Bool #(/=) :: State s -> State s -> Bool # Data s => Data (State s) Source # Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> State s -> c (State s) #gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (State s) #toConstr :: State s -> Constr #dataTypeOf :: State s -> DataType #dataCast1 :: Typeable (* -> *) t => (forall d. Data d => c (t d)) -> Maybe (c (State s)) #dataCast2 :: Typeable (* -> * -> *) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (State s)) #gmapT :: (forall b. Data b => b -> b) -> State s -> State s #gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> State s -> r #gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> State s -> r #gmapQ :: (forall d. Data d => d -> u) -> State s -> [u] #gmapQi :: Int -> (forall d. Data d => d -> u) -> State s -> u #gmapM :: Monad m => (forall d. Data d => d -> m d) -> State s -> m (State s) #gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> State s -> m (State s) #gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> State s -> m (State s) # Show s => Show (State s) Source # MethodsshowsPrec :: Int -> State s -> ShowS #show :: State s -> String #showList :: [State s] -> ShowS # Generic (State s) Source # Associated Typestype Rep (State s) :: * -> * # Methodsfrom :: State s -> Rep (State s) x #to :: Rep (State s) x -> State s # NFData s => NFData (State s) Source # Methodsrnf :: State s -> () # Arbitrary a => Arbitrary (State a) Source # Methodsarbitrary :: Gen (State a)shrink :: State a -> [State a] type Rep (State s) Source # type Rep (State s) = D1 (MetaData "State" "Text.Megaparsec.Prim" "megaparsec-5.1.2-DxTIYqzJXknBdgwA3K2srk" False) (C1 (MetaCons "State" PrefixI True) ((:*:) (S1 (MetaSel (Just Symbol "stateInput") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 s)) ((:*:) (S1 (MetaSel (Just Symbol "statePos") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (NonEmpty SourcePos))) (S1 (MetaSel (Just Symbol "stateTabWidth") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Pos)))))

class Ord (Token s) => Stream s where Source #

An instance of Stream s has stream type s. Token type is determined by the stream and can be found via Token type function.

Minimal complete definition

Associated Types

type Token s :: * Source #

Type of token in stream.

Since: 5.0.0

Methods

uncons :: s -> Maybe (Token s, s) Source #

Get next token from the stream. If the stream is empty, return Nothing.

updatePos :: Proxy s -> Pos -> SourcePos -> Token s -> (SourcePos, SourcePos) Source #

Update position in stream given tab width, current position, and current token. The result is a tuple where the first element will be used to report parse errors for current token, while the second element is the incremented position that will be stored in parser's state.

When you work with streams where elements do not contain information about their position in input, result is usually consists of the third argument unchanged and incremented position calculated with respect to current token. This is how default instances of Stream work (they use defaultUpdatePos, which may be a good starting point for your own position-advancing function).

When you wish to deal with stream of tokens where every token “knows” its start and end position in input (for example, you have produced the stream with Happy/Alex), then the best strategy is to use the start position as actual element position and provide the end position of the token as incremented one.

Since: 5.0.0

Instances

 Source # Associated Typestype Token String :: * Source # Methods Source # Associated Typestype Token ByteString :: * Source # Methods Source # Associated Typestype Token ByteString :: * Source # Methods Stream Text Source # Associated Typestype Token Text :: * Source # Methodsuncons :: Text -> Maybe (Token Text, Text) Source #updatePos :: Proxy * Text -> Pos -> SourcePos -> Token Text -> (SourcePos, SourcePos) Source # Stream Text Source # Associated Typestype Token Text :: * Source # Methodsuncons :: Text -> Maybe (Token Text, Text) Source #updatePos :: Proxy * Text -> Pos -> SourcePos -> Token Text -> (SourcePos, SourcePos) Source #

type Parsec e s = ParsecT e s Identity Source #

Parsec is non-transformer variant of more general ParsecT monad transformer.

data ParsecT e s m a Source #

ParsecT e s m a is a parser with custom data component of error e, stream type s, underlying monad m and return type a.

Instances

 (ErrorComponent e, Stream s) => MonadParsec e s (ParsecT e s m) Source # Methodsfailure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> ParsecT e s m a Source #label :: String -> ParsecT e s m a -> ParsecT e s m a Source #hidden :: ParsecT e s m a -> ParsecT e s m a Source #try :: ParsecT e s m a -> ParsecT e s m a Source #lookAhead :: ParsecT e s m a -> ParsecT e s m a Source #notFollowedBy :: ParsecT e s m a -> ParsecT e s m () Source #withRecovery :: (ParseError (Token s) e -> ParsecT e s m a) -> ParsecT e s m a -> ParsecT e s m a Source #observing :: ParsecT e s m a -> ParsecT e s m (Either (ParseError (Token s) e) a) Source #eof :: ParsecT e s m () Source #token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> ParsecT e s m a Source #tokens :: (Token s -> Token s -> Bool) -> [Token s] -> ParsecT e s m [Token s] Source #getParserState :: ParsecT e s m (State s) Source #updateParserState :: (State s -> State s) -> ParsecT e s m () Source # (ErrorComponent e, Stream s, MonadError e' m) => MonadError e' (ParsecT e s m) Source # MethodsthrowError :: e' -> ParsecT e s m acatchError :: ParsecT e s m a -> (e' -> ParsecT e s m a) -> ParsecT e s m a (ErrorComponent e, Stream s, MonadReader r m) => MonadReader r (ParsecT e s m) Source # Methodsask :: ParsecT e s m rlocal :: (r -> r) -> ParsecT e s m a -> ParsecT e s m areader :: (r -> a) -> ParsecT e s m a (ErrorComponent e, Stream s, MonadState st m) => MonadState st (ParsecT e s m) Source # Methodsget :: ParsecT e s m stput :: st -> ParsecT e s m ()state :: (st -> (a, st)) -> ParsecT e s m a MonadTrans (ParsecT e s) Source # Methodslift :: Monad m => m a -> ParsecT e s m a # (ErrorComponent e, Stream s) => Monad (ParsecT e s m) Source # Methods(>>=) :: ParsecT e s m a -> (a -> ParsecT e s m b) -> ParsecT e s m b #(>>) :: ParsecT e s m a -> ParsecT e s m b -> ParsecT e s m b #return :: a -> ParsecT e s m a #fail :: String -> ParsecT e s m a # Functor (ParsecT e s m) Source # Methodsfmap :: (a -> b) -> ParsecT e s m a -> ParsecT e s m b #(<$) :: a -> ParsecT e s m b -> ParsecT e s m a # (ErrorComponent e, Stream s) => MonadFail (ParsecT e s m) Source # Methodsfail :: String -> ParsecT e s m a # (ErrorComponent e, Stream s) => Applicative (ParsecT e s m) Source # Methodspure :: a -> ParsecT e s m a #(<*>) :: ParsecT e s m (a -> b) -> ParsecT e s m a -> ParsecT e s m b #(*>) :: ParsecT e s m a -> ParsecT e s m b -> ParsecT e s m b #(<*) :: ParsecT e s m a -> ParsecT e s m b -> ParsecT e s m a # (ErrorComponent e, Stream s, MonadIO m) => MonadIO (ParsecT e s m) Source # MethodsliftIO :: IO a -> ParsecT e s m a # (ErrorComponent e, Stream s) => Alternative (ParsecT e s m) Source # Methodsempty :: ParsecT e s m a #(<|>) :: ParsecT e s m a -> ParsecT e s m a -> ParsecT e s m a #some :: ParsecT e s m a -> ParsecT e s m [a] #many :: ParsecT e s m a -> ParsecT e s m [a] # (ErrorComponent e, Stream s) => MonadPlus (ParsecT e s m) Source # Methodsmzero :: ParsecT e s m a #mplus :: ParsecT e s m a -> ParsecT e s m a -> ParsecT e s m a # (ErrorComponent e, Stream s, MonadCont m) => MonadCont (ParsecT e s m) Source # MethodscallCC :: ((a -> ParsecT e s m b) -> ParsecT e s m a) -> ParsecT e s m a Primitive combinators class (ErrorComponent e, Stream s, Alternative m, MonadPlus m) => MonadParsec e s m | m -> e s where Source # Type class describing parsers independent of input type. Minimal complete definition Methods failure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> m a Source # The most general way to stop parsing and report ParseError. unexpected is defined in terms of this function: unexpected item = failure (Set.singleton item) Set.empty Set.empty Since: 4.2.0 label :: String -> m a -> m a Source # The parser label name p behaves as parser p, but whenever the parser p fails without consuming any input, it replaces names of “expected” tokens with the name name. hidden :: m a -> m a Source # hidden p behaves just like parser p, but it doesn't show any “expected” tokens in error message when p fails. try :: m a -> m a Source # The parser try p behaves like parser p, except that it backtracks parser state when p fails (either consuming input or not). This combinator is used whenever arbitrary look ahead is needed. Since it pretends that it hasn't consumed any input when p fails, the (<|>) combinator will try its second alternative even when the first parser failed while consuming input. For example, here is a parser that is supposed to parse word “let” or “lexical”: >>> parseTest (string "let" <|> string "lexical") "lexical" 1:1: unexpected "lex" expecting "let"  What happens here? First parser consumes “le” and fails (because it doesn't see a “t”). The second parser, however, isn't tried, since the first parser has already consumed some input! try fixes this behavior and allows backtracking to work: >>> parseTest (try (string "let") <|> string "lexical") "lexical" "lexical"  try also improves error messages in case of overlapping alternatives, because Megaparsec's hint system can be used: >>> parseTest (try (string "let") <|> string "lexical") "le" 1:1: unexpected "le" expecting "let" or "lexical"  Please note that as of Megaparsec 4.4.0, string backtracks automatically (see tokens), so it does not need try. However, the examples above demonstrate the idea behind try so well that it was decided to keep them. lookAhead :: m a -> m a Source # If p in lookAhead p succeeds (either consuming input or not) the whole parser behaves like p succeeded without consuming anything (parser state is not updated as well). If p fails, lookAhead has no effect, i.e. it will fail consuming input if p fails consuming input. Combine with try if this is undesirable. notFollowedBy :: m a -> m () Source # notFollowedBy p only succeeds when parser p fails. This parser never consumes any input and never modifies parser state. It can be used to implement the “longest match” rule. withRecovery :: (ParseError (Token s) e -> m a) -> m a -> m a Source # withRecovery r p allows continue parsing even if parser p fails. In this case r is called with actual ParseError as its argument. Typical usage is to return value signifying failure to parse this particular object and to consume some part of input up to start of next object. Note that if r fails, original error message is reported as if without withRecovery. In no way recovering parser r can influence error messages. Since: 4.4.0 observing :: m a -> m (Either (ParseError (Token s) e) a) Source # observing p allows to “observe” failure of p parser, should it happen, without actually ending parsing, but instead getting the ParseError in Left. On success parsed value is returned in Right as usual. Note that this primitive just allows you to observe parse errors as they happen, it does not backtrack or change how the p parser works in any way. Since: 5.1.0 eof :: m () Source # This parser only succeeds at the end of the input. token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> m a Source # The parser token test mrep accepts a token t with result x when the function test t returns Right x. mrep may provide representation of the token to report in error messages when input stream in empty. This is the most primitive combinator for accepting tokens. For example, the satisfy parser is implemented as: satisfy f = token testChar Nothing where testChar x = if f x then Right x else Left (Set.singleton (Tokens (x:|[])), Set.empty, Set.empty) tokens :: (Token s -> Token s -> Bool) -> [Token s] -> m [Token s] Source # The parser tokens test parses list of tokens and returns it. Supplied predicate test is used to check equality of given and parsed tokens. This can be used for example to write string: string = tokens (==) Note that beginning from Megaparsec 4.4.0, this is an auto-backtracking primitive, which means that if it fails, it never consumes any input. This is done to make its consumption model match how error messages for this primitive are reported (which becomes an important thing as user gets more control with primitives like withRecovery): >>> parseTest (string "abc") "abd" 1:1: unexpected "abd" expecting "abc"  This means, in particular, that it's no longer necessary to use try with tokens-based parsers, such as string and string'. This feature does not affect performance in any way. getParserState :: m (State s) Source # Returns the full parser state as a State record. updateParserState :: (State s -> State s) -> m () Source # updateParserState f applies function f to the parser state. Instances  MonadParsec e s m => MonadParsec e s (IdentityT * m) Source # Methodsfailure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> IdentityT * m a Source #label :: String -> IdentityT * m a -> IdentityT * m a Source #hidden :: IdentityT * m a -> IdentityT * m a Source #try :: IdentityT * m a -> IdentityT * m a Source #lookAhead :: IdentityT * m a -> IdentityT * m a Source #notFollowedBy :: IdentityT * m a -> IdentityT * m () Source #withRecovery :: (ParseError (Token s) e -> IdentityT * m a) -> IdentityT * m a -> IdentityT * m a Source #observing :: IdentityT * m a -> IdentityT * m (Either (ParseError (Token s) e) a) Source #eof :: IdentityT * m () Source #token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> IdentityT * m a Source #tokens :: (Token s -> Token s -> Bool) -> [Token s] -> IdentityT * m [Token s] Source #updateParserState :: (State s -> State s) -> IdentityT * m () Source # (Monoid e', MonadParsec e s m) => MonadParsec e s (ExceptT e' m) Source # Methodsfailure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> ExceptT e' m a Source #label :: String -> ExceptT e' m a -> ExceptT e' m a Source #hidden :: ExceptT e' m a -> ExceptT e' m a Source #try :: ExceptT e' m a -> ExceptT e' m a Source #lookAhead :: ExceptT e' m a -> ExceptT e' m a Source #notFollowedBy :: ExceptT e' m a -> ExceptT e' m () Source #withRecovery :: (ParseError (Token s) e -> ExceptT e' m a) -> ExceptT e' m a -> ExceptT e' m a Source #observing :: ExceptT e' m a -> ExceptT e' m (Either (ParseError (Token s) e) a) Source #eof :: ExceptT e' m () Source #token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> ExceptT e' m a Source #tokens :: (Token s -> Token s -> Bool) -> [Token s] -> ExceptT e' m [Token s] Source #getParserState :: ExceptT e' m (State s) Source #updateParserState :: (State s -> State s) -> ExceptT e' m () Source # (Monoid w, MonadParsec e s m) => MonadParsec e s (WriterT w m) Source # Methodsfailure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> WriterT w m a Source #label :: String -> WriterT w m a -> WriterT w m a Source #hidden :: WriterT w m a -> WriterT w m a Source #try :: WriterT w m a -> WriterT w m a Source #lookAhead :: WriterT w m a -> WriterT w m a Source #notFollowedBy :: WriterT w m a -> WriterT w m () Source #withRecovery :: (ParseError (Token s) e -> WriterT w m a) -> WriterT w m a -> WriterT w m a Source #observing :: WriterT w m a -> WriterT w m (Either (ParseError (Token s) e) a) Source #eof :: WriterT w m () Source #token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> WriterT w m a Source #tokens :: (Token s -> Token s -> Bool) -> [Token s] -> WriterT w m [Token s] Source #getParserState :: WriterT w m (State s) Source #updateParserState :: (State s -> State s) -> WriterT w m () Source # (Monoid w, MonadParsec e s m) => MonadParsec e s (WriterT w m) Source # Methodsfailure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> WriterT w m a Source #label :: String -> WriterT w m a -> WriterT w m a Source #hidden :: WriterT w m a -> WriterT w m a Source #try :: WriterT w m a -> WriterT w m a Source #lookAhead :: WriterT w m a -> WriterT w m a Source #notFollowedBy :: WriterT w m a -> WriterT w m () Source #withRecovery :: (ParseError (Token s) e -> WriterT w m a) -> WriterT w m a -> WriterT w m a Source #observing :: WriterT w m a -> WriterT w m (Either (ParseError (Token s) e) a) Source #eof :: WriterT w m () Source #token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> WriterT w m a Source #tokens :: (Token s -> Token s -> Bool) -> [Token s] -> WriterT w m [Token s] Source #getParserState :: WriterT w m (State s) Source #updateParserState :: (State s -> State s) -> WriterT w m () Source # MonadParsec e s m => MonadParsec e s (StateT st m) Source # Methodsfailure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> StateT st m a Source #label :: String -> StateT st m a -> StateT st m a Source #hidden :: StateT st m a -> StateT st m a Source #try :: StateT st m a -> StateT st m a Source #lookAhead :: StateT st m a -> StateT st m a Source #notFollowedBy :: StateT st m a -> StateT st m () Source #withRecovery :: (ParseError (Token s) e -> StateT st m a) -> StateT st m a -> StateT st m a Source #observing :: StateT st m a -> StateT st m (Either (ParseError (Token s) e) a) Source #eof :: StateT st m () Source #token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> StateT st m a Source #tokens :: (Token s -> Token s -> Bool) -> [Token s] -> StateT st m [Token s] Source #getParserState :: StateT st m (State s) Source #updateParserState :: (State s -> State s) -> StateT st m () Source # MonadParsec e s m => MonadParsec e s (StateT st m) Source # Methodsfailure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> StateT st m a Source #label :: String -> StateT st m a -> StateT st m a Source #hidden :: StateT st m a -> StateT st m a Source #try :: StateT st m a -> StateT st m a Source #lookAhead :: StateT st m a -> StateT st m a Source #notFollowedBy :: StateT st m a -> StateT st m () Source #withRecovery :: (ParseError (Token s) e -> StateT st m a) -> StateT st m a -> StateT st m a Source #observing :: StateT st m a -> StateT st m (Either (ParseError (Token s) e) a) Source #eof :: StateT st m () Source #token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> StateT st m a Source #tokens :: (Token s -> Token s -> Bool) -> [Token s] -> StateT st m [Token s] Source #getParserState :: StateT st m (State s) Source #updateParserState :: (State s -> State s) -> StateT st m () Source # MonadParsec e s m => MonadParsec e s (ReaderT * r m) Source # Methodsfailure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> ReaderT * r m a Source #label :: String -> ReaderT * r m a -> ReaderT * r m a Source #hidden :: ReaderT * r m a -> ReaderT * r m a Source #try :: ReaderT * r m a -> ReaderT * r m a Source #lookAhead :: ReaderT * r m a -> ReaderT * r m a Source #notFollowedBy :: ReaderT * r m a -> ReaderT * r m () Source #withRecovery :: (ParseError (Token s) e -> ReaderT * r m a) -> ReaderT * r m a -> ReaderT * r m a Source #observing :: ReaderT * r m a -> ReaderT * r m (Either (ParseError (Token s) e) a) Source #eof :: ReaderT * r m () Source #token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> ReaderT * r m a Source #tokens :: (Token s -> Token s -> Bool) -> [Token s] -> ReaderT * r m [Token s] Source #getParserState :: ReaderT * r m (State s) Source #updateParserState :: (State s -> State s) -> ReaderT * r m () Source # (ErrorComponent e, Stream s) => MonadParsec e s (ParsecT e s m) Source # Methodsfailure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> ParsecT e s m a Source #label :: String -> ParsecT e s m a -> ParsecT e s m a Source #hidden :: ParsecT e s m a -> ParsecT e s m a Source #try :: ParsecT e s m a -> ParsecT e s m a Source #lookAhead :: ParsecT e s m a -> ParsecT e s m a Source #notFollowedBy :: ParsecT e s m a -> ParsecT e s m () Source #withRecovery :: (ParseError (Token s) e -> ParsecT e s m a) -> ParsecT e s m a -> ParsecT e s m a Source #observing :: ParsecT e s m a -> ParsecT e s m (Either (ParseError (Token s) e) a) Source #eof :: ParsecT e s m () Source #token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> ParsecT e s m a Source #tokens :: (Token s -> Token s -> Bool) -> [Token s] -> ParsecT e s m [Token s] Source #getParserState :: ParsecT e s m (State s) Source #updateParserState :: (State s -> State s) -> ParsecT e s m () Source # (Monoid w, MonadParsec e s m) => MonadParsec e s (RWST r w st m) Source # Methodsfailure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> RWST r w st m a Source #label :: String -> RWST r w st m a -> RWST r w st m a Source #hidden :: RWST r w st m a -> RWST r w st m a Source #try :: RWST r w st m a -> RWST r w st m a Source #lookAhead :: RWST r w st m a -> RWST r w st m a Source #notFollowedBy :: RWST r w st m a -> RWST r w st m () Source #withRecovery :: (ParseError (Token s) e -> RWST r w st m a) -> RWST r w st m a -> RWST r w st m a Source #observing :: RWST r w st m a -> RWST r w st m (Either (ParseError (Token s) e) a) Source #eof :: RWST r w st m () Source #token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> RWST r w st m a Source #tokens :: (Token s -> Token s -> Bool) -> [Token s] -> RWST r w st m [Token s] Source #getParserState :: RWST r w st m (State s) Source #updateParserState :: (State s -> State s) -> RWST r w st m () Source # (Monoid w, MonadParsec e s m) => MonadParsec e s (RWST r w st m) Source # Methodsfailure :: Set (ErrorItem (Token s)) -> Set (ErrorItem (Token s)) -> Set e -> RWST r w st m a Source #label :: String -> RWST r w st m a -> RWST r w st m a Source #hidden :: RWST r w st m a -> RWST r w st m a Source #try :: RWST r w st m a -> RWST r w st m a Source #lookAhead :: RWST r w st m a -> RWST r w st m a Source #notFollowedBy :: RWST r w st m a -> RWST r w st m () Source #withRecovery :: (ParseError (Token s) e -> RWST r w st m a) -> RWST r w st m a -> RWST r w st m a Source #observing :: RWST r w st m a -> RWST r w st m (Either (ParseError (Token s) e) a) Source #eof :: RWST r w st m () Source #token :: (Token s -> Either (Set (ErrorItem (Token s)), Set (ErrorItem (Token s)), Set e) a) -> Maybe (Token s) -> RWST r w st m a Source #tokens :: (Token s -> Token s -> Bool) -> [Token s] -> RWST r w st m [Token s] Source #getParserState :: RWST r w st m (State s) Source #updateParserState :: (State s -> State s) -> RWST r w st m () Source # (<?>) :: MonadParsec e s m => m a -> String -> m a infix 0 Source # A synonym for label in form of an operator. unexpected :: MonadParsec e s m => ErrorItem (Token s) -> m a Source # The parser unexpected item always fails with an error message telling about unexpected item item without consuming any input. Parser state combinators getInput :: MonadParsec e s m => m s Source # Return the current input. setInput :: MonadParsec e s m => s -> m () Source # setInput input continues parsing with input. The getInput and setInput functions can for example be used to deal with include files. getPosition :: MonadParsec e s m => m SourcePos Source # Return the current source position. See also: setPosition, pushPosition, popPosition, and SourcePos. setPosition :: MonadParsec e s m => SourcePos -> m () Source # setPosition pos sets the current source position to pos. See also: getPosition, pushPosition, popPosition, and SourcePos. pushPosition :: MonadParsec e s m => SourcePos -> m () Source # Push given position into stack of positions and continue parsing working with this position. Useful for working with include files and the like. See also: getPosition, setPosition, popPosition, and SourcePos. Since: 5.0.0 popPosition :: MonadParsec e s m => m () Source # Pop a position from stack of positions unless it only contains one element (in that case stack of positions remains the same). This is how to return to previous source file after pushPosition. See also: getPosition, setPosition, pushPosition, and SourcePos. Since: 5.0.0 getTabWidth :: MonadParsec e s m => m Pos Source # Return tab width. Default tab width is equal to defaultTabWidth. You can set different tab width with help of setTabWidth. setTabWidth :: MonadParsec e s m => Pos -> m () Source # Set tab width. If argument of the function is not positive number, defaultTabWidth will be used. setParserState :: MonadParsec e s m => State s -> m () Source # setParserState st set the full parser state to st. Running parser Arguments  :: Parsec e s a Parser to run -> String Name of source file -> s Input for parser -> Either (ParseError (Token s) e) a runParser p file input runs parser p on the input list of tokens input, obtained from source file. The file is only used in error messages and may be the empty string. Returns either a ParseError (Left) or a value of type a (Right). parseFromFile p file = runParser p file <$> readFile file

Arguments

 :: Parsec e s a Parser to run -> State s Initial state -> (State s, Either (ParseError (Token s) e) a)

The function is similar to runParser with the difference that it accepts and returns parser state. This allows to specify arbitrary textual position at the beginning of parsing, for example. This is the most general way to run a parser over the Identity monad.

Since: 4.2.0

Arguments

 :: Monad m => ParsecT e s m a Parser to run -> String Name of source file -> s Input for parser -> m (Either (ParseError (Token s) e) a)

runParserT p file input runs parser p on the input list of tokens input, obtained from source file. The file is only used in error messages and may be the empty string. Returns a computation in the underlying monad m that returns either a ParseError (Left) or a value of type a (Right).

Arguments

 :: Monad m => ParsecT e s m a Parser to run -> State s Initial state -> m (State s, Either (ParseError (Token s) e) a)

This function is similar to runParserT, but like runParser' it accepts and returns parser state. This is thus the most general way to run a parser.

Since: 4.2.0

Arguments

 :: Parsec e s a Parser to run -> String Name of source file -> s Input for parser -> Either (ParseError (Token s) e) a

parse p file input runs parser p over Identity (see runParserT if you're using the ParsecT monad transformer; parse itself is just a synonym for runParser). It returns either a ParseError (Left) or a value of type a (Right). parseErrorPretty can be used to turn ParseError into the string representation of the error message. See Text.Megaparsec.Error if you need to do more advanced error analysis.

main = case (parse numbers "" "11,2,43") of
Left err -> putStr (parseErrorPretty err)
Right xs -> print (sum xs)

numbers = integer sepBy char ','

parseMaybe :: (ErrorComponent e, Stream s) => Parsec e s a -> s -> Maybe a Source #

parseMaybe p input runs parser p on input and returns result inside Just on success and Nothing on failure. This function also parses eof, so if the parser doesn't consume all of its input, it will fail.

The function is supposed to be useful for lightweight parsing, where error messages (and thus file name) are not important and entire input should be parsed. For example it can be used when parsing of single number according to specification of its format is desired.

Arguments

 :: (ShowErrorComponent e, Ord (Token s), ShowToken (Token s), Show a) => Parsec e s a Parser to run -> s Input for parser -> IO ()

The expression parseTest p input applies a parser p against input input and prints the result to stdout. Useful for testing.

Debugging

Arguments

 :: (Stream s, ShowToken (Token s), ShowErrorComponent e, Show a) => String Debugging label -> ParsecT e s m a Parser to debug -> ParsecT e s m a Parser that prints debugging messages

dbg label p parser works exactly like p, but when it's evaluated it prints information useful for debugging. The label is only used to refer to this parser in the debugging output. This combinator uses the trace function from Debug.Trace under the hood.

Typical usage is to wrap every sub-parser in misbehaving parser with dbg assigning meaningful labels. Then give it a shot and go through the print-out. As of current version, this combinator prints all available information except for hints, which are probably only interesting to the maintainer of Megaparsec itself and may be quite verbose to output in general. Let me know if you would like to be able to see hints as part of debugging output.

The output itself is pretty self-explanatory, although the following abbreviations should be clarified (they are derived from low-level source code):

• COK — “consumed OK”. The parser consumed input and succeeded.
• CERR — “consumed error”. The parser consumed input and failed.
• EOK — “empty OK”. The parser succeeded without consuming input.
• EERR — “empty error”. The parser failed without consuming input.

Due to how input streams are represented (see Stream), we need to traverse entire input twice (calculating length before and after p parser) to understand what part of input was matched and consumed. This makes this combinator very inefficient, be sure to remove it from your code once you have finished with debugging.

Finally, it's not possible to lift this function into some monad transformers without introducing surprising behavior (e.g. unexpected state backtracking) or adding otherwise redundant constraints (e.g. Show instance for state), so this helper is only available for ParsecT monad, not MonadParsec in general.

Since: 5.1.0