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

Недавно я изучал парсеры и грамматики и то, как они работают. Я читал формальную грамматику для 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

person Channel72    schedule 07.11.2010    source источник


Ответы (3)


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

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

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

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

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

person Ira Baxter    schedule 07.11.2010

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

person hooke    schedule 12.04.2013

Преимущество стандартов в том, что есть из чего выбирать.

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

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

Да, нотация, используемая в RFC-4627, менее распространена, но не непонятна.

person msw    schedule 07.11.2010