В спецификации грамматики Alloy на веб-сайте Alloy я запутался. с помощью квадратных скобок.
В постановке, подобной следующей, все кажется ясным.
specification ::= [module] open* paragraph*
Я предполагаю, что квадратные скобки указывают на необязательность, а звездочки — это замыкания Клини, так что только что процитированное правило означает, что спецификация состоит не более чем из одного оператора module
, нуля или более предложений open
и нуля или более paragraph
. Для меня это имеет смысл (хотя я постепенно прихожу к использованию нотации EBNF Вирта везде, где это возможно, поэтому в моих заметках это обозначено как [module] {open} {paragraph}
).
Однако в следующей постановке скобки сбивают меня с толку.
cmdDecl ::= [name ":"] ["run"|"check"] [name|block] scope
Меня бы очень удивило, если бы ключевые слова run
и check
были необязательными в командах, а также для имени выполняемого предиката, имени проверяемого утверждения или выполняемого или проверяемого анонимного блока. Но это выглядит так, как если бы это правило говорило.
Итак, вопрос 1: на что означают квадратные скобки в грамматике?
Вопрос 2: является ли опечаткой использование квадратных скобок там, где некоторые читатели могут ожидать наличия скобок? т.е. должно ли это правило вместо этого принять следующую форму?
cmdDecl ::= [name ":"] ("run"|"check") (name|block) scope
Может быть, я просто недостаточно знаком с разнообразием грамматических обозначений, которые можно найти в дикой природе; возможно, было бы полезно указать инструмент или указать на описание обозначения.
Вопрос 3: используется ли эта нотация каким-либо инструментом генерации синтаксического анализатора? Который?