Мне интересно использовать nom комбинаторы синтаксического анализа для распознавания идентификаторов такого типа:
"a"
"a1"
"a_b"
"aA"
"aB_3_1"
Первым символом идентификатора должен быть алфавит c в нижнем регистре может последовать любая комбинация буквенного символа c и подчеркивания (таким образом, [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)
}