1 个不稳定版本
0.1.1 | 2019 年 7 月 29 日 |
---|
#198 在 #nom
用于 nom-both
5KB
72 行
nom-both
nom 的扩展,提供特殊的 both_
解析器。
要求
nom 必须是 5.0.0 或更高版本。nom-both 只能应用于函数式解析器。
用法
[dependencies]
nom-both = "0.1.1"
示例
nom-both 提供 both_opt
和 both_alt
解析器。 both_opt
表示解析器尝试参数解析器和跳过。 both_alt
表示解析器尝试第一个参数解析器和第二个参数解析器。
use nom::branch::*;
use nom::bytes::complete::*;
use nom::IResult;
use nom_both::both_parser;
#[both_parser]
pub fn both_opt_parser(s: &str) -> IResult<&str, Option<&str>> {
let (s, _) = tag("1")(s)?;
let (s, x) = both_opt(tag("2"))(s)?;
let (s, _) = tag("2")(s)?;
let (s, _) = tag("3")(s)?;
Ok((s, x))
}
#[both_parser]
pub fn both_alt_parser(s: &str) -> IResult<&str, &str> {
let (s, _) = tag("1")(s)?;
let (s, x) = both_alt(tag("22"), tag("2"))(s)?;
let (s, _) = tag("2")(s)?;
let (s, _) = tag("3")(s)?;
Ok((s, x))
}
#[test]
fn test() {
let ret = both_opt_parser("123");
assert_eq!("None", format!("{:?}", ret.unwrap().1));
let ret = both_alt_parser("1223");
assert_eq!("\"2\"", format!("{:?}", ret.unwrap().1));
}
both_opt_parser
的展开如下
pub fn both_opt_parser(s: &str) -> IResult<&str, Option<&str>> {
alt((
{ |s| {
let (s, _) = tag("1")(s)?;
let (s, x) = nom_both::some(tag("2"))(s)?;
let (s, _) = tag("2")(s)?;
let (s, _) = tag("3")(s)?;
Ok((s, x))
} },
{ |s| {
let (s, _) = tag("1")(s)?;
let (s, x) = nom_both::none(tag("2"))(s)?;
let (s, _) = tag("2")(s)?;
let (s, _) = tag("3")(s)?;
Ok((s, x))
} },
))(s)
}
both_alt_parser
的展开如下
pub fn both_opt_parser(s: &str) -> IResult<&str, Option<&str>> {
alt((
{ |s| {
let (s, _) = tag("1")(s)?;
let (s, x) = nom_both::alt_left(tag("22"), tag("2"))(s)?;
let (s, _) = tag("2")(s)?;
let (s, _) = tag("3")(s)?;
Ok((s, x))
} },
{ |s| {
let (s, _) = tag("1")(s)?;
let (s, x) = nom_both::alt_right(tag("22"), tag("2"))(s)?;
let (s, _) = tag("2")(s)?;
let (s, _) = tag("3")(s)?;
Ok((s, x))
} },
))(s)
}
许可证
以下任一许可证下发布
- Apache 许可证 2.0 版,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确表示,否则根据 Apache-2.0 许可证定义的,您提交的任何旨在包含在作品中的贡献,都应如上所述双重许可,而不附加任何其他条款或条件。
依赖项
~2MB
~46K SLoC