use crate::operator::Arity::*;
use crate::operator::Associativity::*;
use crate::operator::ExprOperatorName::*;
use lazy_static::lazy_static;
use std::collections::HashMap;
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
pub enum AssignOperator {
Default,
Addition,
BitwiseAnd,
BitwiseLeftShift,
BitwiseOr,
BitwiseRightShift,
BitwiseUnsignedRightShift,
BitwiseXor,
Division,
Exponentiation,
Index,
LogicalAnd,
LogicalOr,
Multiplication,
Remainder,
Subtraction,
}
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
pub enum ExprOperatorName {
Addition,
Arrow,
As,
Bind,
BitwiseAnd,
BitwiseLeftShift,
BitwiseOr,
BitwiseRightShift,
BitwiseUnsignedRightShift,
BitwiseXor,
Call,
Division,
Equality,
Exponentiation,
GreaterThan,
GreaterThanOrEqual,
Index,
Inequality,
LessThan,
LessThanOrEqual,
LogicalAnd,
LogicalOr,
MemberAccess,
Multiplication,
Negation,
Not,
OptionalCall,
OptionalCoalescing,
OptionalIndex,
OptionalMemberAccess,
Remainder,
Subtraction,
}
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
pub enum Arity {
Unary,
Binary,
}
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
pub enum Associativity {
Left,
Right,
}
pub struct ExprOperator {
pub name: ExprOperatorName,
pub arity: Arity,
pub associativity: Associativity,
pub precedence: u8,
}
const PRECEDENCE_LEVELS: &'static [&'static [(ExprOperatorName, Arity, Associativity)]] = &[
&[
(Bind, Binary, Left),
(MemberAccess, Binary, Left),
(Index, Binary, Left),
(Call, Binary, Left),
(OptionalMemberAccess, Binary, Left),
(OptionalIndex, Binary, Left),
(OptionalCall, Binary, Left),
],
&[(Not, Unary, Right), (Negation, Unary, Right)],
&[(As, Binary, Left)],
&[(Exponentiation, Binary, Right)],
&[
(Multiplication, Binary, Left),
(Division, Binary, Left),
(Remainder, Binary, Left),
],
&[(Addition, Binary, Left), (Subtraction, Binary, Left)],
&[
(BitwiseLeftShift, Binary, Left),
(BitwiseRightShift, Binary, Left),
(BitwiseUnsignedRightShift, Binary, Left),
],
&[
(LessThan, Binary, Left),
(LessThanOrEqual, Binary, Left),
(GreaterThan, Binary, Left),
(GreaterThanOrEqual, Binary, Left),
],
&[(Equality, Binary, Left), (Inequality, Binary, Left)],
&[(BitwiseAnd, Binary, Left)],
&[(BitwiseXor, Binary, Left)],
&[(BitwiseOr, Binary, Left)],
&[(LogicalAnd, Binary, Left)],
&[
(LogicalOr, Binary, Left),
(OptionalCoalescing, Binary, Left),
],
&[(Arrow, Binary, Left)],
];
lazy_static! {
pub static ref EXPR_OPERATORS: HashMap<ExprOperatorName, ExprOperator> = {
let mut map = HashMap::<ExprOperatorName, ExprOperator>::new();
for (i, ops) in PRECEDENCE_LEVELS.iter().enumerate() {
let precedence = (PRECEDENCE_LEVELS.len() - i) as u8;
for &(name, arity, associativity) in ops.iter() {
map.insert(name, ExprOperator {
name,
arity,
associativity,
precedence,
});
}
}
map
};
}