8 releases
Uses old Rust 2015
0.0.8 | Feb 5, 2016 |
---|---|
0.0.7 | Feb 4, 2016 |
0.0.2 | Jan 30, 2016 |
#324 in Parser tooling
26 downloads per month
76KB
1K
SLoC
parsimonious: a parser combinator library for Rust
The goal of this library is to provide parser combinators that:
- are optimized for LL(1) grammars,
- support streaming input,
- do as little buffering or copying as possible, and
- do as little dynamic method dispatch as possible.
It is based on:
- Monadic Parsing in Haskell by G. Hutton and E. Meijer, JFP 8(4) pp. 437-444,
- Nom, eating data byte by byte by G. Couprie.
Example
extern crate parsimonious;
use parsimonious::{character,Parser,Uncommitted,Committed,Stateful};
use parsimonious::ParseResult::{Done,Continue};
#[allow(non_snake_case)]
fn main() {
// A sequence of alphanumerics, saved in a string buffer
let ALPHANUMERIC = character(char::is_alphanumeric);
let ALPHANUMERICS = ALPHANUMERIC.star(String::new);
// If you provide complete input to the parser, you'll get back a Done response:
match ALPHANUMERICS.init().parse("abc123!") {
Done("!",result) => assert_eq!(result, "abc123"),
_ => panic!("Can't happen."),
}
// If you provide incomplete input to the parser, you'll get back a Continue response:
match ALPHANUMERICS.init().parse("abc") {
Continue("",parsing) => match parsing.parse("123!") {
Done("!",result) => assert_eq!(result, "abc123"),
_ => panic!("Can't happen."),
},
_ => panic!("Can't happen."),
}
}
Example tested with Skeptic.
No runtime deps
~150KB