3 releases

new 0.0.1 Jan 20, 2025
0.0.0 Mar 27, 2024
0.0.0-prealpha0 May 3, 2024

#4 in #pest3

Download history 1/week @ 2024-12-04 3/week @ 2024-12-11 74/week @ 2025-01-15

74 downloads per month
Used in pest3

MIT/Apache

16KB

Derive macros implemented with [pest3_generator].

Code Generation

Meta Rules

Rules can have several arguments.

Definitions of these rules can use these arguments, and these rules will be mapped to a struct in Rust using generics.

use pest3_derive::Parser;
use pest3_core::typed::TypedNode;

#[derive(Parser)]
#[grammar_inline = r#"
  pair(a, b) = a - " "* - ":" - " "* - b
  string     = "\"" - ('a'..'z' | 'A'..'Z' | '0'..'9')* - "\""
  main       = pair(string, string)
"#]
struct Parser;

fn main() -> anyhow::Result<()> {
  use rules::*;
  pair::<string, string>::check(r#""a": "b""#)?;
  Ok(())
}

Once called with some exact parameters, these arguments are replaced directly as a whole.

In the example above, pair(string, string) has the same structure with string - " "* - ":" - " "* - string.

But there are some restrictions on meta rules:

  • All arguments must be used. I think there is no reason in pest for one to define an argument that won't be used, at least for now.

And later we may support constant arguments just like the built-in rule pest::stack::peek.

Dependencies

~4.5MB
~84K SLoC