Использование скобок и скобок в BNF?

Рассмотрим следующее:

Список параметров функции представляет собой последовательность из нуля или более параметров, разделенных запятыми и заключенных в круглые скобки, "(" и ")" .

Если я хочу указать синтаксис «списка параметров функции», предполагая, что синтаксическая категория «параметр» определена, могу ли я написать:

  <function parameter list> ::= ( [<parameter> { , <parameter>} ] )

как БНФ? Допустимо ли использование скобок, вложенных в фигурные скобки, для EBNF?

Первоначально моим импульсом было дать BNF как:

  <function parameter list> ::= ( <parameter> )
                             | ( <parameter> { , <parameter> } )
                             | ( )

Я не уверен, как еще я мог бы написать этот BNF без фигурных скобок.

Я пытаюсь получить информацию из моего текста или из Интернета об использовании скобок/скобок в обычном BNF, и некоторые источники подразумевают, что вы можете, но мой текст не указывает точно. Кажется, что BNF нуждается в какой-то скобе для этого случая. Я думал, что BNF не может использовать брекеты или брекеты, и теперь я не уверен.


person Mars01    schedule 11.03.2015    source источник
comment
Какой диалект BNF вы используете? Их много, и у них разные наборы правил. Является ли скобка метасимволом или буквальным символом? Возможно, вам следует использовать LPAREN и RPAREN в качестве имен токенов для левой и правой скобок. Вы случайно упомянули EBNF в одном месте; правила для EBNF очень отличаются от большинства других систем, связанных с BNF (которые это одна из причин, по которой EBNF не используется очень часто). И ваш синтаксис не имеет никакого отношения к EBNF.   -  person Jonathan Leffler    schedule 11.03.2015
comment
Что {} пытаются сказать? Чем отличается от [ <parameters> [ , <parameters> ] ] ?   -  person TZHX    schedule 11.03.2015
comment
@JonathanLeffler Я предполагаю, что диалект BNF является самым основным академическим диалектом BNF, поскольку мой текст охватывает только BNF и EBNF и не указывает какой-либо конкретный диалект BNF. Вот почему я предположил, что скобки/скобки нельзя использовать в BNF в этом контексте. Я считаю, что скобки являются буквальными, хотя это явно не указано.   -  person Mars01    schedule 11.03.2015
comment
@TZHX {} говорит, что терминалы и нетерминалы внутри {} могут постоянно повторяться. В вашем примере я считаю, что скобки обозначают содержимое внутри него как необязательное, но не повторяемое постоянно.   -  person Mars01    schedule 11.03.2015
comment
Эта самая основная форма не помогает мне ни в малейшей степени; Я понятия не имею, какие правила использует ваша основная форма. Существует столько форм BNF, сколько существует университетов и стандартов, использующих BNF. Практически нет двух, которые следуют одним и тем же правилам. Свидетель: ваш вариант, похоже, использует ->, чтобы указать, что LHS является производным от RHS. Я не знаю, чья БНФ использует это обозначение; Я не видел его раньше. Это понятно; это не стандарт (потому что стандарта нет — или потому что стандартов много; выбирайте сами). Как вы вставляете литерал { или } или | в свой BNF, например?   -  person Jonathan Leffler    schedule 11.03.2015
comment
@JonathanLeffler, что касается моего текста, BNF, на который они ссылаются, - это тот, который был представлен Питером Науром для описания ALGOL 60. К сожалению, ваш вопрос о встроенных литералах, похоже, выходит за рамки текста, это часть моего проблема здесь.   -  person Mars01    schedule 11.03.2015
comment
@JonathanLeffler В случае, если это было неясно {} и | символы не являются литералами. Ни []. {} означает, что внутреннее содержимое фигурных скобок может быть опущено или повторяться бесконечно, [] означает, что содержимое внутри может быть необязательным, но не повторяться, а символ | символ просто обозначает или, поскольку параметр функции определяется как это ИЛИ то. Эти определения взяты в качестве предпосылок в тексте.   -  person Mars01    schedule 11.03.2015
comment
Три примера БНФ — иллюстрирующие различия. Грамматика Алгола 60 (pdf); Википедия на Форме Backus-Naur и О нотации BNF. Ни в одном из них не используется и не упоминается -> (вместо этого используется ::=).   -  person Jonathan Leffler    schedule 11.03.2015
comment
Самое простое решение — ввести <left-parenthesis> и <right-parenthesis> и использовать их в основной части грамматики. Где-то вы определите терминал для них, возможно, как <left-parenthesis> ::= '('. Может у вас и без этого все в порядке. Возможно, вы сможете использовать ( и ) в грамматике напрямую, без кавычек, и это «работает» как буквальная скобка (ведущая к <left-parenthesis> ::= ( в качестве определения). Это зависит от правил, которые определяет тот, кто определяет диалект БНФ, с которым вы работаете.   -  person Jonathan Leffler    schedule 11.03.2015
comment
@JonathanLeffler Что насчет этого? Предполагая, что мы в порядке, не определяя левую/правую круглую скобку. ‹список параметров функции›::= ( ) | (‹список_параметров›) ‹список параметров› ::= ‹параметр› | ‹параметр›, ‹список параметров›   -  person Mars01    schedule 11.03.2015
comment
Это сработает. Я мог бы использовать <function-parameter-list> ::= ( <opt-parameter-list> ), и <opt-parameter-list> ::= /* Nothing */ | <parameter-list>, и <parameter-list> ::= <parameter> | <parameter-list> , <parameter>, но в итоге это практически одно и то же. Итак, если мы согласимся с тем, что ни запятая, ни левая скобка, ни правая скобка не являются метасимволом, то у вас все в порядке (и я рад согласиться, мне просто нужно было разъяснить правила). Обозначение /* Nothing */, конечно, означает «без символов», но я лучше расшифрую его, на случай путаницы.   -  person Jonathan Leffler    schedule 11.03.2015
comment
И если ваш слегка расширенный BNF использует [ и ] для включения необязательного материала (ноль или одно появление) и { и } для заключения необязательного повторяющегося материала (ноль или более появлений), а запятые и круглые скобки не являются метасимволами, ваш исходный план в порядке. слишком. Но это зависит от правил, по которым вы работаете.   -  person Jonathan Leffler    schedule 11.03.2015
comment
@JonathanLeffler Я ценю тщательность. Ваше здоровье.   -  person Mars01    schedule 11.03.2015


Ответы (1)


Скобки и брекеты — это конструкции EBNF, буква E означает «расширенный». Простая BNF — это просто контекстно-свободная грамматика без дополнительного синтаксического сахара для рекурсивных вещей, поэтому вам нужно записать ее с помощью вложенного рекурсивного правила:

<function parameter list> ::= ( <param-list> ) | ( )
<param-list> ::= <param> | <param-list> , <param>
person Chris Dodd    schedule 11.03.2015
comment
Я согласен, вопрос в том виде, в каком он был задан в моем учебном материале, казалось, подразумевал, что дополнительное определение param-list не требуется, поэтому я задал свой первоначальный вопрос. Ваше здоровье. - person Mars01; 11.03.2015