#nom #error #parse-error #parser #position #alt #accuracy

nom-greedyerror

自定义错误类型以获取最深错误

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解析器实现

Download history 870/week @ 2024-04-20 1390/week @ 2024-04-27 1000/week @ 2024-05-04 1232/week @ 2024-05-11 1328/week @ 2024-05-18 1172/week @ 2024-05-25 1607/week @ 2024-06-01 1123/week @ 2024-06-08 947/week @ 2024-06-15 1252/week @ 2024-06-22 672/week @ 2024-06-29 926/week @ 2024-07-06 1079/week @ 2024-07-13 1264/week @ 2024-07-20 1156/week @ 2024-07-27 868/week @ 2024-08-03

每月4,485次下载
用于 16 个crate (6个直接使用)

MIT/Apache

14KB
207

nom-greedyerror

nom的自定义错误类型,以提高错误位置的准确性。

Actions Status Crates.io Docs.rs

nom的默认错误类型((I, ErrorKind)VerboseError)在alt组合器中获取最后一个挑战的错误。nom-greedyerror的GreedyError则获取最深错误。

例如,以下解析器接受类似于 abc012abc012abc012 的字符串。

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许可证定义,应按上述方式双许可,不得附加任何额外条款或条件。

依赖关系

~1MB
~21K SLoC