Я хочу придумать синтаксис языка. Я прочитал немного об этих трех и не могу видеть ничего, что можно сделать, а другое не может. Есть ли причина использовать один над другим? Или это просто вопрос предпочтения?
BNF против EBNF против ABNF: что выбрать?
Ответ 1
Вы должны думать о 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 как языка выбора для вашей грамматики облегчит вашу работу, поскольку вы будете более выразительны, не заполняя грамматику бесполезными символами который будет генерироваться в любом случае вашим генератором синтаксического анализатора, но вы не будете заботиться о них!
Ответ 2
Согласно Википедии, строчные литералы 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.
Ответ 3
EBNF - это расширенная/более новая версия BNF, поэтому проблема становится проще: EBNF и ABNF. Я не эксперт, но думаю, что он должен зависеть от языка, синтаксис которого вы хотите определить. Также есть некоторые визуализаторы для EBNF (http://www.google.co.il/search?sourceid=chrome&ie=UTF-8&q=Ebnf-Visualizer), но не видел никаких для ABNF,
Ответ 4
Разумный выбор предложил бы пойти с EBNF по той причине, что это стандарт ISO: ISO/IEC 14977: 1996 (E) [ PDF]. Например, он использовался для текстовой нотации OMG UML.
Ответ 5
Вы можете достичь того, чего хотите, используя любой из них, но каждый из них является кратким и эффективным в представлении вашего языка в зависимости от того, каковы функции, из которых состоит ваш язык.
Я прочитал BNF, EBNF и ABNF из википедии, и он описал некоторые различия и почему EBNF и ABNF вошли в картину на основе BNF