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}