Module Data.NanoParsec

Small parser, inspired by Parsec, but much less versatile

Imports

Table of Content

Definitions

type Parser s t r = ParserT s t Identity r

Parser Monad

 Parser s t r

is the type of parsers that reads tokens of type t from a stream s and returns either an error message string or a result r.

This does work very much like a combination of State and Either monad, in that the monad bind operations (>>) and (>>=) stop going further if the left hand side signalled an error.

See also ParserT

data ParserT s t m r

Parser Monad Transformer

 ParserT s t m r

is the type of parsers that reads tokens of type t from a stream s t and returns either an error message string or a result r in monad m.

Works in principle like a combination of StateT and EitherT, where the state is the current input to get parsed, and the bind operations will stop on the first Either.Left result, which signals a syntax error.

ParserT is also an instance of MonadAlt. The operations MonadAlt.<+> and Alt.<|> can be used to implement choice, i.e. they allow to continue on failure.

The input for a ParserT must be something that is an instance of ListView. Ordinary lists, Strings, StringIterator and ArrayIterator are such types. The parser combinators use only the ListView.uncons and ListEmpty.null operations.

Constructors

private P {run ∷ s t → m ((String | r), s t)}

Member Functions

runParserT δ β α γ → δ β → α ((String | γ), δ β)

access field run

getPosMonad β ⇒ ParserT α γ β (α γ)

Remember the current state of the input stream.

getPos always succeeds.

putPosMonad β ⇒ α γ → ParserT α γ β ()

Resume parsing with the given input stream.

putPos always succeeds.

modifyPosMonad α ⇒ (γ β→γ β) → ParserT γ β α ()
failureMonad α ⇒ StringParserT δ γ α β

fail with given error message

runidParser γ β α → γ β → ((String | α), γ β)

run a Identity parser

parseFunctor β ⇒ ParserT α γ β δ → α γ → β (String | δ)

run a Parser, return just the result/error

parseTest ∷ (Show r, Show t, ListView s) ⇒ Parser s t r → s t → IO ()

run a Parser on some input and report

reporterror ∷ (ListSource α, Show β) ⇒ α β → StringString
labelMonad δ ⇒ StringParserT α γ δ βParserT α γ δ β

Causes the error message to be msg when p fails.

The error will be reported at the position where p was attempted, not necessarily at the position where p failed:

 Parser.run (letter >> digit) "a?"
 unexpected token, found ?
 Parser.run (label "id expected" $ letter >> digit) "a?"
 id expected, found a?
<?>Monad β ⇒ ParserT α γ β δStringParserT α γ β δ
infix  14
 p <?> msg

Causes the error message to be msg when p fails.

The error will be reported at the position where p failed.

expect ∷ (Show β, Monad α, Eq β, ListView γ) ⇒ β → ParserT γ β α β
 expect t

This parser succeeds if the input is not empty and the head of the input equals t.

eos ∷ (Monad γ, ListView β) ⇒ ParserT β α γ ()

The eos parser succeeds if the input is empty.

satisfy ∷ (ListView s, Monad m) ⇒ (t → Bool) → ParserT s t m t
 satisfy property

Succeeds if there is a next token t and property t is true.

exceptWhen ∷ (Monad β, ListView α) ⇒ (γ→Bool) → ParserT α γ β ()
 exceptWhen prop

Fails if and only if there is a next token t and prop t is true.

Succeeds on end of stream or when the token does not satisfy the property.

In other words, exceptWhen p succeeds if and only if satisfy p fails.

pany ∷ (ListView α, Monad β) ⇒ ParserT α γ β γ
 pany

Fails if and only if eos succeeds, otherwise returns the next token.

symbol ∷ (ListView γ, Monad α) ⇒ ParserT γ Char α βParserT γ Char α β
 symbol p

Is the same parser as p, but skips spaces afterwards

space ∷ (ListView α, Monad β) ⇒ ParserT α Char β Char
digit ∷ (ListView α, Monad β) ⇒ ParserT α Char β Char
letter ∷ (ListView α, Monad β) ⇒ ParserT α Char β Char
uppercase ∷ (ListView α, Monad β) ⇒ ParserT α Char β Char
spaces ∷ (ListView α, Monad β) ⇒ ParserT α Char β ()
stringMonad m ⇒ StringParserT StringJ Char m String
matchMonad α ⇒ RegexParserT StringJ Char α Matcher

