eu.cdevreeze.xpathparser.ast

Type members

Classlikes

sealed trait AbbrevForwardStep extends ForwardStep
case object AbbrevReverseStep extends ReverseStep
sealed trait AdditionOp extends XPathElem with LeafElem
Companion
object
object AdditionOp
Companion
class
sealed trait AdditiveExpr extends SimpleRangeExpr

Additive expression. Addition/subtraction is left-associative.

Additive expression. Addition/subtraction is left-associative.

Companion
object
object AdditiveExpr
Companion
class
sealed trait AndExpr extends SimpleOrExpr

And-expression. The "and" operator is associative, so the AST could have been left-associative or right-associative.

And-expression. The "and" operator is associative, so the AST could have been left-associative or right-associative.

Companion
object
object AndExpr
Companion
class
case object AnyArrayTest extends ArrayTest with LeafElem
case object AnyAttributeTest extends AttributeTest with LeafElem
case object AnyElementTest extends ElementTest with LeafElem
case object AnyFunctionTest extends FunctionTest with LeafElem
case object AnyItemType extends ItemType with LeafElem
case object AnyKindTest extends KindTest with LeafElem
case object AnyMapTest extends MapTest with LeafElem
case object AnyWildcard extends Wildcard with LeafElem
sealed trait Argument extends XPathElem
final case class ArgumentList(arguments: IndexedSeq[Argument]) extends Postfix
case object ArgumentPlaceholder extends Argument with LeafElem
sealed trait ArrayConstructor extends PrimaryExpr
sealed trait ArrayTest extends ItemType
sealed trait ArrowExpr extends SimpleCastExpr

Arrow expression. The arrow operator is left-associative.

Arrow expression. The arrow operator is left-associative.

Companion
object
object ArrowExpr
Companion
class
final case class ArrowFunctionCall(arrowFunctionSpecifier: ArrowFunctionSpecifier, argumentList: ArgumentList) extends XPathElem
sealed trait ArrowFunctionSpecifier extends XPathElem
final case class AtomicOrUnionType(tpe: EQName) extends ItemType with LeafElem
final case class AttributeAxisAbbrevForwardStep(nodeTest: NodeTest) extends AbbrevForwardStep
final case class AttributeNameAndTypeTest(name: EQName, tpe: EQName) extends AttributeTest with LeafElem
final case class AttributeNameTest(name: EQName) extends AttributeTest with LeafElem
sealed trait AttributeTest extends KindTest
final case class AttributeTypeTest(tpe: EQName) extends AttributeTest with LeafElem
sealed trait AxisStep extends StepExpr

Axis step. For example: "child::book[@pageCount > 800]". The "[]" operator for adding predicates is left-associative.

Axis step. For example: "child::book[@pageCount > 800]". The "[]" operator for adding predicates is left-associative.

final case class BracedUriLiteral(namespaceOption: Option[String])

Braced URI literal.

Braced URI literal.

Companion
object
Companion
class
sealed trait CastExpr extends SimpleCastableExpr
Companion
object
object CastExpr
Companion
class
sealed trait CastableExpr extends SimpleTreatExpr
Companion
object
object CastableExpr
Companion
class
case object CommentTest extends KindTest with LeafElem
sealed trait Comp extends XPathElem with LeafElem
sealed trait ComparisonExpr extends SimpleAndExpr

Comparison expression, where the optional comparison operator is a value comparison operator, general comparison operator or node comparison operator.

Comparison expression, where the optional comparison operator is a value comparison operator, general comparison operator or node comparison operator.

