Parsing Expression Grammars in Rust

Documentation | Release Notes

rust-peg is a simple yet flexible parser generator based on the Parsing Expression Grammar formalism. It provides a Rust macro that builds a recursive descent parser from a concise definition of the grammar.

Features

Example

```rust use peg::parser;

parser!{ grammar list_parser() for str { rule number() -> u32 = n:$(['0'..='9']+) { n.parse().unwrap() }

pub rule list() -> Vec<u32>
  = "[" l:number() ** "," "]" { l }

} }

pub fn main() { asserteq!(listparser::list("[1,1,2,3,5,8]"), Ok(vec![1, 1, 2, 3, 5, 8])); } ```

See the tests for more examples
Grammar rule syntax reference in rustdoc

Comparison with similar parser generators

| crate | parser type | action code | integration | input type | precedence climbing | parameterizd rules | streaming input | |----------- |------------- |------------- |-------------------- |------------------------ |--------------------- |-------------------- |----------------- | | peg | PEG | in grammar | proc macro (block) | &str, &[T], custom | Yes | Yes | No | | [pest] | PEG | external | proc macro (file) | &str | Yes | No | No | | [nom] | combinators | in source | library | &[u8], custom | No | Yes | Yes | | [lalrpop] | LR(1) | in grammar | build script | &str | No | Yes | No |