В RFC1738 BNF для domainlabel
имеет следующий вид:
domainlabel = alphadigit | alphadigit * [alphadigit | "-"] альфа-цифра
То есть это либо альфа-цифра, либо строка, в которой первый / последний символы должны быть альфа-цифрой, а промежуточные символы могут быть альфа-цифрой или тире.
Как мне реализовать это с помощью nom? Игнорируя сценарий с одним символом для упрощения случая, моя последняя попытка:
fn domain_label(s: &[u8]) -> IResult<&[u8], (&[u8], &[u8], &[u8])> {
let left = take_while_m_n(1, 1, is_alphanumeric);
let middle = take_while(|c| is_alphanumeric(c) || c == b'-');
let right = take_while_m_n(1, 1, is_alphanumeric);
let whole = tuple((left, middle, right));
whole(s)
}
Проблема в том, что middle
может использовать последний символ и, следовательно, right
терпит неудачу, потому что нет символа для использования.
println!("{:?}", domain_label(b"abcde"));
Err(Error(([], TakeWhileMN)))
Парсеры должны иметь возможность пробовать все возможные пути потребления, но как это сделать с nom
?