parser-combinators 
An implementation of parser combinators for Rust, inspired by the Haskell library Parsec. As in Parsec the parsers are LL(1) by default but they can opt-in to arbitrary lookahed using the try combinator.
A parser combinators is, broadly speaking, a function which takes several parsers as arguments and returns a new parser, created by combining those parsers. For instance, the many parser takes one parser, p, as input and returns a new parser which applies p zero or more times.
The library is mostly stable but a few parts of the internals may still change. If you end up trying it I welcome any feedback from your experience with it.
##Example
extern crate parser_combinators;
use ;
use letter;
let result = many.parse;
assert_eq!;
Links
Extra
There is an additional crate which has parsers to lex and parse programming languages in parser-combinators-language.
Breaking changes
Here is a list containing most of the breaking changes in older versions of parser-combinators.
0.7.0
Stream::unconschanged its signature to allow it to return errors. ReturnError::end_of_input()instead of()if you implementedStream.
0.6.0
- Addition of
Parser::parse_lazy, should not break anything but I can't say for certain.
0.5.0
any_char->any,uncons_char->uncons- Introduction of the
Positionertrait which needs to be implemented on an custom token types. satisfyis moved to thecombinatorsmodule and made generic, might cause type inference issues.
0.4.0
any_charis no longer a free function but returns a parser when called as all parser functions (and its calledanyafter 0.5.0)Cowis replaced byInfoin the error messages.
0.3.2 / 0.3.0
- Added variant to
Errorwhich can hold any kind of::std::error::Error choice_vecandchoice_sliceis replaced by justchoice
0.2.6
- Iterators cannot directly be used as streams but must be wrapped using
from_iterfunction
If you have trouble updating to a newer version feel free to open an issue and I can take a look.