welly_parser/expr/
atom.rs1use super::{Tree, Op};
2
3#[derive(Debug, Copy, Clone)]
11pub struct Operator {
12 pub with_left: Op,
14
15 pub without_left: Op,
17}
18
19impl Operator {
20 pub const fn new_ambiguous(with_left: Op, without_left: Op) -> Self {
22 Self {with_left, without_left }
23 }
24
25 pub const fn new(op: Op) -> Self { Self::new_ambiguous(op, op) }
27}
28
29impl Tree for Operator {
30 fn declare_keywords(mut declare: impl FnMut(&'static str, Self)) {
31 declare("?", Operator::new(Op::Query));
32 declare("**", Operator::new(Op::Pow));
33 declare("~", Operator::new(Op::BitNot));
34 declare("$", Operator::new(Op::Share));
35 declare("*", Operator::new_ambiguous(Op::Mul, Op::Clone));
36 declare("/", Operator::new(Op::Div));
37 declare("%", Operator::new(Op::Rem));
38 declare("+", Operator::new_ambiguous(Op::Add, Op::Plus));
39 declare("-", Operator::new_ambiguous(Op::Sub, Op::Minus));
40 declare("<<", Operator::new(Op::SL));
41 declare(">>", Operator::new(Op::ASR));
42 declare(">>>", Operator::new(Op::LSR));
43 declare("&", Operator::new_ambiguous(Op::BitAnd, Op::Borrow));
44 declare("^", Operator::new(Op::BitXor));
45 declare("|", Operator::new(Op::BitOr));
46 declare(":", Operator::new(Op::Cast));
47 declare("..", Operator::new(Op::Exclusive));
48 declare("...", Operator::new(Op::Inclusive));
49 declare("<", Operator::new(Op::LT));
50 declare(">", Operator::new(Op::GT));
51 declare("<=", Operator::new(Op::LE));
52 declare(">=", Operator::new(Op::GE));
53 declare("<>", Operator::new(Op::LG));
54 declare("==", Operator::new(Op::EQ));
55 declare("!=", Operator::new(Op::NE));
56 declare("in", Operator::new(Op::In));
57 declare("not", Operator::new(Op::BoolNot));
58 declare("and", Operator::new(Op::BoolAnd));
59 declare("or", Operator::new(Op::BoolOr));
60 }
61}