Crates.io | cucumber-expressions |
lib.rs | cucumber-expressions |
version | 0.3.0 |
source | src |
created_at | 2021-11-05 19:31:07.945573 |
updated_at | 2023-04-24 11:46:09.983757 |
description | Cucumber Expressions AST and parser. |
homepage | https://github.com/cucumber-rs/cucumber-expressions |
repository | https://github.com/cucumber-rs/cucumber-expressions |
max_upload_size | |
id | 477473 |
size | 158,267 |
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");
# }
into-regex
: Enables expansion into Regex
.
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 RulesFollows original production rules.
This project is licensed under either of
at your option.