1use std::fmt;
10use std::sync::Arc;
11use crate::error::*;
12
13#[derive(Clone, Debug)]
18pub struct Tree(pub Vec<Node>);
19
20#[derive(Clone, Debug)]
22pub enum Node
23{
24 Def(Box<Def>),
26 Stat(Box<Stat>),
28}
29
30#[derive(Clone, Debug)]
32pub enum Def
33{
34 Mod(String, Box<Mod>, Pos),
36 Fun(String, Arc<Fun>, Pos),
38}
39
40impl Def
41{
42 pub fn pos(&self) -> &Pos
44 {
45 match self {
46 Def::Mod(_, _, pos) => pos,
47 Def::Fun(_, _, pos) => pos,
48 }
49 }
50
51 pub fn set_pos(&mut self, pos: Pos)
53 {
54 match self {
55 Def::Mod(_, _, pos2) => *pos2 = pos,
56 Def::Fun(_, _, pos2) => *pos2 = pos,
57 }
58 }
59}
60
61#[derive(Clone, Debug)]
63pub struct Mod(pub Vec<Node>);
64
65#[derive(Clone, Debug)]
67pub struct Fun(pub Vec<Arg>, pub Vec<Box<Stat>>);
68
69#[derive(Clone, Debug)]
71pub struct Arg(pub String, pub Pos);
72
73impl Arg
74{
75 pub fn pos(&self) -> &Pos
77 { &self.1 }
78
79 pub fn set_pos(&mut self, pos: Pos)
81 { self.1 = pos; }
82}
83
84#[derive(Clone, Debug)]
86pub enum Stat
87{
88 Expr(Box<Expr>, Pos),
90 Assign(Box<Expr>, Box<Expr>, Pos),
92 If(Box<Expr>, Vec<Box<Stat>>, Vec<(Box<Expr>, Vec<Box<Stat>>)>, Option<Vec<Box<Stat>>>, Pos),
94 For(String, Box<Expr>, Vec<Box<Stat>>, Pos),
96 While(Box<Expr>, Vec<Box<Stat>>, Pos),
98 Break(Pos),
100 Continue(Pos),
102 Return(Option<Box<Expr>>, Pos),
104 Quit(Pos),
106}
107
108impl Stat
109{
110 pub fn pos(&self) -> &Pos
112 {
113 match self {
114 Stat::Expr(_, pos) => pos,
115 Stat::Assign(_, _, pos) => pos,
116 Stat::If(_, _, _, _, pos) => pos,
117 Stat::For(_, _, _, pos) => pos,
118 Stat::While(_, _, pos) => pos,
119 Stat::Break(pos) => pos,
120 Stat::Continue(pos) => pos,
121 Stat::Return(_, pos) => pos,
122 Stat::Quit(pos) => pos,
123 }
124 }
125
126 pub fn set_pos(&mut self, pos: Pos)
128 {
129 match self {
130 Stat::Expr(_, pos2) => *pos2 = pos,
131 Stat::Assign(_, _, pos2) => *pos2 = pos,
132 Stat::If(_, _, _, _, pos2) => *pos2 = pos,
133 Stat::For(_, _, _, pos2) => *pos2 = pos,
134 Stat::While(_, _, pos2) => *pos2 = pos,
135 Stat::Break(pos2) => *pos2 = pos,
136 Stat::Continue(pos2) => *pos2 = pos,
137 Stat::Return(_, pos2) => *pos2 = pos,
138 Stat::Quit(pos2) => *pos2 = pos,
139 }
140 }
141}
142
143#[derive(Clone, Debug)]
145pub enum Expr
146{
147 Lit(Lit, Pos),
149 Var(Name, Pos),
151 App(Box<Expr>, Vec<Box<Expr>>, Pos),
153 UnaryOp(UnaryOp, Box<Expr>, Pos),
155 BinOp(BinOp, Box<Expr>, Box<Expr>, Pos),
157 And(Box<Expr>, Box<Expr>, Pos),
159 Or(Box<Expr>, Box<Expr>, Pos),
161 Field(Box<Expr>, String, Pos),
163 Range(Box<Expr>, Box<Expr>, Option<Box<Expr>>, Pos),
165 PropagateError(Box<Expr>, Pos),
167}
168
169impl Expr
170{
171 pub fn pos(&self) -> &Pos
173 {
174 match self {
175 Expr::Lit(_, pos) => pos,
176 Expr::Var(_, pos) => pos,
177 Expr::App(_, _, pos) => pos,
178 Expr::UnaryOp(_, _, pos) => pos,
179 Expr::BinOp(_, _, _, pos) => pos,
180 Expr::And(_, _, pos) => pos,
181 Expr::Or(_, _, pos) => pos,
182 Expr::Field(_, _, pos) => pos,
183 Expr::Range(_, _, _, pos) => pos,
184 Expr::PropagateError(_, pos) => pos,
185 }
186 }
187
188 pub fn set_pos(&mut self, pos: Pos)
190 {
191 match self {
192 Expr::Lit(_, pos2) => *pos2 = pos,
193 Expr::Var(_, pos2) => *pos2 = pos,
194 Expr::App(_, _, pos2) => *pos2 = pos,
195 Expr::UnaryOp(_, _, pos2) => *pos2 = pos,
196 Expr::BinOp(_, _, _, pos2) => *pos2 = pos,
197 Expr::And(_, _, pos2) => *pos2 = pos,
198 Expr::Or(_, _, pos2) => *pos2 = pos,
199 Expr::Field(_, _, pos2) => *pos2 = pos,
200 Expr::Range(_, _, _, pos2) => *pos2 = pos,
201 Expr::PropagateError(_, pos2) => *pos2 = pos,
202 }
203 }
204}
205
206#[derive(Clone, Debug)]
208pub enum Lit
209{
210 None,
212 Bool(bool),
214 Int(i64),
216 Float(f32),
218 String(String),
220 Matrix(Vec<MatrixRow>),
222 FilledMatrix(MatrixRow, Box<Expr>),
224 Array(Vec<Box<Expr>>),
226 FilledArray(Box<Expr>, Box<Expr>),
228 Struct(Vec<FieldPair>),
230}
231
232#[derive(Clone, Debug)]
234pub enum MatrixRow
235{
236 Row(Vec<Box<Expr>>),
238 FilledRow(Box<Expr>, Box<Expr>),
240}
241
242#[derive(Clone, Debug)]
244pub struct FieldPair(pub String, pub Box<Expr>, pub Pos);
245
246impl FieldPair
247{
248 pub fn pos(&self) -> &Pos
250 { &self.2 }
251
252 pub fn set_pos(&mut self, pos: Pos)
254 { self.2 = pos; }
255}
256
257#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
259pub enum UnaryOp
260{
261 Neg,
263 DotNeg,
265 Not,
267 Transpose,
269}
270
271#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
273pub enum BinOp
274{
275 Index,
277 Mul,
279 DotMul,
281 Div,
283 DotDiv,
285 Add,
287 DotAdd,
289 Sub,
291 DotSub,
293 Lt,
295 Ge,
297 Gt,
299 Le,
301 Eq,
303 Ne,
305}
306
307#[derive(Clone, Eq, PartialEq, Debug)]
309pub enum Name
310{
311 Abs(Vec<String>, String),
313 Rel(Vec<String>, String),
315 Var(String),
317}
318
319impl fmt::Display for Name
320{
321 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
322 {
323 match self {
324 Name::Abs(idents, ident) => {
325 write!(f, "root")?;
326 for ident2 in idents {
327 write!(f, "::{}", ident2)?;
328 }
329 write!(f, "::{}", ident)
330 },
331 Name::Rel(idents, ident) => {
332 let mut is_first = true;
333 for ident2 in idents {
334 if !is_first {
335 write!(f, "::{}", ident2)?;
336 } else {
337 write!(f, "{}", ident2)?;
338 }
339 is_first = false;
340 }
341 write!(f, "::{}", ident)
342 },
343 Name::Var(ident) => write!(f, "{}", ident),
344 }
345 }
346}