1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//! rcombinators is a parser combinator library without special magic. It aims to be both easy to
//! use and reasonably fast, without using too much special syntax or macros.
//!
//! You will notice two kinds of parsers that however differ only in minor aspects:
//!
//! * Ones starting with a capital letter are `struct`s (such as `Int`, `Sequence`). You can
//! create them using `ParserName::new()`, or a specialized constructor method.
//! * Ones starting with a lower case letter (and in snake case, such as `string_of`). Those are
//! functions returning `Parser` objects combined from one or more elementary parsers.
//!
//! The resulting objects implementing the `Parser` trait are identical to use.
//!
//! Note that not all primitives and combinators are exported at the crate level! Only "important"
//! ones are.
//!
//! Here's a short example of how to use it:
//!
//! ```
//! use rcombinators::combinators;
//! use rcombinators::primitives;
//! use rcombinators::ParseState;
//! use rcombinators::Parser;
//!
//! // Goal: Parse the string between the parentheses, and then the float.
//! let mut ps = ParseState::new("(a1b3c4) -1.25e-1");
//!
//! let mut some_string = combinators::Alternative::new(
//! (primitives::StringParser::new("xyz"),
//! primitives::string_of("abcde12345",
//! combinators::RepeatSpec::Min(1))));
//! let mut in_parens = combinators::Sequence::new(
//! (primitives::StringParser::new("("),
//! some_string,
//! primitives::StringParser::new(")")));
//! assert_eq!(Ok(
//! ("(".to_string(),
//! "a1b3c4".to_string(),
//! ")".to_string())), in_parens.parse(&mut ps));
//!
//! // You can continue using a ParseState, for example when implementing your own parsers.
//! let _ = primitives::whitespace().parse(&mut ps);
//! // Parsers returned by functions such as float() should be cached when used more frequently.
//! // This saves time due to not needing to construct the parsers repeatedly.
//! assert_eq!(Ok(-0.125), primitives::float().parse(&mut ps));
//! ```
extern crate time_test;
pub use ;
pub use ;
pub use ;
pub use ParseState;