Skip to main content

sxd_xpath_visitor/
token.rs

1use std::string;
2
3use crate::node_test;
4use crate::OwnedPrefixedName;
5
6#[derive(Debug, Copy, Clone, PartialEq)]
7pub enum AxisName {
8    Ancestor,
9    AncestorOrSelf,
10    Attribute,
11    Child,
12    Descendant,
13    DescendantOrSelf,
14    Following,
15    FollowingSibling,
16    Namespace,
17    Parent,
18    Preceding,
19    PrecedingSibling,
20    SelfAxis,
21}
22
23#[derive(Debug, Clone, PartialEq)]
24pub enum NodeTestName {
25    Comment,
26    Text,
27    ProcessingInstruction(Option<string::String>),
28    Node,
29}
30
31#[derive(Debug, Clone, PartialEq)]
32pub enum Token {
33    And,
34    AtSign,
35    Comma,
36    CurrentNode,
37    Divide,
38    DoubleSlash,
39    Equal,
40    GreaterThan,
41    GreaterThanOrEqual,
42    LeftBracket,
43    LeftParen,
44    LessThan,
45    LessThanOrEqual,
46    Literal(string::String),
47    MinusSign,
48    Multiply,
49    NotEqual,
50    Number(f64),
51    Or,
52    ParentNode,
53    Pipe,
54    PlusSign,
55    Remainder,
56    RightBracket,
57    RightParen,
58    Slash,
59
60    // Specializations
61    Axis(AxisName),
62    Function(OwnedPrefixedName),
63    NameTest(node_test::NameTest),
64    NodeTest(NodeTestName),
65    Variable(OwnedPrefixedName),
66}
67
68impl Token {
69    pub fn precedes_node_test(&self) -> bool {
70        match *self {
71            Token::AtSign | Token::Axis(..) => true,
72            _ => false,
73        }
74    }
75
76    pub fn precedes_expression(&self) -> bool {
77        match *self {
78            Token::LeftParen | Token::LeftBracket => true,
79            _ => false,
80        }
81    }
82
83    pub fn is_operator(&self) -> bool {
84        match *self {
85            Token::Slash
86            | Token::DoubleSlash
87            | Token::PlusSign
88            | Token::MinusSign
89            | Token::Pipe
90            | Token::Equal
91            | Token::NotEqual
92            | Token::LessThan
93            | Token::LessThanOrEqual
94            | Token::GreaterThan
95            | Token::GreaterThanOrEqual
96            | Token::And
97            | Token::Or
98            | Token::Remainder
99            | Token::Divide
100            | Token::Multiply => true,
101            _ => false,
102        }
103    }
104}