An open API service indexing awesome lists of open source software.

https://github.com/rust-bakery/nom-peg

PEG parser generator built on top of nom
https://github.com/rust-bakery/nom-peg

Last synced: about 1 year ago
JSON representation

PEG parser generator built on top of nom

Awesome Lists containing this project

README

          

# PEG Grammars for Nom

nom-peg is a PEG (Parsing Expression Grammar) parser generator built on top of [nom](https://github.com/Geal/nom), using a syntax that is heavily inspired by [LALRPOP](https://github.com/lalrpop/lalrpop).

Grammars defined with nom-peg can freely be mixed with other nom parsers.

## Example
```rust
let arithmetic = grammar! {
// a grammar can have as many non-terminals as you want, and can return any type
parse: i64 = "="

// alternatives are separated by `|`,
// and the `=> { ... }` syntax is used to manipulate the output of the parser before returning it
term: i64 = "+" => { l + r }
| "-" => { l - r }
| factor

// the `<...>` syntax is used to capture the output of a sub-parser,
// and optionally assign it to a local variable with ``
factor: i64 = "*" => { l * r }
| "/" => { l / r }
| value

value: i64 = ("0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9")+ => { result.join("").parse::().unwrap() }
| "(" ")"
};

// when the grammar is defined you can use any of the non-terminals as parser functions
assert_eq!(arithmetic.parse("123="), Ok(("", 123 as i64)));
assert_eq!(arithmetic.parse("1+1="), Ok(("", 2 as i64)));
assert_eq!(arithmetic.parse("12+(3*7)="), Ok(("", 33 as i64)));
```