This is a simple parser generator based on the Parsing Expression Grammar formalism.
Add to your Cargo.toml:
[dependencies]
peg = "~0.1.0"
Add to your crate root: ```
```
Use peg_file! modname("mygrammarfile.rustpeg");
to include the grammar from an external file. The macro expands into a module called modname
with functions corresponding to the #[pub]
rules in your grammar.
Or, use
peg! modname(r#"
// grammar rules here
"#);`
to embed a short PEG grammar inline in your Rust source file. Example.
Run peg input_file.rustpeg
to compile a grammar and generate Rust code on stdout.
```
rule_name -> type = expression ```
If a rule is marked with #[pub]
, the generated module has a public function that begins parsing at that rule.
.
- match any single character"literal"
- match a literal string[a-z]
- match a single character from a set[^a-z]
- match a single character not in a setrule
- match a production defined elsewhere in the grammar and return its resultexpression*
- Match zero or more repetitions of expression
and return the results as a Vec
expression+
- Match one or more repetitions of expression
and return the results as a Vec
expression?
- Match one or zero repetitions of expression
. Returns an Option
&expression
- Match only if expression
matches at this position, without consuming any characters!expression
- Match only if expression
does not match at this position, without consuming any charactersexpression ** delim
- Match zero or more repetitions of expression
delimited with delim
and return the results as a Vec
expression ++ delim
- Match one or more repetitions of expression
delimited with delim
and return the results as a Vec
e1 / e2 / e3
- Try to match e1. If the match succeeds, return its result, otherwise try e2, and so on.e1 e2 e3
- Match expressions in sequence
a:e1 b:e2 c:e3 { rust }
- Match e1, e2, e3 in sequence. If they match successfully, run the Rust code in the action and return its result. The variables before the colons in the preceding sequence are bound to the results of the corresponding expressionsMatch actions can extract data from the match using these variables:
&str
slice. Examples:
name -> String
= [a-zA-Z0-9_]+ { match_str.to_string() }
number -> int
= [0-9]+ { from_str::<uint>(match_str).unwrap() }