This parser succeeds if the pattern matches the beginning of the string.

For efficiency reasons, the pattern should start with ^

optionalMonad m ⇒ ParserT s t m r → ParserT s t m (Maybe r)

The optional parser always succeeds and returns its result wrapped in Maybe

manyMonad α ⇒ ParserT δ β α γ → ParserT δ β α [γ]
 many p

Collects as many p as possible and returns the results in a list.

Succeeds also when p fails the first time, in that case the result is an empty list.

Must not be applied to a parser that always succeeds!

someMonad α ⇒ ParserT δ β α γParserT δ β α [γ]
 some p

Like many, except there must be at least one p

Must not be applied to a parser that always succeeds!

many1Monad α ⇒ ParserT δ β α γParserT δ β α [γ]

Alias for some

skipMonad α ⇒ ParserT β δ α γ → ParserT β δ α ()
 skip p

equivalent to

 many p >> return ()

but faster, because it does not build up lists.

Must not be applied to a parser that always succeeds!

manyWhile ∷ (ListView β, Monad γ) ⇒ (α→Bool) → ParserT β α γ [α]
 manyWhile p

Collect tokens as long as they satisfy p

skipWhile ∷ (ListView α, Monad β) ⇒ (γ→Bool) → ParserT α γ β ()
 skipWhile p

Skip tokens as long as they satisfy predicate p.

Beware of negative predicates like

 skipWhile (!= 'a')

This will loop forever if there is no 'a' in the input stream. Instead use

 skipUntil (== 'a')
skipUntil ∷ (ListView α, Monad β) ⇒ (γ→Bool) → ParserT α γ β ()
 skipUntil p

Skip tokens as long as they do not satisfy p

When this succeeds, the next token will satisfy p or the stream is exhausted.

condBind α ⇒ ParserT γ β α ε → ParserT γ β α δ → ParserT γ β α δ → ParserT γ β α δ
 cond pcond pthen pelse

if pcond succeeds, then pthen is run, else pelse

To both pthen and pelse it will appear as if pcond didn't consume any tokens.

selectBind δ ⇒ [(ParserT β α δ γ, ParserT β α δ ε)]ParserT β α δ ε → ParserT β α δ ε
 select [(if1, t1), (if2, t2), ..., (ifn, tn)] e

unfolds as

 cond if1 t1 (cond if2 t2 (... (cond ifn tn e)))    
choicePlus α ⇒ [α β] → α β
 choice ps

Tries the parsers in the list from left to right, until success.

countMonad α ⇒ Int → α β → α [β]
 count n p

Applies p n times and returns a list of the results

betweenMonad γ ⇒ γ β → γ δ → γ α → γ α
 between left right p

Parses left, then p and finally right and returns the result of p

optionMonad δ ⇒ β → ParserT α γ δ βParserT α γ δ β
 option v p

Applies p, and returns v when it fails.

Always succeeds.

sepBy1Monad ε ⇒ ParserT β α ε δParserT β α ε γ → ParserT β α ε [δ]
 p `sepBy1` q

Parses p and many q followed by p

sepByMonad ε ⇒ ParserT δ α ε βParserT δ α ε γ → ParserT δ α ε [β]
 p `sepBy` q

Like sepBy1, but allows zero p elements

endByMonad α ⇒ ParserT γ β α ε → ParserT γ β α δ → ParserT γ β α [ε]
 p `endBy` q

Parses zero or more occurrences of p separated and ended by q

endBy1Monad α ⇒ ParserT δ β α γParserT δ β α ε → ParserT δ β α [γ]
 p `endBy1` q

Parses one or more occurrences of p separated and ended by q

sepEndByMonad β ⇒ ParserT α δ β γParserT α δ β ε → ParserT α δ β [γ]
 p `sepEndBy` q

Parses zero or more occurrences of p, separated and optionally ended by q

