Extension of nom to apply "Packrat Parsing".
nom must be 5.0.0 or later. nom-packrat can be applied to function-style parser only.
Cargo.toml
[dependencies]
nom-packrat = "0.7.0"
```rust use nom::character::complete::char; use nom::IResult; use nompackrat::{init, packratparser, storage};
// Declare storage used by packrat_parser storage!(String);
// Apply packrat_parser by custom attribute
pub fn parser(s: &str) -> IResult<&str, String> { let (s, x) = char('a')(s)?; Ok((s, x.to_string())) }
fn main() { let input = "a";
// Initialize before parsing
init!();
let result = parser(input);
println!("{:?}", result);
} ```
<S> ::= <T> + <S> | <T> - <S> | <T>
<T> ::= ( <S> ) | a
The following 8 patterns. The first pattern is named as "pair 0" and the last is "pair 7".
a
(a)
((a))
(((a)))
((((a))))
(((((a)))))
((((((a))))))
(((((((a)))))))
#[packrat_parser]
<T>
with #[packrat_parser]
This is an edge case. The execution time of the original parser increases exponentially. By packrat pasring, the time becomes linear. Instead packrat parsers consume more memory than the original parser.
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.