#expressions #ast-parser #cucumber

cucumber-expressions

Cucumber Expressions AST 和解析器

7 个不稳定版本

0.3.0 2023 年 4 月 24 日
0.2.1 2022 年 3 月 9 日
0.2.0 2022 年 2 月 10 日
0.1.2 2022 年 1 月 11 日
0.0.0 2021 年 11 月 5 日

#702 in 解析器实现

Download history 16008/week @ 2024-03-14 14775/week @ 2024-03-21 13353/week @ 2024-03-28 18671/week @ 2024-04-04 16664/week @ 2024-04-11 18840/week @ 2024-04-18 22079/week @ 2024-04-25 27184/week @ 2024-05-02 23792/week @ 2024-05-09 36786/week @ 2024-05-16 36826/week @ 2024-05-23 40780/week @ 2024-05-30 40220/week @ 2024-06-06 45501/week @ 2024-06-13 40417/week @ 2024-06-20 32897/week @ 2024-06-27

168,113 每月下载量
用于 2 crates

MIT/Apache

145KB
3K SLoC

Cucumber Expressions for Rust

crates.io Rust 1.62+ Unsafe Forbidden
CI Rust docs

Rust 实现 Cucumber Expressions

此包提供 AST 解析器和 Regex 扩展的 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 功能

  • into-regex: 启用扩展到 Regex

语法

此实现遵循一个上下文无关语法,尚未合并。原始语法在创建性能解析器时难以遵循,因为它包含错误,并不精确描述 Cucumber Expressions 语言,而是一个超集语言,并且是上下文相关的。如果您在此实现与其他语言实现之间发现了一些不一致之处,请提交问题!

此包实现的当前上下文无关语法的 EBNF 规范

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 生成规则

遵循原始 生成规则

许可证

本项目许可在以下之一下:

您可选。

依赖

~1.3–2.6MB
~52K SLoC