Я пытаюсь написать анализатор уценки, используя nom
и EBNF, показанный здесь .Я немного застрял в том, как выражение начинается с ненулевой цифры при попытке разобрать число.
Number = NonZeroDigit { Digit };
NonZeroDigit = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
Digit = "0" | NonZeroDigit;
TLDR: Как реализовать Number = NonZeroDigit { Digit };
Моя текущая реализация выглядит так:
fn number(s:&[u8]) -> IResult<&[u8], &[u8]> {
let (_, head) = peek(1)(s)?
if (is_non_zero_digit(head[0])) {
return digit1(s)
} else {
return make_error(s, kind: ErrorKind.IsA)
}
}
Эта версия также кажется немного более простой и соответствует nom
.
fn number(s:&[u8]) -> IResult<&[u8], &[u8]> {
let (_, head) = peek(1)(s)?
cond(is_non_zero_digit(head[0]),digit1)(s)
}
Я не уверена, хочу ли якидать какую-то ошибку?Потому что, возможно, это не число, а какая-то строка, такая как дата или время.Возможно, даже не имеет смысла включать понятие Number
в грамматику для уценки?