Как конвертировать BNF в EBNF

Как я могу преобразовать этот BNF в EBNF?

<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _

person Deshi Basara    schedule 17.02.2013    source источник
comment
С чем именно у вас проблемы?   -  person Felix Kling    schedule 17.02.2013
comment
На вопрос «возможный дубликат» есть один ответ, который содержит две ссылки на материалы вне SO. Он, безусловно, задает примерно эквивалентный вопрос; однако у него нет очень хорошего ответа, поэтому он не является хорошим дубликатом.   -  person Jonathan Leffler    schedule 17.02.2013


Ответы (2)


EBNF или расширенная форма Бэкуса-Наура — это ISO 14977:1996 и доступен в формате PDF из ISO бесплатно*. Он не получил широкого распространения по стандартам компьютерного языка. Также есть статья, в которой это описано, и эта статья содержит эту таблицу, обобщающую нотацию EBNF.

         Table 1: Extended BNF
Extended BNF    Operator  Meaning
-------------------------------------------------------------
unquoted words            Non-terminal symbol
" ... "                   Terminal symbol
' ... '                   Terminal symbol
( ... )                   Brackets
[ ... ]                   Optional symbols
{ ... }                   Symbols repeated zero or more times
{ ... }-                  Symbols repeated one or more times†
=               in        Defining symbol
;               post      Rule terminator
|               in        Alternative
,               in        Concatenation
-               in        Except
*               in        Occurrences of
(* ... *)                 Comment
? ... ?                   Special sequence

Оператор * используется с предшествующим (беззнаковым) целым числом; кажется, что это не позволяет использовать переменное количество повторений, например, 1-15 символов после начального символа, чтобы сделать идентификаторы длиной до 16 символов. это лис

В стандарте открывающая скобка ( называется символом начала группы, а закрывающая скобка ) называется символом конца группы; открытая квадратная скобка [ — это символ начального варианта, а закрывающая квадратная скобка — символ конечного варианта; открывающая фигурная скобка { — это символ начала повтора, а закрывающая скобка } — символ конца повтора. Одинарные кавычки ' называются символом первой кавычки, а двойные кавычки " называются символом второй кавычки.

* Да, бесплатно — хотя вы также можете заплатить за него 74 швейцарских франка, если хотите. Посмотрите примечание под полем, содержащим оплачиваемые товары.


Вопрос направлен на преобразование этого «BNF» в EBNF:

<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _

Формально БНФ не определена, поэтому нам нужно сделать несколько (простых) предположений о том, что это значит. Перевод является рутинным (он может быть механическим, если БНФ формально определен):

vardec     = 'var', vardeclist, ';';
vardeclist = varandtype, { ';', varandtype };
varandtype = ident, { ',', ident }, ':', typespec;
ident      = letter, { idchar };
idchar     = letter | digit | '_';

Угловые скобки должны быть удалены вокруг нетерминалов; символ определения ::= заменен на =; терминалы, такие как ; и _, заключены в кавычки; конкатенация явно отмечена ,; и каждое правило заканчивается ;. Группировка и альтернативные операции в оригинале совпадают со стандартной записью. Обратите внимание, что явная конкатенация с запятой означает, что нетерминалы из нескольких слов однозначны.


Беглое изучение самого стандарта позволяет предположить, что обозначение {...}- не является частью стандарта, а просто документом. Однако, как отмечает jmmut в comment, стандарт определяет значение {…}-:

§5.8 Синтаксический термин

Когда синтаксический-терм представляет собой синтаксический-фактор, за которым следует символ-исключения, за которым следует синтаксическое-исключение, он представляет собой любую последовательность символов, которая удовлетворяет обоим условиям:

а) это последовательность символов, представленная синтаксическим фактором,

б) это не последовательность символов, представленная синтаксическим-исключением.

ПРИМЕЧАНИЕ. { "A" } - представляет собой последовательность из одного или нескольких А, потому что это синтаксический-терм с пустым синтаксическим-исключением.

person Jonathan Leffler    schedule 17.02.2013
comment
Я хотел бы отметить, что обозначение {...}- является частью стандарта (конец страницы 4, под синтаксическим термином 5.8), но не интуитивно. Показано, как, используя только определения {, } и -, можно составить одно или несколько правил: ee = {"A"}-,"E"; определяет AE, AAE, AAAE и т. д. синтаксический-терм с пустым синтаксическим-исключением. - person jmmut; 18.07.2017
comment
@jmmut: Спасибо. Хорошо подмечено. Это интересный образец минимализма. Я обновил свой ответ. Я не уверен, что это чрезмерное убийство; это может быть. - person Jonathan Leffler; 18.07.2017
comment
Согласитесь, это не имеет прямого отношения к вопросу, но я бы сказал, что хорошо иметь хотя бы примечание, я не знал, что это разрешено, пока не прочитал этот ответ. О, и еще одна деталь, запятые (конкатенация) также необходимы вокруг групп, таких как фигурные скобки (повторение). определения типа ident в примере должно быть ident = letter, { idchar }; думаю, по стандарту от 4.5 до 4.10. - person jmmut; 19.07.2017
comment
@jmmut: Да, исправлено. Спасибо. (Как вы понимаете, у меня нет верификатора EBNF для проверки того, что я написал.) - person Jonathan Leffler; 19.07.2017

Удалите угловые скобки и заключите все терминалы в кавычки:

vardec ::= "var" vardeclist;
vardeclist ::= varandtype { ";" varandtype }
varandtype ::= ident { "," ident } ":" typespec
ident ::= letter { idchar }
idchar ::= letter | digit | "_"
person Mikhail Vladimirov    schedule 17.02.2013
comment
В первом приближении; есть некоторые детали, которые вам нужно исправить. - person Jonathan Leffler; 17.02.2013