1#[derive(Debug, Clone, Copy)]
7pub struct Span {
8 pub start: u32,
10 pub end: u32,
12}
13
14impl PartialEq for Span {
15 fn eq(&self, _other: &Self) -> bool {
16 true }
18}
19
20impl Eq for Span {}
21
22#[derive(Debug, Clone, PartialEq)]
25pub enum Expr {
26 Null,
28 Na(NaType),
30 Inf,
32 NaN,
34 Bool(bool),
36 Integer(i64),
38 Double(f64),
40 Complex(f64),
42 String(String),
44 Symbol(String),
46 Dots,
48 DotDot(u32),
50
51 UnaryOp { op: UnaryOp, operand: Box<Expr> },
53 BinaryOp {
55 op: BinaryOp,
56 lhs: Box<Expr>,
57 rhs: Box<Expr>,
58 },
59 Assign {
61 op: AssignOp,
62 target: Box<Expr>,
63 value: Box<Expr>,
64 },
65
66 Call {
68 func: Box<Expr>,
69 args: Vec<Arg>,
70 span: Option<Span>,
71 },
72 Index {
74 object: Box<Expr>,
75 indices: Vec<Arg>,
76 },
77 IndexDouble {
79 object: Box<Expr>,
80 indices: Vec<Arg>,
81 },
82 Dollar { object: Box<Expr>, member: String },
84 Slot { object: Box<Expr>, member: String },
86 NsGet { namespace: Box<Expr>, name: String },
88 NsGetInt { namespace: Box<Expr>, name: String },
90
91 Formula {
93 lhs: Option<Box<Expr>>,
94 rhs: Option<Box<Expr>>,
95 },
96
97 If {
99 condition: Box<Expr>,
100 then_body: Box<Expr>,
101 else_body: Option<Box<Expr>>,
102 },
103 For {
105 var: String,
106 iter: Box<Expr>,
107 body: Box<Expr>,
108 },
109 While {
111 condition: Box<Expr>,
112 body: Box<Expr>,
113 },
114 Repeat { body: Box<Expr> },
116 Break,
118 Next,
120 Return(Option<Box<Expr>>),
122
123 Block(Vec<Expr>),
125
126 Function { params: Vec<Param>, body: Box<Expr> },
128
129 Program(Vec<Expr>),
131}
132
133#[derive(Debug, Clone, PartialEq)]
134pub struct Arg {
135 pub name: Option<String>,
136 pub value: Option<Expr>,
137}
138
139#[derive(Debug, Clone, PartialEq)]
140pub struct Param {
141 pub name: String,
142 pub default: Option<Expr>,
143 pub is_dots: bool,
144}
145
146#[derive(Debug, Clone, Copy, PartialEq, Eq)]
147pub enum NaType {
148 Logical,
149 Integer,
150 Real,
151 Character,
152 Complex,
153}
154
155#[derive(Debug, Clone, Copy, PartialEq, Eq)]
156pub enum UnaryOp {
157 Neg,
158 Pos,
159 Not,
160 #[allow(dead_code)]
161 Formula,
162}
163
164#[derive(Debug, Clone, PartialEq, Eq)]
165pub enum BinaryOp {
166 Add,
167 Sub,
168 Mul,
169 Div,
170 Pow,
171 Mod,
172 IntDiv,
173 Eq,
174 Ne,
175 Lt,
176 Gt,
177 Le,
178 Ge,
179 And,
180 AndScalar,
181 Or,
182 OrScalar,
183 Range,
184 Pipe,
185 AssignPipe, TeePipe, ExpoPipe, Special(SpecialOp),
189 #[allow(dead_code)]
190 Tilde,
191 #[allow(dead_code)]
192 DoubleTilde,
193}
194
195impl BinaryOp {
196 pub fn is_comparison(&self) -> bool {
198 matches!(
199 self,
200 BinaryOp::Eq | BinaryOp::Ne | BinaryOp::Lt | BinaryOp::Gt | BinaryOp::Le | BinaryOp::Ge
201 )
202 }
203}
204
205#[derive(Debug, Clone, PartialEq, Eq)]
206pub enum SpecialOp {
207 In,
208 MatMul,
209 Kronecker,
210 Walrus,
211 Other(String),
213}
214
215#[derive(Debug, Clone, Copy, PartialEq, Eq)]
216pub enum AssignOp {
217 LeftAssign, SuperAssign, Equals, RightAssign, RightSuperAssign, }