Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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.

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

Ответ 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