>[30] Number ::= Digits ('.' Digits?)?
> | '.' Digits
Чтобы лучше понять EBNF, попробуем немного упростить эту продукцию. Выражение >Digits?
внутри круглых скобок означает, что >Digits
может как присутствовать, так и быть опущенным, то есть >('.' Digits?) ?
равносильно >'.' ? | ('.' Digits)?
. Повторяя еще раз подобное упрощение с каждым из полученных выражений, в итоге преобразуем правило >Number
к виду:
>Number ::= Digits
> | Digits '.' Digits
> | Digits '.'
> | '.' Digits
Следовательно, число имеет четыре варианта синтаксиса:
□ последовательность цифр, например >12345
;
□ последовательность цифр, разделенная точкой на целую и дробную части, например >3.14
;
□ последовательность цифр, заканчивающаяся точкой, например >6.
— что эквивалентно >6.0
;
□ последовательность цифр, начинающаяся точкой, например >.5
, что эквивалентно >0.5
.
Разберем еще одну продукцию языка XPath — определение литерала. Литерал в XPath — это последовательность символов, заключаемая в одинарные или двойные кавычки, которая используется в качестве строкового параметра в функциях и т.д. Единственным и вполне логичным ограничением на синтаксис литерала является то, что он не может содержать символ собственных кавычек — в этом случае непонятно, где же на самом деле литерал кончается, а где начинается (например, >'ab'cd'
).
Конструкция >Literal
задается следующим образом:
>[29] Literal ::= '"' [^"]* '"'
> | "'" [^']* "'"
В первом случае синтаксис литерала начинается двойными кавычками (>'"'
), затем идет последовательность, состоящая из любых символов, кроме двойных кавычек (>[^"]*
), затем закрывающие двойные кавычки (>'"'
). Во втором случае синтаксис имеет точно такой же вид с точностью до замены одинарных кавычек двойными и наоборот.
Другим очень часто используемым правилом является правило, определяющее пробельное пространство (англ. space или whitespace). Пробельными символами в XML-языках считаются такие символы, как табуляция, перевод строки, возврат каретки и сам пробел. Продукция >S
пробельного пространства задается, как последовательность из одного или более пробельного символа:
>[3] S ::= (#х20 | #х9 | #xD | #хА)+
Как правило, EBNF-продукции языков XML-группы составлены довольно просто, но в некоторых случаях они разбиты на несколько правил, которые определены в разных частях спецификации. В таких случаях мы будем по возможности упрощать продукции, записывая их в раскрытом виде.