sieve/compiler/grammar/expr/
mod.rs

1/*
2 * SPDX-FileCopyrightText: 2020 Stalwart Labs Ltd <hello@stalw.art>
3 *
4 * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
5 */
6
7use std::sync::Arc;
8
9use crate::compiler::{Number, VariableType};
10
11pub mod parser;
12pub mod tokenizer;
13
14#[derive(Debug, PartialEq, Eq, Clone)]
15#[cfg_attr(
16    any(test, feature = "serde"),
17    derive(serde::Serialize, serde::Deserialize)
18)]
19#[cfg_attr(
20    feature = "rkyv",
21    derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
22)]
23pub(crate) enum Expression {
24    Variable(VariableType),
25    Constant(Constant),
26    BinaryOperator(BinaryOperator),
27    UnaryOperator(UnaryOperator),
28    JmpIf { val: bool, pos: u32 },
29    Function { id: u32, num_args: u32 },
30    ArrayAccess,
31    ArrayBuild(u32),
32}
33
34#[derive(Debug, PartialEq, Clone)]
35#[cfg_attr(
36    any(test, feature = "serde"),
37    derive(serde::Serialize, serde::Deserialize)
38)]
39#[cfg_attr(
40    feature = "rkyv",
41    derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
42)]
43pub(crate) enum Constant {
44    Integer(i64),
45    Float(f64),
46    String(Arc<String>),
47}
48
49impl Eq for Constant {}
50
51impl From<Number> for Constant {
52    fn from(value: Number) -> Self {
53        match value {
54            Number::Integer(i) => Constant::Integer(i),
55            Number::Float(f) => Constant::Float(f),
56        }
57    }
58}
59
60impl From<String> for Constant {
61    fn from(value: String) -> Self {
62        Constant::String(value.into())
63    }
64}
65
66#[derive(Debug, PartialEq, Eq, Clone, Copy)]
67#[cfg_attr(
68    any(test, feature = "serde"),
69    derive(serde::Serialize, serde::Deserialize)
70)]
71#[cfg_attr(
72    feature = "rkyv",
73    derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
74)]
75pub(crate) enum BinaryOperator {
76    Add,
77    Subtract,
78    Multiply,
79    Divide,
80
81    And,
82    Or,
83    Xor,
84
85    Eq,
86    Ne,
87    Lt,
88    Le,
89    Gt,
90    Ge,
91}
92
93#[derive(Debug, PartialEq, Eq, Clone, Copy)]
94#[cfg_attr(
95    any(test, feature = "serde"),
96    derive(serde::Serialize, serde::Deserialize)
97)]
98#[cfg_attr(
99    feature = "rkyv",
100    derive(rkyv::Serialize, rkyv::Deserialize, rkyv::Archive)
101)]
102pub(crate) enum UnaryOperator {
103    Not,
104    Minus,
105}
106
107#[derive(Debug, PartialEq, Eq, Clone)]
108pub(crate) enum Token {
109    Variable(VariableType),
110    Function {
111        name: String,
112        id: u32,
113        num_args: u32,
114    },
115    Number(Number),
116    String(String),
117    BinaryOperator(BinaryOperator),
118    UnaryOperator(UnaryOperator),
119    OpenParen,
120    CloseParen,
121    OpenBracket,
122    CloseBracket,
123    Comma,
124}