6

最近我一直在研究解析器和语法以及它们是如何工作的。我正在阅读http://www.ietf.org/rfc/rfc4627.txt使用 EBNF 的 JSON 的形式语法。我对我对 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
4

3 回答 3

15

在提到的文件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.

所以,符号

*( value-separator member )

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

于 2013-04-12T07:34:27.753 回答
9

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

我同意将 Kleene 星放在实体之前重复是不标准的,作者选择这样做只会让习惯于惯例的人感到困惑。但它是完全有效的;作者可以定义语法的含义,而您,标准的用户,只需接受它。

将 Kleene 明星放在他做过的地方是有争议的。它表示在您可能期望列表的位置后面有列表。后缀风格的 Kleene 星表示相同,但​​这有点令人惊讶;首先您阅读列表元素(从左到右),然后您会发现星星。

实际上,后克林星的惊喜因素通常不足以超过违反惯例的惊喜因素。但是该标准的作者做出了他们的选择。

欢迎使用语法。

于 2010-11-07T15:57:22.183 回答
1

标准的好处是有很多可供选择。

显然,三十多年前,尼克拉斯·沃思和你想知道同样的事情:

编程语言的数量正在稳步增长,而且这种增长没有尽头。许多语言定义出现在期刊中,许多出现在技术报告中,也许更多的定义仍然局限于专有圈子。在频繁接触这些定义之后,人们不能不注意到缺乏“共同点”。唯一被广泛接受的事实是语言结构是由语法定义的。但即使是句法描述的符号也避开了任何普遍认可的标准形式,尽管潜在的祖先总是 Algol 60 报告的巴库斯-瑙尔形式。由于变化通常很小,它们会因为缺乏明显的动机而变得烦人。

是的,RFC-4627 中使用的符号不太常见,但并非难以理解。

于 2010-11-07T15:58:08.567 回答