Releases: kevinmehall/rust-peg
Releases · kevinmehall/rust-peg
0.6.0
Major improvements
- Replaced build script integration and nightly-only syntax extension with a procedural macro that works on stable Rust. This means that errors both in the PEG grammar and the Rust code embedded from it are reported with source position by rustc. It even works with RLS!
- Add the ability to parse non-
strinput by implementing traits. It comes with an implementation for[T](including[u8]), but you can define the traits for your own types. In fact, the rust-peg grammar is parsed with rust-peg via an implementation for token trees fromproc-macro2. - Add
precedence!{}block for adding a precedence-climbing expression parser integrated with the surrounding PEG source. - Report errors in left-recursive rules that would cause infinte loops.
- Allow rules to accept value and type parameters, including passing closures to replace the
templatesyntax. - Significant performance improvement for input that parses successfully by deferring error handling until parsing has failed.
Upgrade from 0.5.x
- Remove
peg = "0.5"from[build_dependencies]inCargo.toml, and addpeg = "0.6"under[dependencies]. - If nothing else is in
build.rs, delete it and removebuild = "build.rs"fromCargo.toml - If using the 2015 edition of Rust, add
extern crate peg;to your crate root. - Move your grammar from a separate
.rustpegfile into a Rust source file. Remove the
mod somename { include!(...) }and replace it with:
peg::parser!{grammar somename() for str {
// grammar goes here
}}
- Add the
rulekeyword and parentheses to rule declarations.foo = ...becomesrule foo() = ...pub bar -> X = ...becomespub rule bar() -> X = ....
- Add parentheses to expressions that invoke another rule.
name:identbecomesname:ident().
- Replace the character set syntax with the pattern matching syntax.
[a-zA-Z]becomes['a'..='z' | 'A'..='Z'].[^X]becomes(!['X'][_])-- the inverted character set syntax was removed, but can be substituted with a negative lookahead followed by[_]to match and consume the character.
- If your grammar used templates, replace them with rule arguments.
- Replace
.with[_].#positionwithposition!()#quiet<e>withquiet!{e}#expected("foo")withexpected!("foo").
0.5.7
- Use
?instead oftry!()for compatibility with Rust 2018. - Add support for
dynandimplin rule return types - Fix peg-syntax-ext for changes in Rust nightly (0.6 will replace peg-syntax-ext with a proc-macro for stable Rust)
0.5.6 (peg-syntax-ext)
Fix for libsyntax OneVector rename
0.5.5 (peg-syntax-ext)
Fix for FileName change in libsyntax API
0.5.4
0.5.3
0.5.2
New Features
- Context arguments for passing variables to all rules
Fixes
- [peg-syntax-ext] Update for rust-nightly-2017-04-28
0.5.1
0.5.0
Changes
- Change
#[pub] rule_name = ...syntax topub rule_name = .... The old syntax is retained for backwards compatibility, butpubis now a reserved keyword and cannot be used as an identifier.
New features
- Add rule templates
- Add experimental
#infixsyntax for parsing binary infix expressions by precedence climbing. - Allow delimited-repeat with range bounds
**<n,m>. - Add
x*<{count}>syntax for a repeat bounded by a Rust expression. - Add
#quiet<e>and#expected("msg")expressions for improved error reporting. - Allow
asinusestatements to match Rust syntax.
Fixes
- Fix a bug in error reporting of
&and!expressions. - Avoid type errors if a rule returns a result, but the result is not used.
- Error when using a nonexistent rule, rather than generating Rust code that doesn't compile.
0.4.0
Migrating from 0.3
- If you were using the syntax extension, replace
peg = "0.3.0"withpeg-syntax-ext = "0.4.0"in yourCargo.toml's[dependencies]section. The library name in#![plugin(peg_syntax_ext)]remains the same. Consider moving to the build script for compatibility with Rust stable. - The
match_strvariable has been removed in favor of the$(expr)syntax. Replace[0-9]+ { match_str.parse().unwrap() }withn:$([0-9]+) { n.parse().unwrap() } start_posandposvariables have been removed. Use#positionas an expression, which returns ausizeoffset into the source string. Replacefoo:x { Span(start_pos, pos, foo) }withstart:#position foo:x end:#position { Span(start, end, foo) }- The
\u2029unicode hex escape syntax has been removed, as it has long-since been removed from Rust. Use\u{2029}instead. - The previously-undocumented
foo{x,y}bounded-repeat syntax was replaced withfoo*<x,y>to avoid a grammar ambiguity (#74).