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
- Host: GitHub
- URL: https://github.com/rust-bakery/nom-peg
- Owner: rust-bakery
- License: gpl-3.0
- Created: 2019-04-10T07:27:35.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2019-09-02T18:33:37.000Z (almost 7 years ago)
- Last Synced: 2024-05-09T18:54:07.711Z (about 2 years ago)
- Language: Rust
- Homepage:
- Size: 34.2 KB
- Stars: 67
- Watchers: 10
- Forks: 6
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
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)));
```