BNF против EBNF против ABNF: что выбрать? - PullRequest
28 голосов
/ 04 апреля 2010

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

Ответы [ 5 ]

29 голосов
/ 04 апреля 2010

Вы должны думать о 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 в качестве языка выбора для вашей грамматики облегчит вашу работу, поскольку вы будете более выразительными, не заполняя свою грамматику бесполезными символами, которые будут в любом случае будет сгенерирован вашим генератором парсера, но вы не будете заботиться о них!

5 голосов
/ 26 апреля 2015

Согласно Википедии, строковые литералы 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

2 голосов
/ 04 апреля 2010

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

1 голос
/ 16 февраля 2014

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

0 голосов
/ 04 апреля 2010

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

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

...