0

我正在尝试使用此处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也许在 markdown 的语法中包含 a 的概念甚至没有意义?

4

0 回答 0