final case class CompoundAdditiveExpr(init: AdditiveExpr, op: AdditionOp, lastMultiplicativeExpr: MultiplicativeExpr) extends AdditiveExpr
final case class CompoundAndExpr(firstComparisonExpr: ComparisonExpr, remainingComparisonExprs: NonEmptyVector[ComparisonExpr]) extends AndExpr
final case class CompoundArrowExpr(unaryExpr: UnaryExpr, arrowFunctionCalls: NonEmptyVector[ArrowFunctionCall]) extends ArrowExpr
final case class CompoundCastExpr(arrowExpr: ArrowExpr, singleType: SingleType) extends CastExpr
final case class CompoundCastableExpr(castExpr: CastExpr, singleType: SingleType) extends CastableExpr
final case class CompoundComparisonExpr(stringConcatExpr1: StringConcatExpr, comp: Comp, stringConcatExpr2: StringConcatExpr) extends ComparisonExpr
final case class CompoundExpr(firstExprSingle: ExprSingle, remainingExprSingleSeq: NonEmptyVector[ExprSingle]) extends Expr
final case class CompoundInstanceOfExpr(treatExpr: TreatExpr, sequenceType: SequenceType) extends InstanceOfExpr
final case class CompoundOrExpr(firstAndExpr: AndExpr, remainingAndExprs: NonEmptyVector[AndExpr]) extends OrExpr
final case class CompoundPostfixExpr(primaryExpr: PrimaryExpr, postfixes: NonEmptyVector[Postfix]) extends PostfixExpr
final case class CompoundRangeExpr(additiveExpr1: AdditiveExpr, additiveExpr2: AdditiveExpr) extends RangeExpr
final case class CompoundRelativePathExpr(init: RelativePathExpr, op: StepOp, lastStepExpr: StepExpr) extends RelativePathExpr
final case class CompoundSimpleMapExpr(firstPathExpr: PathExpr, remainingPathExprs: NonEmptyVector[PathExpr]) extends SimpleMapExpr
final case class CompoundStringConcatExpr(firstRangeExpr: RangeExpr, remainingRangeExprs: NonEmptyVector[RangeExpr]) extends StringConcatExpr
final case class CompoundTreatExpr(castableExpr: CastableExpr, sequenceType: SequenceType) extends TreatExpr
final case class CompoundUnaryExpr(ops: NonEmptyVector[UnaryOp], valueExpr: ValueExpr) extends UnaryExpr
final case class CompoundUnionExpr(firstIntersectExceptExpr: IntersectExceptExpr, remainingIntersectExceptExprs: NonEmptyVector[IntersectExceptExpr]) extends UnionExpr
case object ContextItemExpr extends PrimaryExpr with LeafElem
final case class CurlyArrayConstructor(expr: EnclosedExpr) extends ArrayConstructor
final case class DataPITest(data: StringLiteral) extends PITest
final case class DecimalLiteral(value: BigDecimal) extends NumericLiteral with LeafElem
sealed trait DocumentTest extends KindTest
final case class DocumentTestContainingElementTest(elementTest: ElementTest) extends DocumentTest
final case class DocumentTestContainingSchemaElementTest(schemaElementTest: SchemaElementTest) extends DocumentTest
final case class DoubleLiteral(value: Double) extends NumericLiteral with LeafElem
sealed trait EQName

EQName, so either a URIQualifiedName or a QName.

EQName, so either a URIQualifiedName or a QName.

Companion
object
object EQName
Companion
class
final case class ElementNameAndTypeTest(name: EQName, tpe: EQName) extends ElementTest with LeafElem
final case class ElementNameTest(name: EQName) extends ElementTest with LeafElem
sealed trait ElementTest extends KindTest
final case class ElementTypeTest(tpe: EQName) extends ElementTest with LeafElem
case object EmptySequenceType extends SequenceType with LeafElem
final case class EnclosedExpr(exprOption: Option[Expr]) extends XPathElem

Optional expression enclosed in braces.

Optional expression enclosed in braces.

final case class ExactlyOneSequenceType(itemType: ItemType) extends SequenceType
sealed trait Expr extends XPathExpr

Expression, which is a sequence of 1 or more ExprSingle objects, separated by commas. The "comma" operator is associative, so the AST could have been left-associative or right-associative.

Expression, which is a sequence of 1 or more ExprSingle objects, separated by commas. The "comma" operator is associative, so the AST could have been left-associative or right-associative.

