Я хочу придумать синтаксис языка. Я немного читал об этих трех и не вижу ничего, что может сделать один, чего не может сделать другой. Есть ли причина использовать одно вместо другого? Или это просто вопрос предпочтений?
BNF vs EBNF vs ABNF: что выбрать?
Ответы (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 в качестве языка для вашей грамматики упростит вашу работу, поскольку вы будете более выразительны, не заполняя грамматику бесполезными символами, которые будут все равно генерируются вашим генератором парсеров, но они вам наплевать!
Согласно Википедии, строковые литералы 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
EBNF - это расширенная / новая версия BNF, поэтому проблема становится проще: EBNF против ABNF. Я не эксперт, но думаю, что это должно зависеть от языка, синтаксис которого вы хотите определить. Также есть несколько визуализаторов для EBNF (http://www.google.co.il/search?sourceid=chrome&ie=UTF-8&q=Ebnf-Visualizer), но не нашел для ABNF,
abnf
на панели Option в правом нижнем углу страницы
- person Genarito; 17.03.2021
Разумным выбором было бы использовать EBNF, поскольку это стандарт ISO: ISO / IEC 14977: 1996 (E) [pdf]. В качестве примера он используется для удобной для человека текстовой нотации UML компании OMG.
Вы можете достичь желаемого, используя любой из них, но каждый из них краток и эффективен для представления вашего языка в зависимости от того, из каких функций он состоит.
Я прочитал BNF, EBNF и ABNF из википедии, где описаны некоторые различия и почему EBNF и ABNF появились на основе BNF.
- ABNF has been extensively used on defining protocols, such as HTTP, RTSP and email.
- Being able to specify exact byte values such as
%x41-5A
can be useful when defining protocols. --mattmight
- Being able to specify exact byte values such as
- EBNF использовался для определения XML, а также некоторых языки программирования, такие как Python .