我有兴趣使用nom解析器组合器来识别这种标识符:
"a"
"a1"
"a_b"
"aA"
"aB_3_1"
标识符的第一个字符应该是字母小写字符,然后可以是字母数字字符和下划线 (so [a-zA-Z0-9_]*
) 的任何组合,但不得出现双(或更多)下划线且下划线不得结束标识符,拒绝这些情况:
"Aa"
"aB_"
"a__a"
"_a"
到目前为止,我已经提出了这个解决方案,但不确定我的方法的正确性:
pub fn identifier(s: &str) -> IResult<&str, &str> {
let (i, _) = verify(anychar, |c: &char| c.is_lowercase())(s)?;
let (j, _) = alphanumeric0(i)?;
let (k, _) = recognize(opt(many1(preceded(underscore, alphanumeric1))))(j)?;
Ok((k,s))
}
此外,我需要在使用它时环绕recognize
这个解析器,如下所示:identifier
pub fn identifier2(s: &str) -> IResult<&str, &str> {
(recognize(identifier))(s)
}