我正在尝试使用此处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 的概念甚至没有意义?