<!-- delta zeta lambda xi upsilon-->
</vertex>
<vertex name='mu' connects='epsilon'>
<!-- epsilon mu nu tau-->
</vertex>
<vertex name='nu' connects='epsilon'>
<!-- epsilon mu nu tau-->
</vertex>
<vertex name='xi' connects='lambda'>
<!-- delta lambda xi-->
</vertex>
<vertex name='tau' connects='alpha theta iota epsilon'>
<!-- alpha epsilon theta iota mu nu tau upsilon-->
</vertex>
<vertex name='upsilon' connects='beta iota kappa delta'>
<!-- beta delta zeta iota kappa lambda tau upsilon-->
</vertex>
</vertices>
Базовые продукции XPath
В этом разделе мы приведем базовые синтаксические правила языка XPath. Со многими из них мы уже встречались в правилах более высокого уровня, некоторые определены в спецификации для того, чтобы облегчить реализацию лексического разбора XPath-выражений в различных процессорах.
Литералы — это строковые значения, заключенные в одинарные или двойные кавычки. В литералах нельзя использовать символ кавычек, в которые они заключены. Кроме этого, поскольку XPath-выражения чаще всего используются в атрибутах элементов, в них нельзя использовать символы '<
' и '&
' — они должны заменяться на сущности. Литералам соответствует продукция Literal
, определяемая в виде:
[XP29] Literal ::= ''' [^']* ''' | ''' [^']* '''
XPath использует десятичную систему счисления. Наборы цифр, соответствующие правилу Digits
, могут состоять из цифр от 0
до 9
:
[XP31] Digits ::= [0-9]+
Число в XPath состоит из последовательности цифр, которые могут быть разделены точкой, причем точка может стоять как в начале числа (.5
), так и в конце (5.
). Числу соответствует EBNF-правило Number
:
[XP30] Number ::= Digits ('.' Digits?)? | '.' Digits
Оператору умножения соответствует символ '*
' и синтаксическое правило MultiplyOperator
:
[XP34] MultiplyOperator ::= '*'
Именам переменных, которые используются в XPath, предшествует символ '$
'. Сами же имена должны удовлетворять продукции QName
, которую мы рассматривали
[XP36] VariableReference ::= '$' QName
Продукция NodeType
, использованная в тесте узла (
), определяет типы узлов, которые можно проверить при тесте — comment
(комментарий), text
(текстовый узел), processing-instruction
(узел инструкции по обработке) и node
(узел любого типа). NodeType
записывается следующим образом:
[XP38] NodeType ::= 'comment'
| 'text'
| 'processing-instruction'
| 'node'
Другая конструкция, NameTest
, которая также используется в тесте узла, проверяет узлы базового типа оси на соответствие определенному имени. EBNF-правило NameTest
имеет следующий синтаксис:
[ХР37] NameTest ::= '*' | NCName ':' '*' | QName
Имя функции в XPath может быть любым корректным XML-именем за исключением тех имен, которые используются для обозначения типов узлов. Правило FunctionName
имеет вид:
[XP35] FunctionName ::= QName - NodeType
В целях удобочитаемости, в выражениях можно использовать пробельное пространство. Ему соответствует EBNF-правило ExprWhiteSpace
:
[XP39] ExprWhitespace ::= S
Разбор XPath-выражений
Хотя синтаксис языка XPath укладывается в тридцать с небольшим синтаксических правил, реализация интерпретатора XPath-выражений может быть довольно непростой задачей. Для того чтобы хоть как-то упростить ее, в XPath определяются так называемые токены выражения (англ. expression token). Токены — это единицы, из которых состоит выражение. Будучи сами очень простыми, они выстраиваются в более сложные конструкции, образуя, в итоге, выражения.
Примером токенов являются операторы, которым соответствуют продукции Operator
и OperatorName
:
[XP33] OperatorName ::= 'and' | 'or' | 'mod* | 'div'
[XP32] Operator ::= OperatorName
| MultiplyOperator
| '/' | '//' | '|' | '+' | '-'
| '=' | '!=' | '<' | '>' | '<=' | '>='
Продукция самого токена выражения имеет вид:
[ХР28] ExprToken ::= '(' | ')' | '[' | ']'
| ' . ' | ' .. ' | '@' | ' | ':: '
| NameTest
| NodeType
| Operator
| FunctionName
| AxisName
| Literal
| Number
| VariableReference
При разборе XPath-выражения оно сначала разбивается на отдельные токены, а затем из них организуются более сложные структуры. При разбивке выражения на отдельные токены, следует всегда выбирать токен с самым длинным строковым представлением.