pest. Elegant, efficient grammars

[Build Status] (https://travis-ci.org/dragostis/pest) [![Coverage Status] (https://coveralls.io/repos/github/dragostis/pest/badge.svg?branch=master)] (https://coveralls.io/github/dragostis/pest?branch=master) [Cargo Crate] (https://crates.io/crates/pest)

pest is a PEG parser generator with simplicity and speed in mind.

Documentation

Elegant

pest uses PEG syntax to enable expressive grammar creation.

```rust impl_rdp! { grammar! { expression = _{ paren ~ expression? } paren = { ["("] ~ expression? ~ [")"] } } }

let mut parser = Rdp::new(StringInput::new("(()((())())()")));

assert!(parser.expression()); assert!(parser.end()); ```

Fast

pest generates a fast parser at compile time through the use of macros, without forcing you to use nightly. Yes, it works on stable (1.9.0+).

| Parser generator | Time to parse 272.5 KB of JSON | pest speedup | |------------------|--------------------------------|-------------:| | ANTRL 4 | 153,000 μs (+/- 15,000) | 48.12x | | Bison + Flex | 8,761.9 μs (+/- 697) | 2.76x | | pest | 3,178.9 μs (+/- 40.6) | 1.00x |

Tests have been run on an Intel Q8200, 4GB DDR2, Linux 4.6.2 as follows:

Features

Comparison

Short comparison with other parsing tools. Please take into consideration that pest is the youngest among them, but is continuously improving.

| | nom | LALRPOP | pest | |-----------------|----------------------|-----------------|--------------------| | type | combinator | generator | generator (macros) | | goals | speed, extensibility | usability | simplicity, speed | | grammar | specialized | LR(1) / LALR(1) | PEG | | steps | 2 | 2 | 1 | | code | separate / mixed | mixed | separate | | extensibility | great | great | little | | great for | binary formats | any text | languages | | error reporting | yes | yes | yes | | LOCs | ~10K | ~500K | ~6K |

Roadmap