Companion
object
object Expr
Companion
class
sealed trait ExprSingle extends SimpleExpr

Expression-single, that is, an expression without any top-level commas. Most XPath expressions are expression-singles.

Expression-single, that is, an expression without any top-level commas. Most XPath expressions are expression-singles.

final case class ExprSingleArgument(exprSingle: ExprSingle) extends Argument
final case class ForExpr(simpleForBindings: NonEmptyVector[SimpleForBinding], returnExpr: ExprSingle) extends ExprSingle with VariableIntroducingExpr
sealed trait ForwardAxis extends XPathElem with LeafElem
Companion
object
object ForwardAxis
Companion
class
final case class ForwardAxisStep(step: ForwardStep, predicateList: IndexedSeq[Predicate]) extends AxisStep
sealed trait ForwardStep extends XPathElem
final case class FunctionCall(functionName: EQName, argumentList: ArgumentList) extends PrimaryExpr
sealed trait FunctionItemExpr extends PrimaryExpr
sealed trait FunctionTest extends ItemType
sealed trait GeneralComp extends Comp
Companion
object
object GeneralComp
Companion
class
final case class IfExpr(condition: Expr, thenExpr: ExprSingle, elseExpr: ExprSingle) extends ExprSingle
final case class InlineFunctionExpr(paramListOption: Option[ParamList], resultTypeOption: Option[SequenceType], body: EnclosedExpr) extends FunctionItemExpr
Companion
object
Companion
class
final case class IntegerLiteral(value: BigInt) extends NumericLiteral with LeafElem

Intersect or except expression, optionally using the "intersect" or "except" operator. These operators are left-associative.

Intersect or except expression, optionally using the "intersect" or "except" operator. These operators are left-associative.

Companion
object
Companion
class
sealed trait IntersectExceptOp extends XPathElem with LeafElem
Companion
object
Companion
class
sealed trait ItemType extends XPathElem
sealed trait KeySpecifier extends XPathElem
sealed trait KindTest extends NodeTest
final case class KindTestItemType(kindTest: KindTest) extends ItemType
sealed trait LeafElem extends XPathElem

Any leaf element in the AST of an XPath expression.

Any leaf element in the AST of an XPath expression.

final case class LetExpr(simpleLetBindings: NonEmptyVector[SimpleLetBinding], returnExpr: ExprSingle) extends ExprSingle with VariableIntroducingExpr
sealed trait Literal extends PrimaryExpr
final case class LocalNameWildcard(localName: NCName) extends Wildcard with LeafElem
final case class MapConstructor(entries: IndexedSeq[MapConstructorEntry]) extends PrimaryExpr
final case class MapConstructorEntry(keyExpr: ExprSingle, valueExpr: ExprSingle) extends XPathElem
sealed trait MapTest extends ItemType

Multiplicative expression. The corresponding multiplication/division operators are left-associative.

Multiplicative expression. The corresponding multiplication/division operators are left-associative.

Companion
object
Companion
class
sealed trait MultiplicativeOp extends XPathElem with LeafElem
Companion
object
Companion
class
final case class NCName(name: String)

NCName, that is, a non-colon name.

NCName, that is, a non-colon name.

Companion
object
object NCName
Companion
class
sealed trait NameTest extends NodeTest
final case class NamedFunctionRef(functionName: EQName, arity: BigInt) extends FunctionItemExpr with LeafElem
final case class NamedKeySpecifier(ncName: NCName) extends KeySpecifier with LeafElem
object Names

Names, as per the XML specification. See for example https://www.w3.org/TR/REC-xml/#NT-Name.

Names, as per the XML specification. See for example https://www.w3.org/TR/REC-xml/#NT-Name.

Only characters in the Unicode BMP (max. \uFFFF) are considered. So the range from #x10000 to #xEFFFF is not recognized as valid name characters in this implementation.

The functions of this class must be fast, because they are typically called very many times during parsing of XPath expressions.

