Вопрос о нотации EBNF и JSON - PullRequest
       108

Вопрос о нотации EBNF и JSON

4 голосов
/ 07 ноября 2010

Недавно я изучал парсеры и грамматику и как они работают.Я читал формальную грамматику для JSON на http://www.ietf.org/rfc/rfc4627.txt, где используется 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

Ответы [ 3 ]

13 голосов
/ 12 апреля 2013

В упомянутом документе 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 и допускает любое количество повторений, включая ноль.

9 голосов
/ 07 ноября 2010

Синтаксис - это способ, которым кто-то выбирает записывать конкретные сущности для представления чего-либо.

Я согласен, что установка звезды Клини перед повторяющейся сущностью является нестандартной, и выбор авторов это просто сбивает с толку людей, привыкших к условностям. Но это совершенно верно; авторы определить, что означает синтаксис, и вы, пользователь стандарта, просто получите его.

Есть некоторый аргумент в пользу того, чтобы поставить звезду Клини там, где он сделал; это указывает на то, что есть список следуя в точке, где вы могли бы ожидать список. Звезда Клини в стиле суффикса указывает то же самое, но это своего рода сюрприз; сначала вы читаете элемент списка (слева направо), тогда вы обнаружите звезду.

На практике фактор неожиданности post-Kleene-star недостаточно для того, чтобы перевесить фактор неожиданности нарушения соглашения. Но авторы этого стандарта сделали свой выбор.

Добро пожаловать в синтаксис.

1 голос
/ 07 ноября 2010

Хорошая вещь о стандартах состоит в том, что есть так много, чтобы выбрать из.

Очевидно, Никлас Вирт удивлялся тому же, что и вы тридцать несколько лет назад :

Население по программированию Языки неуклонно растут, и нет конца этому росту в взгляд. Многие определения языка появляются в журналах, многие найдены в технические отчеты и, возможно, даже большее число остается ограниченным Собственные круги. После частых воздействие этих определений, один не может не заметить отсутствие «Общие знаменатели». Единственное широко общепризнанным фактом является то, что язык структура определяется синтаксисом. Но четное обозначение синтаксического описание ускользает от любых общепринятых стандартная форма, хотя основной предок неизменно Бэкус-Наур Форма отчета Алгол 60. Как вариации часто незначительны, они раздражать за их отсутствие очевидная мотивация.

Да, обозначения, используемые в RFC-4627, встречаются реже, но не являются непонятными.

...