Crate nom_rule

source ·
Expand description

A procedural macro crate for writing nom parsers using a grammar-like syntax.

The nom-rule crate provides the rule! macro, which allows you to define parsers in a DSL similar to grammar rules. This improves readability and maintainability.

§Syntax

The macro follows these rules:

SyntaxDescriptionExpanded toOperator Precedence
TOKENMatches a token by kind.match_token(TOKEN)-
"("Matches a token by its text.match_text("(")-
#fn_nameCalls an external nom parser function fn_name.fn_name-
#fn_name(a, b, c)Calls an external nom parser function fn_name with arguments.fn_name(a, b, c)-
a ~ b ~ cSequences parsers a, b, and c.nom::sequence::tuple((a, b, c))3 (Left Associative)
a+One or more repetitions.nom::multi::many1(a)4 (Postfix)
a*Zero or more repetitions.nom::multi::many0(a)4 (Postfix)
a?Optional parser.nom::combinator::opt(a)4 (Postfix)
a | b | cChoice between parsers a, b, and c.nom::branch::alt((a, b, c))1 (Left Associative)
&aPeeks at parser a without consuming input.nom::combinator::peek(a)5 (Prefix)
!aNegative lookahead for parser a.nom::combinator::not(a)5 (Prefix)
^aCuts the parser a.nom::combinator::cut(a)5 (Prefix)
... : "description"Adds a context description for error reporting.nom::error::context("description", a)2 (Postfix)

§Example

use nom_rule::rule;

// Define your match functions
fn match_text<'a>(text: &'a str) -> impl FnMut(Input<'a>) -> IResult<Input<'a>, &'a Token<'a>> {
    // Implementation
}

fn match_token<'a>(kind: TokenKind) -> impl FnMut(Input<'a>) -> IResult<Input<'a>, &'a Token<'a>> {
    // Implementation
}

fn ident<'a>(input: Input<'a>) -> IResult<Input<'a>, &str> {
    // Implementation
}

// Use the `rule!` macro
let mut parser = rule!(
    CREATE ~ TABLE ~ #ident ~ ^"(" ~ (#ident ~ #ident ~ ","?)* ~ ")" ~ ";"
    : "CREATE TABLE statement"
);

Macros§

  • A procedural macro for writing nom parsers using a grammar-like syntax.