use crate::value::Value;
#[rustfmt::skip]
#[derive(Debug, PartialEq, PartialOrd, Clone)]
pub enum Token {
LeftParen, RightParen,
LeftBracket, RightBracket,
Plus, Minus, Star, Slash,
Comma,
Greater, GreaterEqual,
Less, LessEqual,
Equal, NotEqual,
And, Or, Xor, Not, Div, Mod,
Literal(Value),
Identifier(String)
}
#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
pub enum Precedence {
None,
Or, And, Xor, Equality, Comparison, Term, Factor, Unary, Call, Primary, }
#[rustfmt::skip]
impl From<&Token> for Precedence {
fn from(token: &Token) -> Self {
match token {
Token::Minus | Token::Plus => Precedence::Term,
Token::Star | Token::Slash | Token::Div | Token::Mod => Precedence::Factor,
Token::Equal | Token::NotEqual => Precedence::Equality,
Token::Greater | Token::GreaterEqual | Token::Less | Token::LessEqual => Precedence::Comparison,
Token::And => Precedence::And,
Token::Or => Precedence::Or,
Token::Xor => Precedence::Xor,
Token::LeftParen => Precedence::Call,
_ => Precedence::None,
}
}
}
impl Precedence {
pub fn next(self) -> Precedence {
match self {
Precedence::None => Precedence::Or,
Precedence::Or => Precedence::And,
Precedence::And => Precedence::Xor,
Precedence::Xor => Precedence::Equality,
Precedence::Equality => Precedence::Comparison,
Precedence::Comparison => Precedence::Term,
Precedence::Term => Precedence::Factor,
Precedence::Factor => Precedence::Unary,
Precedence::Unary => Precedence::Call,
Precedence::Call => Precedence::Primary,
Precedence::Primary => Precedence::None,
}
}
}