BNF vs EBNF vs ABNF: что выбрать?

Я хочу придумать синтаксис языка. Я немного читал об этих трех и не вижу ничего, что может сделать один, чего не может сделать другой. Есть ли причина использовать одно вместо другого? Или это просто вопрос предпочтений?


person Jason Baker    schedule 04.04.2010    source источник


Ответы (6)


Вы должны думать о EBNF и ABNF как о расширениях, которые помогут вам быть более краткими и выразительными при разработке грамматики.

Например, подумайте о необязательном нетерминальном символе, в грамматике BNF вы бы определили его, используя промежуточные символы, такие как:

A        ::= OPTIONAL OTHER
OPTIONAL ::= opt_part | epsilon

в то время как с EBNF вы можете сделать это напрямую, используя необязательный синтаксис:

A ::= [opt_part] OTHER

Затем, поскольку нет возможности выразить приоритет в BNF, вы должны всегда использовать промежуточные символы также для вложенных вариантов:

BNF
A ::= B C
B ::= a | b | c

EBNF
A ::= (a | b | c) C

Это верно для многих синтаксических проблем, которые разрешены в грамматике EBNF или ABNF, благодаря синтаксическому сахару, но не с обычным BNF. ABNF расширяет EBNF, позволяя выполнять более сложные операции, например указывать, сколько вхождений символа можно найти вместе (т. е. 4*DIGIT).

Таким образом, выбор ABNF или EBNF в качестве языка для вашей грамматики упростит вашу работу, поскольку вы будете более выразительны, не заполняя грамматику бесполезными символами, которые будут все равно генерируются вашим генератором парсеров, но они вам наплевать!

person Jack    schedule 04.04.2010
comment
Относительно 4 * DIGIT: то же самое можно сделать в EBNF с использованием того же синтаксиса. - person Kamarey; 04.04.2010
comment
Вдобавок: IETF использует ABNF. ABNF намного удобнее, чем EBNF. - person Gabriel Llamas; 25.10.2013

Согласно Википедии, строковые литералы ABNF в двойных кавычках не чувствительны к регистру, а совпадения с учетом регистра должны определяться как числовые значения ASCII. Считаю это недостатком.

Буквальный текст указывается с помощью строки, заключенной в кавычки ("). В этих строках регистр не учитывается, и используется набор символов (US-) ASCII. Следовательно, строка «abc» будет соответствовать «abc», «Abc», «aBc», «abC», «ABc», «AbC», «aBC» и «ABC». Для совпадения с учетом регистра должны быть определены явные символы: для соответствия «aBc» определение будет %d97.66.99.

https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_Form#Terminal_values

Однако RFC 7405, похоже, добавляет в ABNF строковые литералы с учетом регистра.

https://tools.ietf.org/html/rfc7405

person trololo    schedule 26.04.2015

EBNF - это расширенная / новая версия BNF, поэтому проблема становится проще: EBNF против ABNF. Я не эксперт, но думаю, что это должно зависеть от языка, синтаксис которого вы хотите определить. Также есть несколько визуализаторов для EBNF (http://www.google.co.il/search?sourceid=chrome&ie=UTF-8&q=Ebnf-Visualizer), но не нашел для ABNF,

person Kamarey    schedule 04.04.2010
comment
Вы можете использовать instaparse.mojombo.com. Выбор abnf на панели Option в правом нижнем углу страницы - person Genarito; 17.03.2021

Разумным выбором было бы использовать EBNF, поскольку это стандарт ISO: ISO / IEC 14977: 1996 (E) [pdf]. В качестве примера он используется для удобной для человека текстовой нотации UML компании OMG.

person Hibou57    schedule 16.02.2014

Вы можете достичь желаемого, используя любой из них, но каждый из них краток и эффективен для представления вашего языка в зависимости от того, из каких функций он состоит.

Я прочитал BNF, EBNF и ABNF из википедии, где описаны некоторые различия и почему EBNF и ABNF появились на основе BNF.

person Mahesh Velaga    schedule 04.04.2010

person davidhcefx    schedule 28.05.2021