Classes like NCName lean on this object. An NCName is an XML name without colon.

case object NamespaceNodeTest extends KindTest with LeafElem
final case class NamespaceWildcard(bracedUriLiteral: BracedUriLiteral) extends Wildcard with LeafElem
final case class NillableElementNameAndTypeTest(name: EQName, tpe: EQName) extends ElementTest with LeafElem
final case class NillableElementTypeTest(tpe: EQName) extends ElementTest with LeafElem
sealed trait NodeComp extends Comp
Companion
object
object NodeComp
Companion
class
sealed trait NodeTest extends XPathElem
final case class NonAbbrevForwardStep(forwardAxis: ForwardAxis, nodeTest: NodeTest) extends ForwardStep
final case class NonAbbrevReverseStep(reverseAxis: ReverseAxis, nodeTest: NodeTest) extends ReverseStep
final case class NonEmptySingleType(name: EQName) extends SingleType with LeafElem
sealed trait NumericLiteral extends Literal
final case class OneOrMoreSequenceType(itemType: ItemType) extends SequenceType
sealed trait OrExpr extends ExprSingle

Or-expression. The "or" operator is associative, so the AST could have been left-associative or right-associative.

Or-expression. The "or" operator is associative, so the AST could have been left-associative or right-associative.

Companion
object
object OrExpr
Companion
class
sealed trait PITest extends KindTest
final case class Param(paramName: EQName, typeDeclarationOption: Option[TypeDeclaration]) extends XPathElem
final case class ParamList(params: IndexedSeq[Param]) extends XPathElem
final case class ParenthesizedExpr(exprOption: Option[Expr]) extends PrimaryExpr
final case class ParenthesizedExprKeySpecifier(parenthesizedExpr: ParenthesizedExpr) extends KeySpecifier
final case class ParenthesizedItemType(itemType: ItemType) extends ItemType
sealed trait PathExpr extends SimpleSimpleMapExpr

Path expression, so a relative path expression possibly preceded by "/" or "//" (or the expression "/" itself). Path expressions are used to locate nodes within trees.

Path expression, so a relative path expression possibly preceded by "/" or "//" (or the expression "/" itself). Path expressions are used to locate nodes within trees.

final case class PathExprStartingWithDoubleSlash(relativePathExpr: RelativePathExpr) extends PathExpr
final case class PathExprStartingWithSingleSlash(relativePathExpr: RelativePathExpr) extends PathExpr
final case class PositionalKeySpecifier(integerLiteral: IntegerLiteral) extends KeySpecifier
sealed trait Postfix extends XPathElem
sealed trait PostfixExpr extends StepExpr

Postfix expression, which is a primary expression succeeded by 0 or more predicates, arguments lists and/or lookups. Note that lookup (the "?" operator) is left-associative.

Postfix expression, which is a primary expression succeeded by 0 or more predicates, arguments lists and/or lookups. Note that lookup (the "?" operator) is left-associative.

Companion
object
object PostfixExpr
Companion
class
final case class PostfixLookup(keySpecifier: KeySpecifier) extends Postfix
final case class PotentiallyEmptySingleType(name: EQName) extends SingleType with LeafElem
final case class Predicate(expr: Expr) extends Postfix
final case class PrefixWildcard(prefix: NCName) extends Wildcard with LeafElem
sealed trait PrimaryExpr extends SimplePostfixExpr

Primary expression, which are the basic primitives of the language. Examples are literals, variable references, function calls etc. Note that primary expressions can be rather simple but they do not have to be simple. For example, function calls can have arguments that are themselves quite complex expressions.

Primary expression, which are the basic primitives of the language. Examples are literals, variable references, function calls etc. Note that primary expressions can be rather simple but they do not have to be simple. For example, function calls can have arguments that are themselves quite complex expressions.

