typed_eval/
expr.rs

1use crate::{Span, Spanned};
2
3#[derive(Debug, Clone, PartialEq)]
4pub enum Expr {
5    Int(Spanned<i64>),
6    Float(Spanned<f64>),
7    String(Spanned<String>),
8    Var(Spanned<String>),
9    UnOp(Spanned<UnOp>, Box<Expr>),
10    BinOp(Spanned<BinOp>, Box<Expr>, Box<Expr>),
11    FieldAccess(Box<Expr>, Spanned<String>),
12    FuncCall(Box<Expr>, Spanned<Vec<Expr>>),
13    InvalidLiteral(Spanned<String>),
14    ParseError,
15}
16
17#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
18pub enum BinOp {
19    Add,
20    Mul,
21    Sub,
22    Div,
23}
24
25#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
26pub enum UnOp {
27    Neg,
28    Plus,
29}
30
31impl Expr {
32    pub fn span(&self) -> Span {
33        match self {
34            Expr::Int(val) => val.span(),
35            Expr::Float(val) => val.span(),
36            Expr::String(val) => val.span(),
37            Expr::Var(s) => s.span(),
38            Expr::UnOp(op, rhs) => op.span().join(rhs.span()),
39            Expr::BinOp(op, lhs, rhs) => {
40                op.span().join(lhs.span()).join(rhs.span())
41            }
42            Expr::FieldAccess(obj, field) => obj.span().join(field.span()),
43            Expr::FuncCall(func, args) => func.span().join(args.span()),
44            Expr::InvalidLiteral(err) => err.span(),
45            Expr::ParseError => Span::test_span(),
46        }
47    }
48}