Lightweight parser combinator library for Idris, inspired by Parsec.
Module overview:
Lightyear.Core
: central definitions + instancesLightyear.Errmsg
: error message formatting, mainly internal libraryLightyear.Combinators
: generic combinators likemany
orsepBy
Lightyear.Char
: char-bound parsers likechar
orspace
Lightyear.Strings
: string-bound parsers likestrings
orlexeme
This package is used (almost) the same way as Parsec, except for one difference: backtracking.
-
Parsec combinators won't backtrack if a branch of
<|>
has consumed any input, hence Parsec parsers require an explicittry
. -
Lightyear parsers are backtrack-by-default and there is the
commitTo
combinator that makes the parser commit to that branch.
In other words, the following two pieces of code are equivalent (using illustrative combinator names):
Parsec:
elem :: Parser Int
elem = (try (string "0x") >> hexNumber) <|> decNumber
Lightyear:
elem : Parser Int
elem = (string "0x" $> commitTo hexNumber) <|> decNumber
-- which may be abbreviated as:
-- = (string "0x" >! hexNumber) <|> decNumber
After reading the prefix 0x
, both parsers commit to reading a hexadecimal number
or nothing at all — Parsec does this automatically, Lightyear uses the commitTo
combinator
for this purpose.
On the other hand, Parsec requires the string "0x"
to be wrapped in try
because
if we are reading 0123
, we definitely don't want to commit to the left branch
upon seeing the leading 0
.
For convenience, commitTo
is merged in monadic and applicative operators,
yielding the operators >!=
, >!
, <$!>
, <$!
, and $!>
.
The !
in the names is inspired by the notation used for cuts in Prolog.
A parser that uses commitment might look like this (notice the leading
char '@'
that leads to commitment):
entry : Parser Entry
entry = char '@' >! do
typ <- pack <@> some (satisfy (/= '{'))
token "{"
ident <- pack <@> some (satisfy (/= ','))
token ","
items <- item `sepBy` comma
token "}"
return $ En typ ident items
Lightyear is used to parse BibTeX in bibdris.
$ make clean
$ make test
$ make install