headed-megaparsec-0.2: More informative parser

Safe HaskellNone
LanguageHaskell2010

HeadedMegaparsec

Contents

Synopsis

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

Expand
>>> import qualified Text.Megaparsec as M
>>> import qualified Text.Megaparsec.Char as M
>>> import qualified Text.Megaparsec.Char.Lexer as ML
>>> :{
  let
    select :: HeadedParsec Void String (Maybe [Either Char Int], Maybe Int)
    select = do
      string' "select"
      endHead
      _targets <- optional (space1 *> targets)
      _limit <- optional (space1 *> limit)
      return (_targets, _limit)
      where
        -- Lifted versions of basic parsers:
        char = parse . M.char
        space = parse M.space
        space1 = parse M.space1
        decimal = parse ML.decimal
        string' = parse . M.string'
        -- Syntax parsers:
        targets = sepBy1 target commaSeparator
        target = Left <$> char '*' <|> Right <$> decimal
        commaSeparator = space *> char ',' *> endHead *> space
        limit = string' "limit" *> endHead *> space1 *> decimal
    test :: String -> IO ()
    test = M.parseTest (toParsec select <* M.eof)
:}
>>> test "select 1, "
1:11:
  |
1 | select 1, 
  |           ^
unexpected end of input
expecting '*', integer, or white space
>>> 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 # 
Instance details

Defined in HeadedMegaparsec

Methods

(>>=) :: 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 # 
Instance details

Defined in HeadedMegaparsec

Methods

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 # 
Instance details

Defined in HeadedMegaparsec

Methods

fail :: String -> HeadedParsec err strm a #

(Ord err, Stream strm) => Applicative (HeadedParsec err strm) Source # 
Instance details

Defined in HeadedMegaparsec

Methods

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.

Instance details

Defined in HeadedMegaparsec

Methods

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.

Instance details

Defined in HeadedMegaparsec

Methods

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 # 
Instance details

Defined in HeadedMegaparsec

Methods

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, VisualStream 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.