最近我一直在研究解析器和语法以及它们是如何工作的。我在 http://www.ietf.org/rfc/rfc4627.txt 阅读了 JSON 的正式语法。 ,它使用 EBNF。我对自己对 BNF 和 EBNF 的理解非常有信心,但显然我仍然没有完全理解它。 RFC 定义了一个 JSON 对象,如下所示:
object = begin-object [ member *( value-separator member ) ]
end-object
我理解这里的意图是表达任何 JSON 对象都可以(可选)拥有一个成员,然后后跟 0 个或多个(值分隔符、成员)对。我不明白的是为什么星号出现在
(value-separator member) 之前.星号是不是应该模仿正则表达式,以便它出现在要重复 0 次或更多次的项目之后? JSON 对象语法不应该这样写:
object = begin-object [ member ( value-separator member )* ]
end-object
请您参考如下方法:
在提到的文件中,http://www.ietf.org/rfc/rfc4627.txt ,据说
The grammatical rules in this document are to be interpreted as described in [RFC4234].
RFC4234描述 ABNF(增强 BNF),而不是 EBNF。
如果您仔细阅读本文档,您会发现以下定义:
3.6. Variable Repetition: *Rule
The operator "*" preceding an element indicates repetition. The full
form is:
<a>*<b>element
where <a> and <b> are optional decimal values, indicating at least
<a> and at most <b> occurrences of the element.
Default values are 0 and infinity so that *<element> allows any
number, including zero; 1*<element> requires at least one;
3*3<element> allows exactly 3 and 1*2<element> allows one or two.
所以,记号
*( value-separator member )
根据 ABNF 定义是正确的,并允许任意数量的重复,包括零。




