7 unstable releases
0.3.0 | Apr 24, 2023 |
---|---|
0.2.1 | Mar 9, 2022 |
0.2.0 | Feb 10, 2022 |
0.1.2 | Jan 11, 2022 |
0.0.0 | Nov 5, 2021 |
#1760 in Parser implementations
335,013 downloads per month
Used in 2 crates
145KB
3K
SLoC
Cucumber Expressions for Rust
Rust implementation of Cucumber Expressions.
This crate provides AST parser, and Regex
expansion of Cucumber Expressions.
# // `Regex` expansion requires `into-regex` feature.
# #[cfg(feature = "into-regex")] {
use cucumber_expressions::Expression;
let re = Expression::regex("I have {int} cucumbers in my belly").unwrap();
let caps = re.captures("I have 42 cucumbers in my belly").unwrap();
assert_eq!(&caps[0], "I have 42 cucumbers in my belly");
assert_eq!(&caps[1], "42");
# }
Cargo features
into-regex
: Enables expansion intoRegex
.
Grammar
This implementation follows a context-free grammar, which isn't yet merged. Original grammar is impossible to follow while creating a performant parser, as it consists errors and describes not an exact Cucumber Expressions language, but rather some superset language, while being also context-sensitive. In case you've found some inconsistencies between this implementation and the ones in other languages, please file an issue!
EBNF spec of the current context-free grammar implemented by this crate:
expression = single-expression*
single-expression = alternation
| optional
| parameter
| text-without-whitespace+
| whitespace+
text-without-whitespace = (- (text-to-escape | whitespace))
| ('\', text-to-escape)
text-to-escape = '(' | '{' | '/' | '\'
alternation = single-alternation, (`/`, single-alternation)+
single-alternation = ((text-in-alternative+, optional*)
| (optional+, text-in-alternative+))+
text-in-alternative = (- alternative-to-escape)
| ('\', alternative-to-escape)
alternative-to-escape = whitespace | '(' | '{' | '/' | '\'
whitespace = ' '
optional = '(' text-in-optional+ ')'
text-in-optional = (- optional-to-escape) | ('\', optional-to-escape)
optional-to-escape = '(' | ')' | '{' | '/' | '\'
parameter = '{', name*, '}'
name = (- name-to-escape) | ('\', name-to-escape)
name-to-escape = '{' | '}' | '(' | '/' | '\'
Regex
Production Rules
Follows original production rules.
License
This project is licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Dependencies
~1.2–2.6MB
~54K SLoC