trifecta-2.1: A modern parser combinator library with convenient diagnostics

Text.Trifecta.Parser

Description

Synopsis

# Documentation

newtype Parser a Source #

The type of a trifecta parser

The first four arguments are behavior continuations:

• epsilon success: the parser has consumed no input and has a result as well as a possible Err; the position and chunk are unchanged (see pure)
• epsilon failure: the parser has consumed no input and is failing with the given Err; the position and chunk are unchanged (see empty)
• committed success: the parser has consumed input and is yielding the result, set of expected strings that would have permitted this parse to continue, new position, and residual chunk to the continuation.
• committed failure: the parser has consumed input and is failing with a given ErrInfo (user-facing error message)

The remaining two arguments are

• the current position
• the chunk of input currently under analysis

Parser is an Alternative; trifecta's backtracking behavior encoded as <|> is to behave as the leftmost parser which yields a value (regardless of any input being consumed) or which consumes input and fails. That is, a choice of parsers will only yield an epsilon failure if *all* parsers in the choice do. If that is not the desired behavior, see try, which turns a committed parser failure into an epsilon failure (at the cost of error information).

Constructors

 Parser Fieldsunparser :: forall r. (a -> Err -> It Rope r) -> (Err -> It Rope r) -> (a -> Set String -> Delta -> ByteString -> It Rope r) -> (ErrInfo -> It Rope r) -> Delta -> ByteString -> It Rope r
Instances
 Source # Instance detailsDefined in Text.Trifecta.Parser Methods(>>=) :: Parser a -> (a -> Parser b) -> Parser b #(>>) :: Parser a -> Parser b -> Parser b #return :: a -> Parser a #fail :: String -> Parser a # Source # Instance detailsDefined in Text.Trifecta.Parser Methodsfmap :: (a -> b) -> Parser a -> Parser b #(<$) :: a -> Parser b -> Parser a # Source # Instance detailsDefined in Text.Trifecta.Parser Methodsfail :: String -> Parser a # Source # Instance detailsDefined in Text.Trifecta.Parser Methodspure :: a -> Parser a #(<*>) :: Parser (a -> b) -> Parser a -> Parser b #liftA2 :: (a -> b -> c) -> Parser a -> Parser b -> Parser c #(*>) :: Parser a -> Parser b -> Parser b #(<*) :: Parser a -> Parser b -> Parser a # Source # Instance detailsDefined in Text.Trifecta.Parser Methodsempty :: Parser a #(<|>) :: Parser a -> Parser a -> Parser a #some :: Parser a -> Parser [a] #many :: Parser a -> Parser [a] # Source # Instance detailsDefined in Text.Trifecta.Parser Methodsmzero :: Parser a #mplus :: Parser a -> Parser a -> Parser a # Source # Instance detailsDefined in Text.Trifecta.Parser MethodssomeSpace :: Parser () #nesting :: Parser a -> Parser a #highlight :: Highlight -> Parser a -> Parser a #token :: Parser a -> Parser a # Source # Instance detailsDefined in Text.Trifecta.Parser MethodslookAhead :: Parser a -> Parser a # Source # Instance detailsDefined in Text.Trifecta.Parser Methodssatisfy :: (Char -> Bool) -> Parser Char # Source # Instance detailsDefined in Text.Trifecta.Parser Methodstry :: Parser a -> Parser a #() :: Parser a -> String -> Parser a #skipMany :: Parser a -> Parser () #skipSome :: Parser a -> Parser () #eof :: Parser () #notFollowedBy :: Show a => Parser a -> Parser () # Source # Instance detailsDefined in Text.Trifecta.Parser Methods Source # Instance detailsDefined in Text.Trifecta.Parser MethodsslicedWith :: (a -> ByteString -> r) -> Parser a -> Parser r Source # Source # Instance detailsDefined in Text.Trifecta.Parser Methods Semigroup a => Semigroup (Parser a) Source # Instance detailsDefined in Text.Trifecta.Parser Methods(<>) :: Parser a -> Parser a -> Parser a #sconcat :: NonEmpty (Parser a) -> Parser a #stimes :: Integral b => b -> Parser a -> Parser a # (Semigroup a, Monoid a) => Monoid (Parser a) Source # Instance detailsDefined in Text.Trifecta.Parser Methodsmappend :: Parser a -> Parser a -> Parser a #mconcat :: [Parser a] -> Parser a # manyAccum :: (a -> [a] -> [a]) -> Parser a -> Parser [a] Source # # Feeding a parser more more input data Step a Source # A Step allows for incremental parsing, since the parser • can be done with a final result • have errored • can have yielded a partial result with possibly more to come Constructors  StepDone !Rope a Parsing is done and has converted the Rope to a final result StepFail !Rope ErrInfo Parsing the Rope has failed with an error StepCont !Rope (Result a) (Rope -> Step a) The Rope has been partially consumed and already yielded a Result, and if more input is provided, more results can be produced.One common scenario for this is to parse log files: after parsing a single line, that data can already be worked with, but there may be more lines to come. Instances  Source # Instance detailsDefined in Text.Trifecta.Parser Methodsfmap :: (a -> b) -> Step a -> Step b #(<$) :: a -> Step b -> Step a # Show a => Show (Step a) Source # Instance detailsDefined in Text.Trifecta.Parser MethodsshowsPrec :: Int -> Step a -> ShowS #show :: Step a -> String #showList :: [Step a] -> ShowS #

feed :: Reducer t Rope => t -> Step r -> Step r Source #

Feed some additional input to a Step to continue parsing a bit further.

starve :: Step a -> Result a Source #

Assume all possible input has been given to the parser, execute it to yield a final result.

Arguments

 :: Parser a -> Delta Starting cursor position. Usually mempty for the beginning of the file. -> Step a

Incremental parsing. A Step can be supplied with new input using feed, the final Result is obtained using starve.

# Parsing

Arguments

 :: Reducer t Rope => Parser a -> Delta Starting cursor position. Usually mempty for the beginning of the file. -> t -> Result a

Run a Parser on input that can be reduced to a Rope, e.g. String, or ByteString. See also the monomorphic versions parseString and parseByteString.

parseFromFile :: MonadIO m => Parser a -> String -> m (Maybe a) Source #

(parseFromFile p filePath) runs a parser p on the input read from filePath using readFile. All diagnostic messages emitted over the course of the parse attempt are shown to the user on the console.

main = do
result <- parseFromFile numbers "digits.txt"
case result of
Nothing -> return ()
Just a  -> print \$ sum a

parseFromFileEx :: MonadIO m => Parser a -> String -> m (Result a) Source #

(parseFromFileEx p filePath) runs a parser p on the input read from filePath using readFile. Returns all diagnostic messages emitted over the course of the parse and the answer if the parse was successful.

main = do
result <- parseFromFileEx (many number) "digits.txt"
case result of
Failure xs -> displayLn xs
Success a  -> print (sum a)

Arguments

 :: Parser a -> Delta Starting cursor position. Usually mempty for the beginning of the file. -> String -> Result a

Fully parse a String to a Result.

parseByteString p delta i runs a parser p on i.

Arguments

 :: Parser a -> Delta Starting cursor position. Usually mempty for the beginning of the file. -> ByteString -> Result a

Fully parse a ByteString to a Result.

parseByteString p delta i runs a parser p on i.

parseTest :: (MonadIO m, Show a) => Parser a -> String -> m () Source #