slac/
token.rs

1use crate::value::Value;
2
3/// A [`Token`] is the smallest logical unit evaluated by the compiler.
4#[rustfmt::skip]
5#[derive(Debug, PartialEq, PartialOrd, Clone)]
6pub enum Token {
7  // Single-character tokens
8  LeftParen, RightParen, 
9  LeftBracket, RightBracket, 
10  Plus, Minus, Star, Slash, 
11  Comma,
12  // One or two character tokens
13  Greater, GreaterEqual,
14  Less, LessEqual,
15  // Equality
16  Equal, NotEqual,
17  // Keywords
18  And, Or, Xor, Not, Div, Mod,
19  // Literal Values
20  Literal(Value),
21  Identifier(String)
22}
23
24/// The precedences used to order the operators evaluated in the
25/// [Pratt-Parser](https://en.wikipedia.org/wiki/Operator-precedence_parser#Pratt_parsing)
26/// when building the [`Expression`](crate::Expression) tree.
27#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
28pub enum Precedence {
29    None,
30    Or,         // or
31    And,        // and
32    Xor,        // xor
33    Equality,   // = <>
34    Comparison, // < > <= >=
35    Term,       // + -
36    Factor,     // * / div mod
37    Unary,      // not -
38    Call,       // ()
39    Primary,    // Literals
40}
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    /// Returns the next `Precendence` with wrap around to the first.
61    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}