arrow-parser 0.0.2

Parser for the Arrow programming language
Documentation
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
  };
}