Skip to content
PEG parser generator built on top of nom
Branch: master
Clone or download
Latest commit eb05b53 Apr 12, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src Changed code around so nom-peg is a separate crate now Apr 10, 2019
tests Changed code around so nom-peg is a separate crate now Apr 10, 2019
.gitignore Changed code around so nom-peg is a separate crate now Apr 10, 2019
Cargo.toml Slight mistake in Cargo.toml Apr 10, 2019
LICENSE
README.md Update README.md Apr 12, 2019

README.md

PEG Grammars for Nom

nom-peg is a PEG (Parsing Expression Grammar) parser generator built on top of nom, using a syntax that is heavily inspired by LALRPOP.

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

Example

let arithmetic = grammar! {
    // a grammar can have as many non-terminals as you want, and can return any type
    parse: i64 = <term> "="

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

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

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

// 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)));
You can’t perform that action at this time.