Нотация EBNF определяет язык как набор синтаксических правил, определяющих нетерминалы (конструкции языка) через терминалы (символы языка), а также другие нетерминалы. Правило состоит из двух частей, разделенных символами ">::=
":
>конструкция ::= определение конструкции
В левой части правила стоит терминал определяемой конструкции, в правой — выражение, определяющее эту конструкцию. Правила EBNF также иногда называют продукциями, и мы тоже часто будем использовать этот термин, чтобы не путать эти правила с шаблонными правилами преобразований, которые главным образом и составляют преобразования в языке XSLT.
Терминалы, которые могут быть как отдельными символами, так и их последовательностями, определяются в нотации EBNF следующим образом:
□ >#xN
, где >N
— шестнадцатеричный код, соответствует символу Unicode с кодом >N
. Например, >#х410
соответствует символу >А
кириллического алфавита (см. раздел "Использование Unicode" главы 1).
□ >[a-zA-z]
, >[#xN-#xN]
— соответствует символу указанного интервала. К примеру, >[a-f]
соответствует любому из символов >а
, >b
, >с
, >d
, >e
, >f
.
□ >[abc]
, >[#xN#xN#xN]
— соответствует любому из перечисленных символов. Например, >[#х410#х411#х412]
соответствует любому из символов >А
, >Б
, >В
. Символьные интервалы и перечисления могут использоваться совместно в одних квадратных скобках.
□ >[^a-z]
, >[^#хN-#xN]
— соответствует любому символу, кроме символов указанного интервала. К примеру, >[^#х410-#x42F]
соответствует любому символу, кроме заглавных букв русского алфавита.
□ >[^abc]
, >[^#xN#xN#xN]
— соответствует любому, кроме перечисленных символов. Например, >[^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, которая соответствует числу. Число — это последовательность цифр, разделенная точкой на целую и дробную части: