2013-02-17 3 views
4

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

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

возможно дубликат [Преобразование BNF в EBNF] (http://stackoverflow.com/questions/8101594/converting-bnf-to-ebnf) – CharlesB

+0

Что именно вы испытываете проблемы? –

+1

Вопрос «Возможный дубликат» имеет один ответ, который содержит две ссылки на материал вне SO. Он, безусловно, задает примерно эквивалентный вопрос; однако он не имеет очень хорошего ответа, поэтому он не является хорошим дубликатом. –

ответ

0

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

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

В первом приближении; есть некоторые детали, которые вам нужно исправить. –

9

EBNF или Extended Backus-Naur Form является ISO 14977:1996, и доступен в формате PDF с ISO для свободного *. Он широко не используется стандартами компьютерного языка. Там также есть paper, который описывает его, и этот документ содержит эту таблицу, в которой суммируется обозначение 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 CHF, если хотите. Посмотрите на примечание под коробкой, содержащей заряжаемые предметы.


Вопрос стремится превратить эту «BNF» в EBNF:

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

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

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

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


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

синтаксических срок пункта 5.8

...

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

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

b) это не последовательность символов, представленных синтаксическим исключением .

...

Примечание - { "A" } - представляет собой последовательность одного или больше, потому что это синтаксический-член с пустым синтаксическим-исключением.

+0

Спасибо, это помогло! –

+0

Я хотел бы отметить, что обозначение '{...} -' ** является ** частью стандарта (конец страницы 4, под 5.8 синтаксическим термином), просто не интуитивным способом. Показывается, как можно использовать только определения '' '' '' '' '' '' '' '' '' или '':' ee = {"A"} -, "E"; 'определяет' AE ' , "AAE", "AAAE" и т. Д. > ПРИМЕЧАНИЕ {"A"} - представляет собой последовательность из одного или нескольких А, потому что это синтаксический термин с пустым синтаксическим исключением. – jmmut

+1

@jmmut: Спасибо. Хорошо подмечено. «Это интересная часть минимализма. Я обновил свой ответ. Я не уверен, слишком ли он убит; может быть. –

Смежные вопросы