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
>>>
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 # | |
Defined in HeadedMegaparsec.HeadedParsec (>>=) :: 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.HeadedParsec 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.HeadedParsec fail :: String -> HeadedParsec err strm a # | |
(Ord err, Stream strm) => Applicative (HeadedParsec err strm) Source # | |
Defined in HeadedMegaparsec.HeadedParsec 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.HeadedParsec 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.HeadedParsec 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.HeadedParsec 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.