use crate::core::*;
use crate::lexer::TokenType;
use super::Parser;
pub type BinaryExprConstructor = fn(Box<Expression>, Box<Expression>) -> Expression;
impl Parser {
pub fn get_binary_precedence(&self, token_type: TokenType) -> u8 {
match token_type {
TokenType::Dot | TokenType::LeftBracket | TokenType::LeftParen => 16,
TokenType::StarStar => 15,
TokenType::Star | TokenType::Slash | TokenType::Percent => 14,
TokenType::Pipe => 2,
TokenType::Plus | TokenType::Minus => 12,
TokenType::DotDot | TokenType::DotDotEqual => 10,
TokenType::Less
| TokenType::Greater
| TokenType::LessEqual
| TokenType::GreaterEqual => 9,
TokenType::In | TokenType::Is | TokenType::NotIn | TokenType::IsNot => 8,
TokenType::EqualEqual | TokenType::BangEqual => 7,
TokenType::And => 3,
TokenType::Xor => 2,
TokenType::Or => 1,
_ => 0, }
}
pub fn get_binary_expression_constructor(
&self,
token_type: TokenType,
) -> Option<BinaryExprConstructor> {
match token_type {
TokenType::Plus => Some(Expression::Add),
TokenType::Minus => Some(Expression::Sub),
TokenType::Star => Some(Expression::Mul),
TokenType::Slash => Some(Expression::Div),
TokenType::Percent => Some(Expression::Mod),
TokenType::StarStar => Some(Expression::Pow),
TokenType::Pipe => Some(Expression::Pipe),
TokenType::EqualEqual => Some(Expression::Eq),
TokenType::BangEqual => Some(Expression::Ne),
TokenType::Less => Some(Expression::Lt),
TokenType::Greater => Some(Expression::Gt),
TokenType::LessEqual => Some(Expression::Le),
TokenType::GreaterEqual => Some(Expression::Ge),
TokenType::In => Some(Expression::In),
TokenType::Is => Some(Expression::Is),
TokenType::NotIn => Some(Expression::NotIn),
TokenType::IsNot => Some(Expression::IsNot),
TokenType::And => Some(Expression::And),
TokenType::Or => Some(Expression::Or),
TokenType::Xor => Some(Expression::Xor),
TokenType::DotDot => Some(Expression::RangeExclusive),
TokenType::DotDotEqual => Some(Expression::RangeInclusive),
_ => None,
}
}
pub fn is_right_associative_token(&self, token_type: TokenType) -> bool {
matches!(token_type, TokenType::StarStar)
}
}