Начинается с ненулевой цифры, используя nom? - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь написать анализатор уценки, используя 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 в грамматику для уценки?

...