□ [a-zA-z], [#x N -#x N ]— соответствует символу указанного интервала. К примеру, [a-f]соответствует любому из символов а, b, с, d, e, f.
□ [abc], [#x N #x N #x N ]— соответствует любому из перечисленных символов. Например, [#х410#х411#х412]соответствует любому из символов А, Б, В. Символьные интервалы и перечисления могут использоваться совместно в одних квадратных скобках.
□ [^a-z], [^#х N -#x N ]— соответствует любому символу, кроме символов указанного интервала. К примеру, [^#х410-#x42F]соответствует любому символу, кроме заглавных букв русского алфавита.
□ [^abc], [^#x N #x N #x N ]— соответствует любому, кроме перечисленных символов. Например, [^xyz]соответствует любому символу, кроме символов x, yи z. Аналогично разрешенным интервалам и последовательностям символов, запрещенные интервалы и последовательности также могут использоваться совместно.
□ "строка"— соответствует строке, которая приведена в двойных кавычках. Например, "stylesheet"соответствует строке stylesheet.
□ 'строка'— соответствует строке, которая приведена в одинарных кавычках. Например, 'template'соответствует строке template.
Терминалы могут использоваться совместно с нетерминальными конструкциями в более сложных выражениях.
□ A?означает, что выражение Aнеобязательно и может быть пропущено.
□ A | Bсоответствует либо выражению A, либо выражению B, но не им обоим одновременно (строгое "или"). Выражения такого вида называют иначе выбором .
□ A Bозначает, что за выражением Aследует выражение B. Последовательность имеет приоритет по сравнению с выбором — A B | C Dозначает последовательность выражений Aи Bили последовательность выражений Cи D.
□ A - Bсоответствует строке, которая соответствует выражению A, но не выражению B.
□ A+означает последовательность из одного или более выражения A. Оператор " +" в EBNF старше оператора выбора, A+ | B+означает последовательность из одного или более выражения Aили последовательность из одного или более выражения B.
□ A*означает последовательность из нуля или более выражений A. Аналогично оператору " +", оператор " *" старше оператора выбора
□ ( выражение )— круглые скобки используются для группировки выражений. Выражения, заключенные в скобки, рассматриваются, как отдельная единица, которая может быть свободно использована в приведенных выше конструкциях. Например, выражение A B C | B C | A D C | D C | Cможно переписать в виде (A? (B | D) ) C.
Нотация расширенных форм Бэкуса-Наура может с первого взгляда показаться очень сложной, однако, на самом деле это не так. Достаточно разобрать несколько примеров, как все встанет на свои места.
Пример
Рассмотрим реальную продукцию Digitsязыка XPath. Digits— это последовательность из нескольких цифр от 0до 9и определяется она следующим образом:
Digits ::= [0-9] +
Как правило, продукции в спецификациях языков пронумерованы для того, чтобы было легче на них ссылаться. Мы будем по возможности приводить эти номера так, как они указаны в технических рекомендациях — в квадратных скобках, например:
[31] Digits ::= [0-9]+
При помощи продукции Digits определяется такая продукция, как Number, которая соответствует числу. Число — это последовательность цифр, разделенная точкой на целую и дробную части:
[30] Number ::= Digits ('.' Digits?)?
| '.' Digits
Чтобы лучше понять EBNF, попробуем немного упростить эту продукцию. Выражение Digits?внутри круглых скобок означает, что Digitsможет как присутствовать, так и быть опущенным, то есть ('.' Digits?) ?равносильно '.' ? | ('.' Digits)?. Повторяя еще раз подобное упрощение с каждым из полученных выражений, в итоге преобразуем правило Numberк виду:
Number ::= Digits
| Digits '.' Digits
| Digits '.'
| '.' Digits
Следовательно, число имеет четыре варианта синтаксиса:
□ последовательность цифр, например 12345;
□ последовательность цифр, разделенная точкой на целую и дробную части, например 3.14;
□ последовательность цифр, заканчивающаяся точкой, например 6.— что эквивалентно 6.0;
Читать дальше