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