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