shunting_yard/
token.rs

1use num::Float;
2
3#[derive(Debug, Clone, Copy, Eq, PartialEq)]
4pub enum RPNToken<T: Float + Copy> {
5    Operand(T),
6    Operator(Operator),
7    Var(char),
8}
9
10#[derive(Debug, Clone, Copy, Eq, PartialEq)]
11pub enum Operator {
12    PLUS,
13    MINUS,
14    MULTI,
15    DIVIDE,
16    POWER,
17    FACTORIAL,
18    LPAREN,
19    RPAREN,
20}
21
22impl Operator {
23    pub fn val(&self) -> u32 {
24        match *self {
25            Operator::LPAREN | Operator::RPAREN => 0,
26            Operator::PLUS | Operator::MINUS => 1,
27            Operator::MULTI | Operator::DIVIDE => 2,
28            Operator::POWER => 3,
29            Operator::FACTORIAL => 4,
30        }
31    }
32
33    pub fn try_from_char(c: char) -> Option<Operator> {
34        Some(match c {
35            '+' => Operator::PLUS,
36            '-' => Operator::MINUS,
37            '*' => Operator::MULTI,
38            '/' => Operator::DIVIDE,
39            '^' => Operator::POWER,
40            '(' => Operator::LPAREN,
41            ')' => Operator::RPAREN,
42            '!' => Operator::FACTORIAL,
43            _ => return None,
44        })
45    }
46}