Parsing 如何解析Nom中的大写字符串?

Parsing 如何解析Nom中的大写字符串?,parsing,rust,nom,Parsing,Rust,Nom,我正在使用函数而不是宏编写NOM5中的解析器。我的目标是编写一个解析器来识别完全由大写字符组成的字符串。理想情况下,它将具有与相同的返回签名 take\u而将识别0个或多个字符,因此当像您这样在many1中使用时,它将首先解析整个“ADAM”字符串。然后当many1再次调用它时,由于take_while可以识别空字符串,它将成功,但是many0和many1具有防止该错误的保护:如果底层解析器没有使用任何输入,它们将返回错误 对于您需要的内容,uppercase\u char函数应该足够了,不需要

我正在使用函数而不是宏编写NOM5中的解析器。我的目标是编写一个解析器来识别完全由大写字符组成的字符串。理想情况下,它将具有与相同的返回签名


take\u而
将识别0个或多个字符,因此当像您这样在
many1
中使用时,它将首先解析整个
“ADAM”
字符串。然后当
many1
再次调用它时,由于
take_while
可以识别空字符串,它将成功,但是
many0
many1
具有防止该错误的保护:如果底层解析器没有使用任何输入,它们将返回错误

对于您需要的内容,
uppercase\u char
函数应该足够了,不需要
recognize
many1
。虽然您可能想将
take_while
替换为
take_while1

为什么
many1(大写字符)
而不仅仅是
大写字符
use nom::{
    character::complete::{alpha1, char, line_ending, not_line_ending},
    combinator::{cut, map, not, recognize},
    error::{context, ParseError, VerboseError},
    multi::{many0, many1},
    IResult,
};

fn uppercase_char<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, &'a str, E> {
    let chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    take_while(move |c| chars.contains(c))(i)
}

// Matches 1 or more consecutive uppercase characters
fn upper1<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, &'a str, E> {
    recognize(many1(uppercase_char))(i)
}
#[test]
fn test_upper_string_ok() {
    let input_text = "ADAM";
    let output = upper1::<VerboseError<&str>>(input_text);
    dbg!(&output);
    let expected = Ok(("ADAM", ""));
    assert_eq!(output, expected);
}