1#[derive(Debug, Clone, PartialEq)]
3pub struct Span {
4 pub offset: usize, pub length: usize,
6}
7
8impl Span {
9 pub fn new(offset: usize, length: usize) -> Self {
10 Self { offset, length }
11 }
12}
13
14#[derive(Debug, Clone, PartialEq)]
15pub enum UnaryOp {
16 Neg, Percent, }
19
20#[derive(Debug, Clone, PartialEq)]
21pub enum BinaryOp {
22 Add, Sub, Mul, Div, Pow,
23 Concat, Eq, Ne, Lt, Gt, Le, Ge,
25}
26
27#[derive(Debug, Clone, PartialEq)]
28pub enum Expr {
29 Number(f64, Span),
30 Text(String, Span),
31 Bool(bool, Span),
32 Variable(String, Span),
33 UnaryOp {
34 op: UnaryOp,
35 operand: Box<Expr>,
36 span: Span,
37 },
38 BinaryOp {
39 op: BinaryOp,
40 left: Box<Expr>,
41 right: Box<Expr>,
42 span: Span,
43 },
44 FunctionCall {
45 name: String, args: Vec<Expr>,
47 span: Span,
48 },
49 Array(Vec<Expr>, Span),
50 Apply {
53 func: Box<Expr>,
54 call_args: Vec<Expr>,
55 span: Span,
56 },
57}
58
59impl Expr {
60 pub fn span(&self) -> &Span {
61 match self {
62 Expr::Number(_, s) | Expr::Text(_, s) | Expr::Bool(_, s) | Expr::Variable(_, s) => s,
63 Expr::UnaryOp { span, .. }
64 | Expr::BinaryOp { span, .. }
65 | Expr::FunctionCall { span, .. }
66 | Expr::Apply { span, .. } => span,
67 Expr::Array(_, span) => span,
68 }
69 }
70}