8个版本 (4个重大更新)
0.5.0 | 2023年3月23日 |
---|---|
0.4.0 | 2021年8月31日 |
0.3.1 | 2020年11月27日 |
0.2.0 | 2020年4月1日 |
0.1.2 | 2019年10月16日 |
#2357 在 解析器实现
每月4,485次下载
用于 16 个crate (6个直接使用)
14KB
207 行
nom-greedyerror
nom的自定义错误类型,以提高错误位置的准确性。
nom的默认错误类型((I, ErrorKind)
和 VerboseError
)在alt
组合器中获取最后一个挑战的错误。nom-greedyerror的GreedyError
则获取最深错误。
例如,以下解析器接受类似于 abc012abc
或 012abc012
的字符串。
alt((
tuple((alpha1, digit1, alpha1)),
tuple((digit1, alpha1, digit1)),
))(input)
如果提供了 abc012:::
abc012:::
^
但 VerboseError
报告的解析错误在
abc012:::
^
这是因为最后一个挑战的解析器是 tuple((digit1, alpha1, digit1))
并且失败了。 GreedyError
报告的解析错误在预期位置。
要求
nom必须是5.0.0或更高版本。
使用
[dependencies]
nom-greedyerror = "0.5.0"
示例
use nom::branch::alt;
use nom::character::complete::{alpha1, digit1};
use nom::error::{ErrorKind, ParseError, VerboseError};
use nom::sequence::tuple;
use nom::Err::Error;
use nom::IResult;
use nom_greedyerror::{error_position, GreedyError, Position};
use nom_locate::LocatedSpan;
type Span<'a> = LocatedSpan<&'a str>;
fn parser<'a, E: ParseError<Span<'a>>>(
input: Span<'a>,
) -> IResult<Span<'a>, (Span<'a>, Span<'a>, Span<'a>), E> {
alt((
tuple((alpha1, digit1, alpha1)),
tuple((digit1, alpha1, digit1)),
))(input)
}
fn main() {
// VerboseError failed at
// abc012:::
// ^
let error = parser::<VerboseError<Span>>(Span::new("abc012:::"));
dbg!(&error);
match error {
Err(Error(e)) => assert_eq!(e.errors.first().map(|x| x.0.position()), Some(0)),
_ => (),
};
// GreedyError failed at
// abc012:::
// ^
let error = parser::<GreedyError<Span, ErrorKind>>(Span::new("abc012:::"));
dbg!(&error);
match error {
Err(Error(e)) => assert_eq!(error_position(&e), Some(6)),
_ => (),
};
}
许可证
许可为以下之一
- Apache许可证版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则您提交给工作以包含在内的任何贡献,根据Apache-2.0许可证定义,应按上述方式双许可,不得附加任何额外条款或条件。
依赖关系
~1MB
~21K SLoC