1use crate::value::Value;
2
3#[rustfmt::skip]
5#[derive(Debug, PartialEq, PartialOrd, Clone)]
6pub enum Token {
7 LeftParen, RightParen,
9 LeftBracket, RightBracket,
10 Plus, Minus, Star, Slash,
11 Comma,
12 Greater, GreaterEqual,
14 Less, LessEqual,
15 Equal, NotEqual,
17 And, Or, Xor, Not, Div, Mod,
19 Literal(Value),
21 Identifier(String)
22}
23
24#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
28pub enum Precedence {
29 None,
30 Or, And, Xor, Equality, Comparison, Term, Factor, Unary, Call, Primary, }
41
42impl From<&Token> for Precedence {
43 #[rustfmt::skip]
44 fn from(token: &Token) -> Self {
45 match token {
46 Token::Minus | Token::Plus => Precedence::Term,
47 Token::Star | Token::Slash | Token::Div | Token::Mod => Precedence::Factor,
48 Token::Equal | Token::NotEqual => Precedence::Equality,
49 Token::Greater | Token::GreaterEqual | Token::Less | Token::LessEqual => Precedence::Comparison,
50 Token::And => Precedence::And,
51 Token::Or => Precedence::Or,
52 Token::Xor => Precedence::Xor,
53 Token::LeftParen => Precedence::Call,
54 _ => Precedence::None,
55 }
56 }
57}
58
59impl Precedence {
60 pub fn next(self) -> Precedence {
62 match self {
63 Precedence::None => Precedence::Or,
64 Precedence::Or => Precedence::And,
65 Precedence::And => Precedence::Xor,
66 Precedence::Xor => Precedence::Equality,
67 Precedence::Equality => Precedence::Comparison,
68 Precedence::Comparison => Precedence::Term,
69 Precedence::Term => Precedence::Factor,
70 Precedence::Factor => Precedence::Unary,
71 Precedence::Unary => Precedence::Call,
72 Precedence::Call => Precedence::Primary,
73 Precedence::Primary => Precedence::None,
74 }
75 }
76}