sepEndBy1Monad α ⇒ ParserT δ β α γParserT δ β α ε → ParserT δ β α [γ]
 p `sepEndBy1` q

Parses one or more occurrences of p, separated and optionally ended by q

Instances

instance MonadAlt Monad m ⇒ ParserT s t m

Member Functions

*>Monad δ ⇒ ParserT β α δ γParserT β α δ ε → ParserT β α δ ε
infixl  4
<*Monad β ⇒ ParserT α δ β γParserT α δ β ε → ParserT α δ β γ
infixl  4
<*>Monad β ⇒ ParserT α γ β (ε→δ) → ParserT α γ β ε → ParserT α γ β δ
infixl  4

inherited from Monad.<*>

<+>Monad α ⇒ ParserT δ β α γParserT δ β α γ → ParserT δ β α γ
infixr  13
 p <+> q

The result is that of the first parser, if it succeeds, otherwise that of the second one, which is applied to the input left over by p

<|>Monad β ⇒ ParserT α γ β δParserT α γ β δ → ParserT α γ β δ
infixl  3
 p <|> q

The result is that of the first parser, if it succeeds, otherwise that of the second one. Note that q is run on the same input as p, even if p already consumed something.

 expect 'c' <|> expect 'd'

would succeed if the input starts with 'c' or 'd'.

>>Monad β ⇒ ParserT α γ β εParserT α γ β δ → ParserT α γ β δ
infixl  3

inherited from Monad.>>

>>=Monad α ⇒ ParserT ε β α δ → (δ → ParserT ε β α γ) → ParserT ε β α γ
infixl  3
 p >>= (r -> q)
 p >> q

If p succeeds, the overall result is that of q Otherwise, the overall result is failure.

Could be read as p followed by q.

fmapMonad ε ⇒ (β → α) → ParserT δ γ ε βParserT δ γ ε α
infixl  4

inherited from Monad.fmap

joinMonad α ⇒ ParserT γ β α (ParserT γ β α δ)ParserT γ β α δ

inherited from Monad.join

pureMonad γ ⇒ β → ParserT δ α γ β

inherited from Monad.pure

pzeroMonad β ⇒ ParserT α γ β δ

generic failure

returnMonad β ⇒ γ → ParserT α δ β γ

generic success

instance MonadIO MonadIO m ⇒ ParserT s t m

Member Functions

liftIOMonadIO β ⇒ IO γ → ParserT α δ β γ
instance MonadTrans ParserT s t

Member Functions

liftMonad α ⇒ α β → ParserT δ γ α β

Functions and Values by Type

α → Bool

ParserT.has$run

Monad m ⇒ StringParserT StringJ Char m String

string

Monad α ⇒ RegexParserT StringJ Char α Matcher

match

(ListSource α, Show β) ⇒ α β → StringString

reporterror

Monad α ⇒ Int → α β → α [β]

count

Plus α ⇒ [α β] → α β

choice

(ListView α, Monad β) ⇒ ParserT α Char β ()

spaces

(ListView α, Monad β) ⇒ ParserT α Char β Char

digit, letter, space, uppercase

Parser γ β α → γ β → ((String | α), γ β)

runid

(ListView s, Monad m) ⇒ (t → Bool) → ParserT s t m t

satisfy

(ListView α, Monad β) ⇒ (γ→Bool) → ParserT α γ β ()

skipUntil, skipWhile

(ListView β, Monad γ) ⇒ (α→Bool) → ParserT β α γ [α]

manyWhile

(ListView γ, Monad α) ⇒ ParserT γ Char α β → ParserT γ Char α β

symbol

Monad α ⇒ (γ β→γ β) → ParserT γ β α ()

modifyPos

Monad β ⇒ α γ → ParserT α γ β ()

putPos

(Monad β, ListView α) ⇒ (γ→Bool) → ParserT α γ β ()

exceptWhen

(Show r, Show t, ListView s) ⇒ Parser s t r → s t → IO ()

parseTest

(Show β, Monad α, Eq β, ListView γ) ⇒ β → ParserT γ β α β

expect

(ListView α, Monad β) ⇒ ParserT α γ β γ

pany

Monad β ⇒ ParserT α γ β (α γ)

