Как я могу преобразовать этот BNF в EBNF?
<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _
Как я могу преобразовать этот BNF в EBNF?
<vardec> ::= var <vardeclist>;
<vardeclist> ::= <varandtype> {;<varandtype>}
<varandtype> ::= <ident> {,<ident>} : <typespec>
<ident> ::= <letter> {<idchar>}
<idchar> ::= <letter> | <digit> | _
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" } -
представляет собой последовательность из одного или нескольких А, потому что это синтаксический-терм с пустым синтаксическим-исключением.
{...}-
является частью стандарта (конец страницы 4, под синтаксическим термином 5.8), но не интуитивно. Показано, как, используя только определения {
, }
и -
, можно составить одно или несколько правил: ee = {"A"}-,"E";
определяет AE, AAE, AAAE и т. д. синтаксический-терм с пустым синтаксическим-исключением.
- person jmmut; 18.07.2017
ident
в примере должно быть ident = letter, { idchar };
думаю, по стандарту от 4.5 до 4.10.
- person jmmut; 19.07.2017
Удалите угловые скобки и заключите все терминалы в кавычки:
vardec ::= "var" vardeclist;
vardeclist ::= varandtype { ";" varandtype }
varandtype ::= ident { "," ident } ":" typespec
ident ::= letter { idchar }
idchar ::= letter | digit | "_"