Книга: Технология XSLT
Разбор XPath-выражений
Разбор 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-выражения оно сначала разбивается на отдельные токены, а затем из них организуются более сложные структуры. При разбивке выражения на отдельные токены, следует всегда выбирать токен с самым длинным строковым представлением.
Помимо этого, для того чтобы грамматика XPath-выражений была однозначной, в спецификации языка приводятся следующие правила разбора.
? Если текущему токену предшествует другой токен, причем этот предшествующий токен не является символом @
, ::
, (, [
или нетерминалом Operator
, то текущий токен, являющийся символом *
, должен восприниматься как знак умножения, а токен, являющийся NCName
, — как нетерминал OperatorName
.
? Если за текущим токеном вида NCName
следует открывающая круглая скобка (символ "("), токен должен восприниматься или как имя функции (FunctionName
), или как тип узла (NodeType
).
? Если за текущим токеном вида NCName
следуют символы "::
", токен должен восприниматься как имя оси навигации (AxisName
).
? Если ничего из вышеперечисленного не выполняется, токен не должен восприниматься, как MultiplyOperator
, OperatorName
, NodeType
, FunctionName
или AxisName
.
Мы привели эти правила в точности так, как они описаны в спецификации языка XPath. Их довольно непросто понять в такой формулировке, поэтому мы попытаемся объяснить их другими словами.
? Символ *
является знаком умножения (MultiplyOperator
) тогда и только тогда, когда ему предшествует токен, но этот токен не является токеном @
, ::
, (, [
или Operator
.
? Токен NCName
представляет имя оператора (OperatorName
) тогда и только тогда, когда ему предшествует токен, но этот токен не является токеном ::
, (, [
или Operator
.
? Токен NCName
является именем функции (FunctionName
) или типом узла (NodeType
) тогда и только тогда, когда за ним следует символ "(".
? Токен NCName
является именем оси навигации (AxisName
) тогда и только тогда, когда за ним следуют символы "::
".
- Виды выражений
- 4.12. Вычисление выражений
- 6.11. Вычисление арифметических выражений
- Глава 6 XPath-выражения
- Проверка выражений XPath
- 2.3. Разбор опций: getopt() и getopt_long()
- 3. Null-значения и общее правило вычисления выражений
- Как использовать технику разговорных выражений
- 15.1.3. XPath и другие интерфейсы
- Кошачьи разборки
- 2.23. Разбор данных, разделенных запятыми
- Поиск файлов с использованием регyлярных выражений