mimium_lang/ast/
operators.rs

1use std::fmt;
2
3use crate::compiler::intrinsics;
4use crate::interner::{Symbol, ToSymbol};
5
6#[derive(Clone, Debug, PartialEq, Eq, Hash)]
7pub enum Op {
8    Sum,     // +
9    Minus,   // -
10    Product, // *
11    Divide,  // /
12
13    Equal,        // ==
14    NotEqual,     // !=
15    LessThan,     // <
16    LessEqual,    // <=
17    GreaterThan,  // >
18    GreaterEqual, // >=
19
20    Modulo,   // %
21    Exponent, // ^
22
23    And, // &&
24    Or,  // ||
25
26    At, // @
27
28    Pipe, // |>
29
30    Unknown(String),
31}
32
33impl Op {
34    pub fn get_associated_fn_name(&self) -> Symbol {
35        match self {
36            Op::Sum => intrinsics::ADD,
37            Op::Minus => intrinsics::SUB,
38            Op::Product => intrinsics::MULT,
39            Op::Divide => intrinsics::DIV,
40            Op::Equal => intrinsics::EQ,
41            Op::NotEqual => intrinsics::NE,
42            Op::LessThan => intrinsics::LT,
43            Op::LessEqual => intrinsics::LE,
44            Op::GreaterThan => intrinsics::GT,
45            Op::GreaterEqual => intrinsics::GE,
46            Op::Modulo => intrinsics::MODULO,
47            Op::Exponent => intrinsics::POW,
48            Op::And => intrinsics::AND,
49            Op::Or => intrinsics::OR,
50            Op::At => "_mimium_schedule_at",
51            Op::Pipe => unreachable!(), // pipe is a syntax sugar, not a function
52            Op::Unknown(x) => x.as_str(),
53        }
54        .to_symbol()
55    }
56}
57
58impl fmt::Display for Op {
59    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
60        match self {
61            Op::Sum => write!(f, "+"),
62            Op::Minus => write!(f, "-"),
63            Op::Product => write!(f, "*"),
64            Op::Divide => write!(f, "/"),
65            Op::Equal => write!(f, "=="),
66            Op::NotEqual => write!(f, "!="),
67            Op::LessThan => write!(f, "<"),
68            Op::LessEqual => write!(f, "<="),
69            Op::GreaterThan => write!(f, ">"),
70            Op::GreaterEqual => write!(f, ">="),
71            Op::Modulo => write!(f, "%"),
72            Op::Exponent => write!(f, "^"),
73            Op::And => write!(f, "&&"),
74            Op::Or => write!(f, "||"),
75            Op::At => write!(f, "@"),
76            Op::Pipe => write!(f, "|>"),
77            Op::Unknown(x) => write!(f, "{x}"),
78        }
79    }
80}