use self::TokenType::*;
use super::super::out::{ErrorType, EvalResult};
#[derive(Debug, PartialEq, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum IdentifierType {
Var,
Function,
Unknown,
}
#[derive(Debug, PartialEq, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TokenType {
Plus,
Minus,
Star,
Slash,
Comma,
Equal,
Caret,
Percentage,
LessThan,
GreaterThan,
And,
Or,
LessOrEqualTo,
GreaterOrEqualTo,
DoubleEqual,
DoubleAnd,
DoubleOr,
NotEqual,
Exclamation,
OpeningBracket,
ClosingBracket,
Dot,
Literal,
Identifier(IdentifierType),
}
impl TokenType {
pub fn is_expression(&self) -> bool {
matches!(*self, TokenType::Identifier(_)) || *self == TokenType::Literal || self.is_binary_operator() || self.is_unary_operator() ||
self.is_union_operator()
}
pub fn is_binary_operator(&self) -> bool {
match self {
Plus | Minus | Star | Slash | Equal | Caret | Percentage | LessThan | GreaterThan
| LessOrEqualTo | GreaterOrEqualTo | DoubleAnd | DoubleOr | DoubleEqual | NotEqual => {
true
}
_ => false,
}
}
pub fn is_unary_operator(&self) -> bool {
match self {
Minus | Exclamation => true,
_ => false,
}
}
pub fn is_union_operator(&self) -> bool {
match self {
Comma => true,
_ => false,
}
}
pub fn precedence(&self) -> EvalResult<u16> {
Ok(match self {
Literal => 300,
Identifier(_) => 200,
Caret => 90,
Exclamation => 80,
Star | Slash | Percentage => 70,
Plus | Minus => 60,
LessThan | LessOrEqualTo | GreaterThan | GreaterOrEqualTo => 50,
DoubleEqual | NotEqual => 40,
DoubleAnd => 30,
DoubleOr => 20,
Comma => 10,
Equal => 0,
_ => return Err(ErrorType::NotAnOperator { token: *self }),
})
}
}