Старшинство операций
Теперь, когда мы изучили все типы операций XPath, можно дать синтаксическое определение выражению и выстроить все операции в порядке старшинства.
Выражению, как самой общей конструкции XPath, соответствует продукция Expr
, которая определяется следующим образом:
[XP14] Expr ::= OrExpr
То есть, фактически, выражение в XPath определяется через логическое выражение. Естественно, выражения не обязаны быть логическими. Просто в иерархии синтаксических правил логическое выражение "или" находится выше всего. Верхние правила определяются через более примитивные правила и так далее. В итоге иерархия выражений выстраивается следующим образом (в скобках приведены названия EBNF-правил):
выражения (Expr
);
логические выражения "или" (OrExpr
);
логические выражения "и" (AndExpr
);
выражения равенства и неравенства (EqualityExpr
);
выражения сравнения (RelationalExpr
);
выражения сложения и вычитания (AdditiveExpr
);
выражения умножения и деления (MultiplicativeExpr
);
унарные выражения (UnaryExpr
);
выражения объединения множеств (UnionExpr
);
выражения путей выборки (PathExpr
);
пути выборки (LocationPath
), фильтрация множеств (FilterExpr
), относительные пути выборки (RelativeLocationPath
).
По этой схеме несложно выяснить старшинство операций — чем ниже выражение находится в этой иерархии, тем выше его приоритет. Для полной ясности, перечислим операции в порядке старшинства от старших, с большим приоритетом, к младшим, с меньшим приоритетом выполнения:
операции с путями выборки;
операция объединения множеств (|
);
унарная операция отрицания (-
);
умножение, деление и вычисление остатка от деления (*
, div
и mod
);
операции сложения и вычитания (+
и -
);
операции сравнения (<
, >
, <=
, =>
);
операции проверки равенства и неравенства (=
и !=
);
операция "и" (and
);
операция "или" (or
).
Операции одного порядка имеют левую ассоциативность, как это было показано на примере с операциями сравнения (3 > 2 > 1
равносильно (3 > 2) >1
).