Crates.io | parze |
lib.rs | parze |
version | 0.7.3 |
source | src |
created_at | 2019-11-25 00:28:24.036385 |
updated_at | 2019-11-29 23:24:39.01648 |
description | A clean, efficient parser combinator |
homepage | https://www.github.com/zesterer/parze |
repository | https://www.github.com/zesterer/parze |
max_upload_size | |
id | 184081 |
size | 184,532 |
Parze is a clean, efficient parser combinator written in Rust.
A parser capable of parsing all valid Brainfuck code into an AST.
use parze::prelude::*;
#[derive(Clone, Debug, PartialEq)]
enum Instr { Add, Sub, Left, Right, In, Out, Loop(Vec<Instr>) }
parsers! {
bf = {
( '+' -> { Instr::Add }
| '-' -> { Instr::Sub }
| '<' -> { Instr::Left }
| '>' -> { Instr::Right }
| ',' -> { Instr::In }
| '.' -> { Instr::Out }
| '[' -& bf &- ']' => { |i| Instr::Loop(i) }
) *
}
}
no_std
supportParze is fast and lightweight, acting as a bare-bones framework upon which more verbose and interesting parsers can be constructed (see the custom_error
example).
Parze's declaration macro currently requires a nightly Rust compiler to work.
You may use the explicit declaration form (as shown below) with stable by disabling the nightly
feature, however.
This can be done like so in your Cargo.toml
:
[dependencies.parze]
version = "x.y.z"
default-features = false
Here are the results of a JSON parsing test when compared with pom
. More performance metrics to come later.
test parze ... bench: 3,696,323 ns/iter (+/- 358,597)
test pom ... bench: 18,538,775 ns/iter (+/- 1,149,589)
While Parze encourages use of macros for much of its declarative notation, it is possible (and often useful) to make use of the more explicit rust-y notation.
Here is the Brainfuck parser given above, declared in explicit form.
let bf: Parser<_, _> = recursive(|bf| (
sym('+').to(Instr::Add)
.or(sym('-').to(Instr::Sub))
.or(sym('<').to(Instr::Left))
.or(sym('>').to(Instr::Right))
.or(sym(',').to(Instr::In))
.or(sym('.').to(Instr::Out))
.or(sym('[').delimiter_for(bf).delimited_by(sym(']')).map(|i| Instr::Loop(i)))
).repeat(..));
Parze is distributed under either of:
Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at the disgression of the user.