sieve/compiler/grammar/expr/
mod.rs1use 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}