final case class QuantifiedExpr(quantifier: Quantifier, simpleBindings: NonEmptyVector[SimpleBindingInQuantifiedExpr], satisfiesExpr: ExprSingle) extends ExprSingle with VariableIntroducingExpr
sealed trait Quantifier extends XPathElem with LeafElem
Companion
object
object Quantifier
Companion
class
sealed trait RangeExpr extends SimpleStringConcatExpr

Range expression, where the optional range uses keyword "to" as operator.

Range expression, where the optional range uses keyword "to" as operator.

sealed trait RelativePathExpr extends PathExpr

Relative path expression, consisting of a number of step expressions separated by step operators ("/" and "//"). These step operators are left-associative.

Relative path expression, consisting of a number of step expressions separated by step operators ("/" and "//"). These step operators are left-associative.

Companion
object
Companion
class
sealed trait ReverseAxis extends XPathElem with LeafElem
Companion
object
object ReverseAxis
Companion
class
final case class ReverseAxisStep(step: ReverseStep, predicateList: IndexedSeq[Predicate]) extends AxisStep
sealed trait ReverseStep extends XPathElem
final case class SchemaAttributeTest(name: EQName) extends KindTest with LeafElem
final case class SchemaElementTest(name: EQName) extends KindTest with LeafElem
sealed trait SequenceType extends XPathElem
final case class SimpleAbbrevForwardStep(nodeTest: NodeTest) extends AbbrevForwardStep
sealed trait SimpleAdditiveExpr extends AdditiveExpr
sealed trait SimpleAndExpr extends AndExpr
sealed trait SimpleArrowExpr extends ArrowExpr
final case class SimpleBindingInQuantifiedExpr(varName: EQName, expr: ExprSingle) extends VariableBinding
sealed trait SimpleCastExpr extends CastExpr
sealed trait SimpleCastableExpr extends CastableExpr
case object SimpleDocumentTest extends DocumentTest with LeafElem
sealed trait SimpleExpr extends Expr
final case class SimpleForBinding(varName: EQName, expr: ExprSingle) extends VariableBinding
final case class SimpleLetBinding(varName: EQName, expr: ExprSingle) extends VariableBinding
sealed trait SimpleMapExpr extends ValueExpr

Simple map expression, using the optional map operator ("!"). This operator is left-associative.

Simple map expression, using the optional map operator ("!"). This operator is left-associative.

Companion
object
Companion
class
final case class SimpleNameTest(name: EQName) extends NameTest with LeafElem
sealed trait SimpleOrExpr extends OrExpr
case object SimplePITest extends PITest with LeafElem
sealed trait SimplePostfixExpr extends PostfixExpr
sealed trait SimpleRangeExpr extends RangeExpr
sealed trait SimpleSimpleMapExpr extends SimpleMapExpr
sealed trait SimpleTreatExpr extends TreatExpr
sealed trait SimpleUnaryExpr extends UnaryExpr
sealed trait SimpleUnionExpr extends UnionExpr
sealed trait SingleType extends XPathElem
case object SlashOnlyPathExpr extends PathExpr with LeafElem
final case class SquareArrayConstructor(members: IndexedSeq[ExprSingle]) extends ArrayConstructor
sealed trait StepExpr extends SimpleRelativePathExpr

Single step in an absolute or relative path expression. Note that step expressions are either postfix expressions or axis steps.

Single step in an absolute or relative path expression. Note that step expressions are either postfix expressions or axis steps.

sealed trait StepOp extends XPathElem with LeafElem
Companion
object
object StepOp
Companion
class

String concatenation expression, where the optional string concatenation uses the "||" operator. String concatenation is left-associative.

String concatenation expression, where the optional string concatenation uses the "||" operator. String concatenation is left-associative.