getPos

(Monad γ, ListView β) ⇒ ParserT β α γ ()

eos

(s t → m ((String | r), s t)) → ParserT s t m r

ParserT.P

ParserT δ β α γ → δ β → α ((String | γ), δ β)

ParserT.run

MonadIO β ⇒ IO γ → ParserT α δ β γ

MonadIO_ParserT.liftIO

Functor β ⇒ ParserT α γ β δ → α γ → β (String | δ)

parse

Monad m ⇒ ParserT s t m r → ParserT s t m (Maybe r)

optional

Monad α ⇒ ParserT β δ α γ → ParserT β δ α ()

skip

Monad α ⇒ ParserT γ β α (ParserT γ β α δ) → ParserT γ β α δ

MonadAlt_ParserT.join

Monad α ⇒ ParserT δ β α γ → ParserT δ β α γ → ParserT δ β α γ

MonadAlt_ParserT.<+>

Monad α ⇒ ParserT δ β α γ → ParserT δ β α [γ]

many, some

Monad α ⇒ StringParserT δ γ α β

failure

Monad α ⇒ α β → ParserT δ γ α β

MonadTrans_ParserT.lift

Monad β ⇒ ParserT α γ β δ → ParserT α γ β δ → ParserT α γ β δ

MonadAlt_ParserT.<|>

Monad β ⇒ ParserT α γ β δ → StringParserT α γ β δ

<?>

Monad β ⇒ γ → ParserT α δ β γ

MonadAlt_ParserT.return

Monad γ ⇒ γ β → γ δ → γ α → γ α

between

Monad γ ⇒ β → ParserT δ α γ β

MonadAlt_ParserT.pure

Monad δ ⇒ StringParserT α γ δ β → ParserT α γ δ β

label

Monad δ ⇒ β → ParserT α γ δ β → ParserT α γ δ β

option

Monad β ⇒ ParserT α γ β δ

MonadAlt_ParserT.pzero

Bind α ⇒ ParserT γ β α ε → ParserT γ β α δ → ParserT γ β α δ → ParserT γ β α δ

cond

Bind δ ⇒ [(ParserT β α δ γ, ParserT β α δ ε)] → ParserT β α δ ε → ParserT β α δ ε

select

Monad α ⇒ ParserT γ β α ε → ParserT γ β α δ → ParserT γ β α [ε]

endBy

Monad α ⇒ ParserT δ β α γ → ParserT δ β α ε → ParserT δ β α [γ]

endBy1, sepEndBy1

Monad α ⇒ ParserT ε β α δ → (δ → ParserT ε β α γ) → ParserT ε β α γ

MonadAlt_ParserT.>>=

Monad β ⇒ ParserT α γ β (ε→δ) → ParserT α γ β ε → ParserT α γ β δ

MonadAlt_ParserT.<*>

Monad β ⇒ ParserT α γ β ε → ParserT α γ β δ → ParserT α γ β δ

MonadAlt_ParserT.>>

Monad β ⇒ ParserT α δ β γ → ParserT α δ β ε → ParserT α δ β [γ]

sepEndBy

Monad β ⇒ ParserT α δ β γ → ParserT α δ β ε → ParserT α δ β γ

MonadAlt_ParserT.<*

Monad δ ⇒ ParserT β α δ γ → ParserT β α δ ε → ParserT β α δ ε

MonadAlt_ParserT.*>

Monad ε ⇒ (β → α) → ParserT δ γ ε β → ParserT δ γ ε α

MonadAlt_ParserT.fmap

Monad ε ⇒ ParserT β α ε δ → ParserT β α ε γ → ParserT β α ε [δ]

sepBy1

Monad ε ⇒ ParserT δ α ε β → ParserT δ α ε γ → ParserT δ α ε [β]

sepBy

ParserT β δ γ α → (ε ζ→η ((String | θ), ε ζ)) → ParserT ε ζ η θ

ParserT.upd$run

ParserT θ α ε ζ → (-> (θ α) (ε ((String | ζ), θ α))→η δ→β ((String | γ), η δ)) → ParserT η δ β γ

ParserT.chg$run

Valid HTML 4.01 Strict