Parsing Expression Grammars in Rust

This is a simple parser generator based on the Parsing Expression Grammar formalism.

Usage

rust-peg relies on the unstable libsyntax crate, and only works on Nightly builds of Rust. However, generated parsers are compatible with 1.0 stable, so you can generate stable code by using the peg command line tool described below.

As a syntax extension

Add to your Cargo.toml:

[dependencies] peg = "0.3.0"

Add to your crate root: ```

![feature(plugin)]

![plugin(pegsyntaxext)]

```

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.

As a standalone code generator

Run peg input_file.rustpeg to compile a grammar and generate Rust code on stdout. This code works with stable Rust.

Grammar Syntax

use super::name;

The grammar may begin with a series of use declarations, just like in Rust, which are included in the generated module. Since the grammar is in its own module, you must use super::StructName; to access a structure from the parent module.

```

[pub]

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 actions can extract data from the match using these variables:

name -> String = [a-zA-Z0-9_]+ { match_str.to_string() }

number -> int = [0-9]+ { from_str::<u64>(match_str).unwrap() }

Tracing

If you pass the peg/trace feature to Cargo when building your project, a trace of the parsing will be output to stdout when running the binary. For example, $ cargo run --features peg/trace ... [PEG_TRACE] Matched rule type at 8:5 [PEG_TRACE] Attempting to match rule ident at 8:12 [PEG_TRACE] Attempting to match rule letter at 8:12 [PEG_TRACE] Failed to match rule letter at 8:12 ...