pup-0.1.1: Invertible format descriptors
Safe HaskellNone
LanguageGHC2021

Text.Pup.Backend.Megaparsec

Description

This module defines a Text.Megaparsec backend for format descriptors. To that effect, this module introduces a type class MonadParsec modeled after Megarparsec's own type class, so that format descriptors can take advantage of Megaparsec features.

The MonadParsec class in this module isn't exactly the same as the one from Megaparsec (mainly because it needs to be implementable on pretty-printers as well). As such, some of the code in this module is similar or identical to Megaparsec, many of the docstrings are taken directly from Megaparsec as well.

Synopsis

Concrete backend

type Backend err s = BackendGen (Parsec err s) Source #

newtype BackendGen (m :: Type -> Type) r r' a Source #

Constructors

MkBackend (IgnoreIndices m r r' a) 

Instances

Instances details
Annotations ann (BackendGen m :: Type -> Type -> Type -> Type) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

annotate :: ann -> BackendGen m r r' a -> BackendGen m r r' a Source #

MonadFail m => Fail (BackendGen m :: Type -> Type -> Type -> Type) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

fail :: String -> BackendGen m i j a #

(MonadParsec err s m, tok ~ Token s, chunk ~ Tokens s, Eq tok, Eq chunk) => Tokens tok chunk (BackendGen m) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

eof :: BackendGen m r r () Source #

single :: tok -> BackendGen m r r tok Source #

satisfy :: (tok -> Bool) -> BackendGen m (tok -> r) r tok Source #

tokens :: (chunk -> chunk -> Bool) -> chunk -> BackendGen m (chunk -> r) r chunk Source #

takeWhileP :: Maybe String -> (tok -> Bool) -> BackendGen m (chunk -> r) r chunk Source #

takeWhile1P :: Maybe String -> (tok -> Bool) -> BackendGen m (chunk -> r) r chunk Source #

takeP :: Maybe String -> Int -> BackendGen m (chunk -> r) r chunk Source #

label :: String -> BackendGen m r r' a -> BackendGen m r r' a Source #

hidden :: BackendGen m r r' a -> BackendGen m r r' a Source #

(MonadParsec e s m, Stream s) => MonadParsec s (BackendGen m) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

try :: BackendGen m r r' a -> BackendGen m r r' a Source #

token :: (Token s -> Maybe a) -> Set (ErrorItem (Token s)) -> (a -> Token s) -> BackendGen m (a -> r) r a Source #

(MonadParsec err s m, Token s ~ Char) => Breaks (BackendGen m :: Type -> Type -> Type -> Type) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

space :: BackendGen m r r () Source #

space1 :: BackendGen m r r () Source #

hardline :: BackendGen m r r () Source #

(MonadParsec err s m, Token s ~ Char) => WadlerLeijen (BackendGen m :: Type -> Type -> Type -> Type) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

group :: BackendGen m r r' a -> BackendGen m r r' a Source #

nest :: Int -> BackendGen m r r' a -> BackendGen m r r' a Source #

Applicative m => Applicative (BackendGen m :: Type -> Type -> Type -> Type) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

pure :: a -> BackendGen m i i a #

(<*>) :: BackendGen m i j (a -> b) -> BackendGen m j k1 a -> BackendGen m i k1 b #

liftA2 :: (a -> b -> c) -> BackendGen m i j a -> BackendGen m j k1 b -> BackendGen m i k1 c #

(*>) :: BackendGen m i j a -> BackendGen m j k1 b -> BackendGen m i k1 b #

(<*) :: BackendGen m i j a -> BackendGen m j k1 b -> BackendGen m i k1 a #

Monad m => Monad (BackendGen m :: Type -> Type -> Type -> Type) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

(>>=) :: BackendGen m i j a -> (a -> BackendGen m j k1 b) -> BackendGen m i k1 b #

MonadParsec err s m => LookAhead (BackendGen m) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

lookAhead :: BackendGen m (a -> r) r a -> BackendGen m (a -> r) r a Source #

notFollowedBy :: BackendGen m r r a -> BackendGen m r r () Source #

Applicative m => Stacked (BackendGen m) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

shift_ :: ((r' -> r') -> r -> BackendGen m r r'' r'') -> BackendGen m r r' () #

MonadParsec e s m => ParseErrors (ParseError s e) (BackendGen m) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

parseError :: ParseError s e -> BackendGen m r r' a Source #

withRecovery :: (ParseError s e -> BackendGen m r r' a) -> BackendGen m r r' a -> BackendGen m r r' a Source #

observing :: BackendGen m (b -> r) r a -> BackendGen m (Either (ParseError s e) b -> r) r (Either (ParseError s e) a) Source #

Alternative m => Alternative (BackendGen m r r') Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

empty :: BackendGen m r r' a #

(<|>) :: BackendGen m r r' a -> BackendGen m r r' a -> BackendGen m r r' a #

some :: BackendGen m r r' a -> BackendGen m r r' [a] #

many :: BackendGen m r r' a -> BackendGen m r r' [a] #

Applicative m => Applicative (BackendGen m r r') Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

pure :: a -> BackendGen m r r' a #

(<*>) :: BackendGen m r r' (a -> b) -> BackendGen m r r' a -> BackendGen m r r' b #

liftA2 :: (a -> b -> c) -> BackendGen m r r' a -> BackendGen m r r' b -> BackendGen m r r' c #

(*>) :: BackendGen m r r' a -> BackendGen m r r' b -> BackendGen m r r' b #

(<*) :: BackendGen m r r' a -> BackendGen m r r' b -> BackendGen m r r' a #

Functor m => Functor (BackendGen m r r') Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

fmap :: (a -> b) -> BackendGen m r r' a -> BackendGen m r r' b #

(<$) :: a -> BackendGen m r r' b -> BackendGen m r r' a #

Monad m => Monad (BackendGen m r r') Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

(>>=) :: BackendGen m r r' a -> (a -> BackendGen m r r' b) -> BackendGen m r r' b #

(>>) :: BackendGen m r r' a -> BackendGen m r r' b -> BackendGen m r r' b #

return :: a -> BackendGen m r r' a #

MonadPlus m => MonadPlus (BackendGen m r r') Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

mzero :: BackendGen m r r' a #

mplus :: BackendGen m r r' a -> BackendGen m r r' a -> BackendGen m r r' a #

Alternative m => Additive (BackendGen m r r' a) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

empty :: BackendGen m r r' a #

(<|>) :: BackendGen m r r' a -> BackendGen m r r' a -> BackendGen m r r' a #

Megaparsec-specific format descriptors

class (Stream s, MonadPlus m, Stacked m, Tokens (Token s) (Tokens s) m, LookAhead m) => MonadParsec s (m :: Type -> Type -> Type -> Type) | m -> s where Source #

A Megaparsec-style class for format descriptors. Inheriting from Megaparsec, it is somewhat parsing-oriented.

The documentation of individual methods is taken from MonadParsec.

Note: some primitive from MonadParsec, in particular reflection/escape hatch primitives, are omitted from this class because they aren't implementable for printers. If you need them, you want to act at the parsec level, not the Pup level.

Methods

try :: m r r' a -> m r r' a Source #

The parser try p behaves like the parser p, except that it backtracks the 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 if the first parser failed while consuming input.

For example, here is a parser that is supposed to parse the word “let” or the word “lexical”:

>>> parseTest (string "let" <|> string "lexical") "lexical"
1:1:
unexpected "lex"
expecting "let"

What happens here? The 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"

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. You still need to use try when your alternatives are complex, composite parsers.

token Source #

Arguments

:: (Token s -> Maybe a)

Matching function for the token to parse

-> Set (ErrorItem (Token s))

Used in the error message to mention the items that were expected

-> (a -> Token s)

Printing function for the token

-> m (a -> r) r a 

The parser token test expected accepts tokens for which the matching function test returns Just results. If Nothing is returned the expected set is used to report the items that were expected.

For example, the satisfy parser is implemented as:

satisfy f = token testToken Set.empty
  where
    testToken x = if f x then Just x else Nothing

Instances

Instances details
MonadParsec Text (Backend ann) Source # 
Instance details

Defined in Text.Pup.Backend.Prettyprinter

Methods

try :: Backend ann r r' a -> Backend ann r r' a Source #

token :: (Token Text -> Maybe a) -> Set (ErrorItem (Token Text)) -> (a -> Token Text) -> Backend ann (a -> r) r a Source #

(MonadParsec e s m, Stream s) => MonadParsec s (BackendGen m) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

try :: BackendGen m r r' a -> BackendGen m r r' a Source #

token :: (Token s -> Maybe a) -> Set (ErrorItem (Token s)) -> (a -> Token s) -> BackendGen m (a -> r) r a Source #

Ord err => MonadParsec Text (Pup err ann) Source # 
Instance details

Defined in Text.Pup.MPR

Methods

try :: Pup err ann r r' a -> Pup err ann r r' a Source #

token :: (Token Text -> Maybe a) -> Set (ErrorItem (Token Text)) -> (a -> Token Text) -> Pup err ann (a -> r) r a Source #

(MonadParsec s m1, MonadParsec s m2) => MonadParsec s (m1 :*: m2) Source # 
Instance details

Defined in Text.Pup.Backend.Megaparsec

Methods

try :: (m1 :*: m2) r r' a -> (m1 :*: m2) r r' a Source #

token :: (Token s -> Maybe a) -> Set (ErrorItem (Token s)) -> (a -> Token s) -> (m1 :*: m2) (a -> r) r a Source #

Reexports