2010-11-07 2 views
4

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

ответ

8

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

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

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

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

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

1

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

Видимо, Никлас Вирт было интересно то же самое, как you thirty-some years ago:

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

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

11

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

Смежные вопросы