最近我一直在研究解析器和语法以及它们是如何工作的。我在 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 定义是正确的,并允许任意数量的重复,包括零。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!