Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- data HeadedParsec err strm a
- toParsec :: (Ord err, Stream strm) => HeadedParsec err strm a -> Parsec err strm a
- wrapToHead :: (Ord err, Stream strm) => HeadedParsec err strm a -> HeadedParsec err strm a
- label :: (Ord err, Stream strm) => String -> HeadedParsec err strm a -> HeadedParsec err strm a
- dbg :: (Ord err, ShowErrorComponent err, Stream strm, Show a) => String -> HeadedParsec err strm a -> HeadedParsec err strm a
- filter :: (Ord err, Stream strm) => (a -> String) -> (a -> Bool) -> HeadedParsec err strm a -> HeadedParsec err strm a
- parse :: (Ord err, Stream strm) => Parsec err strm a -> HeadedParsec err strm a
- endHead :: Stream strm => HeadedParsec err strm ()
Types
data HeadedParsec err strm a Source #
Headed parser.
Abstracts over explicit composition between consecutive megaparsec try
blocks,
providing for better error messages.
With headed parser you don't need to use try
at all.
Examples
>>>
:{
let select :: HeadedParsec Void Text (Maybe [Either Char Int], Maybe Int) select = do head (string' "select") _targets <- optional (head space1 *> targets) _limit <- optional (head space1 *> limit) return (_targets, _limit) where targets = sepBy1 target commaSeparator target = head (Left <$> char '*') <|> head (Right <$> Lexer.decimal) commaSeparator = head (space *> char ',' *> space) limit = head (string' "limit" *> space1) *> tail Lexer.decimal test :: Text -> IO () test = parseTest (toParsec select <* eof) :}
>>>
test "select 1, "
... unexpected ',' ...
>>>
test "select limit "
... unexpected end of input expecting integer or white space
>>>
test "select 1, 2 limit 2"
(Just [Right 1,Right 2],Just 2)
Instances
(Ord err, Stream strm) => Monad (HeadedParsec err strm) Source # | |
Defined in HeadedMegaparsec (>>=) :: HeadedParsec err strm a -> (a -> HeadedParsec err strm b) -> HeadedParsec err strm b # (>>) :: HeadedParsec err strm a -> HeadedParsec err strm b -> HeadedParsec err strm b # return :: a -> HeadedParsec err strm a # fail :: String -> HeadedParsec err strm a # | |
Functor (HeadedParsec err strm) Source # | |
Defined in HeadedMegaparsec fmap :: (a -> b) -> HeadedParsec err strm a -> HeadedParsec err strm b # (<$) :: a -> HeadedParsec err strm b -> HeadedParsec err strm a # | |
(Ord err, Stream strm) => MonadFail (HeadedParsec err strm) Source # | |
Defined in HeadedMegaparsec fail :: String -> HeadedParsec err strm a # | |
(Ord err, Stream strm) => Applicative (HeadedParsec err strm) Source # | |
Defined in HeadedMegaparsec pure :: a -> HeadedParsec err strm a # (<*>) :: HeadedParsec err strm (a -> b) -> HeadedParsec err strm a -> HeadedParsec err strm b # liftA2 :: (a -> b -> c) -> HeadedParsec err strm a -> HeadedParsec err strm b -> HeadedParsec err strm c # (*>) :: HeadedParsec err strm a -> HeadedParsec err strm b -> HeadedParsec err strm b # (<*) :: HeadedParsec err strm a -> HeadedParsec err strm b -> HeadedParsec err strm a # | |
(Ord err, Stream strm) => Alternative (HeadedParsec err strm) Source # | Alternation is performed only the basis of heads. Bodies do not participate. |
Defined in HeadedMegaparsec empty :: HeadedParsec err strm a # (<|>) :: HeadedParsec err strm a -> HeadedParsec err strm a -> HeadedParsec err strm a # some :: HeadedParsec err strm a -> HeadedParsec err strm [a] # many :: HeadedParsec err strm a -> HeadedParsec err strm [a] # | |
(Ord err, Stream strm) => MonadPlus (HeadedParsec err strm) Source # | Alternation is performed only the basis of heads. Bodies do not participate. |
Defined in HeadedMegaparsec mzero :: HeadedParsec err strm a # mplus :: HeadedParsec err strm a -> HeadedParsec err strm a -> HeadedParsec err strm a # | |
(Ord err, Stream strm) => Selective (HeadedParsec err strm) Source # | |
Defined in HeadedMegaparsec select :: HeadedParsec err strm (Either a b) -> HeadedParsec err strm (a -> b) -> HeadedParsec err strm b # |
Execution
toParsec :: (Ord err, Stream strm) => HeadedParsec err strm a -> Parsec err strm a Source #
Convert headed parser into megaparsec parser.
Transformation
wrapToHead :: (Ord err, Stream strm) => HeadedParsec err strm a -> HeadedParsec err strm a Source #
Wrap a parser to be usable as a whole in a head block,
allowing it in effect to be composed with the following parsers into a single try
when executed,
no matter whether it contains endHead
or not.
label :: (Ord err, Stream strm) => String -> HeadedParsec err strm a -> HeadedParsec err strm a Source #
Label a headed parser.
Works the same way as megaparsec's label
.
dbg :: (Ord err, ShowErrorComponent err, Stream strm, Show a) => String -> HeadedParsec err strm a -> HeadedParsec err strm a Source #
Make a parser print debugging information when evaluated. The first parameter is a custom label.
This function is a wrapper around dbg
.
It generates two debugging entries: one for head and one for tail.
filter :: (Ord err, Stream strm) => (a -> String) -> (a -> Bool) -> HeadedParsec err strm a -> HeadedParsec err strm a Source #
Filter the results of parser based on a predicate, failing with a parameterized message.
Construction
parse :: (Ord err, Stream strm) => Parsec err strm a -> HeadedParsec err strm a Source #
Lift a megaparsec parser.
endHead :: Stream strm => HeadedParsec err strm () Source #
Make all the following parsers compose as tail.