https://github.com/dalance/nom-packrat
Extension of nom to apply "Packrat Parsing"
https://github.com/dalance/nom-packrat
Last synced: 7 months ago
JSON representation
Extension of nom to apply "Packrat Parsing"
- Host: GitHub
- URL: https://github.com/dalance/nom-packrat
- Owner: dalance
- License: apache-2.0
- Created: 2019-07-22T02:53:09.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2025-02-03T20:14:31.000Z (over 1 year ago)
- Last Synced: 2025-03-31T18:22:04.607Z (about 1 year ago)
- Language: Rust
- Size: 73.2 KB
- Stars: 21
- Watchers: 2
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
# nom-packrat
Extension of [nom](https://github.com/Geal/nom) to apply ["Packrat Parsing"](https://en.wikipedia.org/wiki/Parsing_expression_grammar#Implementing_parsers_from_parsing_expression_grammars).
[](https://github.com/dalance/nom-packrat/actions)
[](https://crates.io/crates/nom-packrat)
[](https://docs.rs/nom-packrat)
## Requirement
nom must be 5.0.0 or later.
nom-packrat can be applied to function-style parser only.
## Usage
```Cargo.toml
[dependencies]
nom-packrat = "0.7.0"
```
## Example
```rust
use nom::character::complete::char;
use nom::IResult;
use nom_packrat::{init, packrat_parser, storage};
// Declare storage used by packrat_parser
storage!(String);
// Apply packrat_parser by custom attribute
#[packrat_parser]
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);
}
```
## Performance
### Syntax
```
::= + | - |
::= ( ) | a
```
### Input
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)))))))
```
### Result
* original : the original nom parser
* packrat : all parsers with `#[packrat_parser]`
* packrat_opt: only `` 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.


## License
Licensed under either of
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
### Contribution
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.