Companion
object
Companion
class
final case class StringLiteral(value: String) extends Literal with LeafElem
final case class TargetPITest(target: NCName) extends PITest with LeafElem
case object TextTest extends KindTest with LeafElem
sealed trait TreatExpr extends SimpleInstanceOfExpr
Companion
object
object TreatExpr
Companion
class
final case class TypeDeclaration(tpe: SequenceType) extends XPathElem
final case class TypedArrayTest(elementType: SequenceType) extends ArrayTest
final case class TypedFunctionTest(argumentTypes: IndexedSeq[SequenceType], resultType: SequenceType) extends FunctionTest
final case class TypedMapTest(keyType: AtomicOrUnionType, valueType: SequenceType) extends MapTest
sealed trait UnaryExpr extends SimpleArrowExpr

Unary expression. The corresponding unary operators are right-associative.

Unary expression. The corresponding unary operators are right-associative.

Companion
object
object UnaryExpr
Companion
class
final case class UnaryLookup(keySpecifier: KeySpecifier) extends PrimaryExpr
sealed trait UnaryOp extends XPathElem with LeafElem
Companion
object
object UnaryOp
Companion
class
sealed trait UnionExpr extends SimpleMultiplicativeExpr

Union expression, where the optional union uses operator "union" or "|". The union operator is associative, so the AST could have been left-associative or right-associative.

Union expression, where the optional union uses operator "union" or "|". The union operator is associative, so the AST could have been left-associative or right-associative.

Companion
object
object UnionExpr
Companion
class
sealed trait ValueComp extends Comp
Companion
object
object ValueComp
Companion
class
sealed trait ValueExpr extends SimpleUnaryExpr
final case class VarRef(varName: EQName) extends PrimaryExpr with LeafElem
sealed trait VariableBinding extends XPathElem

Binding of a variable name to an expression.

Binding of a variable name to an expression.

sealed trait VariableIntroducingExpr extends XPathElem

XPathElem that can introduce one or more variable bindings.

XPathElem that can introduce one or more variable bindings.

sealed trait Wildcard extends NameTest
case object WildcardKeySpecifier extends KeySpecifier with LeafElem
sealed trait XPathElem extends ElemLike[XPathElem]

XPath 3.1 AST. The root of the type hierarchy is XPathElem. It offers the ElemApi query API.

XPath 3.1 AST. The root of the type hierarchy is XPathElem. It offers the ElemApi query API.

The requirements on this AST are as follows:

  • It must represent the syntax tree of a successfully parsed XPath expression

  • It is not annotated with more semantic information, like type information that is not included in the XPath expression

  • It does not know anything about the context in which it runs, like bound namespaces etc.

  • It is rich enough to be able to serialize the AST back to XPath, knowing exactly where to place parentheses, braces, etc.

  • It should help evaluation, so it should model operator associativity and precedence correctly, where feasible

  • It must be readable in that object composition trees are not unnecessarily deep and therefore hard to comprehend

  • Serialization of the AST to XPath may lead to differences in whitespace (and operator aliases), but other than that the result must be the same

  • The AST class hierarchy does not have to use the exact same names as the XPath grammar

  • Instances of the AST classes are easy to create in an ad-hoc manner, so they contain no parsing state

  • The AST classes are case classes, with value equality and good support for pattern matching

It would be natural for the AST types to have IS-A relationships modeled as type inheritance, and HAS-A relationships modeled as composition. Where feasible, this approach has been followed. Consequently, sealed trait inheritance has been used a lot (IS-A instead of HAS-A), and unnecessarily deep object trees are prevented in this way.

Having such an AST of a successfully parsed XPath expression, it must be easy to reliably find used namespace prefixes, for example.

The AST, as well as the parser, were developed using the XPath 3.1 specification as input. In particular, see https://www.w3.org/TR/xpath-31/#id-grammar and https://www.w3.org/TR/xpath-31/#id-precedence-order. Note that the grammar in isolation does not clearly convey left or right associativity of operators, so the extra information about operator precedence and associativity is essential for understanding the "structure" of compound expressions.

TODO Improve several class names.

sealed trait XPathExpr extends XPathElem

XPath expression.

XPath expression.

final case class ZeroOrMoreSequenceType(itemType: ItemType) extends SequenceType
final case class ZeroOrOneSequenceType(itemType: ItemType) extends SequenceType