关于EBNF表示法和JSON的问题

Cha*_*l72 5 grammar parsing json bnf ebnf

最近我一直在研究解析器和语法以及它们是如何工作的.我正在阅读http://www.ietf.org/rfc/rfc4627.txt使用EBNF的JSON的正式语法.我对BNF和EBNF的理解非常有信心,但显然我还是不完全理解它.RFC定义了一个JSON对象,如下所示:

  object = begin-object [ member *( value-separator member ) ]
  end-object
Run Code Online (Sandbox Code Playgroud)

我理解这里的意图是表达任何JSON对象可以(可选)拥有一个成员,然后是0或更多(值分隔符,成员)对.我不明白的是,为什么会出现星号之前(value-separator member).不应该模仿正则表达式的星号,这样看来以后要重复0次以上的项目?不应该像这样编写JSON对象语法:

  object = begin-object [ member ( value-separator member )* ]
  end-object
Run Code Online (Sandbox Code Playgroud)

hoo*_*oke 14

在上述文件中,http://www.ietf.org/rfc/rfc4627.txt表示

本文档中的语法规则将按[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.
Run Code Online (Sandbox Code Playgroud)

所以,符号

*( value-separator member )
Run Code Online (Sandbox Code Playgroud)

根据ABNF定义是正确的,并允许任意数量的重复,包括零.


Ira*_*ter 9

语法是关于某人选择写下具体实体来表示某事的方式.

我同意在实体重复之前推出 Kleene明星是非标准的,作者选择这样做只会混淆习惯惯例的人.但它完全有效; 作者可以定义语法的含义,而您,标准的用户,只需接受它即可.

将Kleene星放在他所做的地方有一些争论; 它表示在您可能期望列表的位置存在列表.后缀式Kleene明星表示相同,但​​它有点令人惊讶; 首先你读取列表元素(从左到右),然后你发现了星星.

实际上,后Kleene-star的突然因素通常不足以超过违反惯例的意外因素.但该标准的作者做出了选择.

欢迎使用语法.