Implement proper errors for expression evaluation

... the hard way
This commit is contained in:
Joscha 2021-12-06 22:18:57 +01:00
parent efa9b7de03
commit 5ee70bd769
4 changed files with 186 additions and 75 deletions

View file

@ -201,49 +201,35 @@ impl Var {
}
}
impl From<Weekday> for Var {
fn from(wd: Weekday) -> Self {
match wd {
Weekday::Monday => Self::Monday,
Weekday::Tuesday => Self::Tuesday,
Weekday::Wednesday => Self::Wednesday,
Weekday::Thursday => Self::Thursday,
Weekday::Friday => Self::Friday,
Weekday::Saturday => Self::Saturday,
Weekday::Sunday => Self::Sunday,
}
}
}
#[derive(Debug, Clone)]
pub enum Expr {
Lit(i64),
Var(Var),
Paren(Box<Expr>),
Paren(Box<Spanned<Expr>>),
// Integer-y operations
Neg(Box<Expr>),
Add(Box<Expr>, Box<Expr>),
Sub(Box<Expr>, Box<Expr>),
Mul(Box<Expr>, Box<Expr>),
Div(Box<Expr>, Box<Expr>),
Mod(Box<Expr>, Box<Expr>),
Neg(Box<Spanned<Expr>>),
Add(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
Sub(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
Mul(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
Div(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
Mod(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
// Comparisons
Eq(Box<Expr>, Box<Expr>),
Neq(Box<Expr>, Box<Expr>),
Lt(Box<Expr>, Box<Expr>),
Lte(Box<Expr>, Box<Expr>),
Gt(Box<Expr>, Box<Expr>),
Gte(Box<Expr>, Box<Expr>),
Eq(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
Neq(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
Lt(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
Lte(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
Gt(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
Gte(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
// Boolean-y operations
Not(Box<Expr>),
And(Box<Expr>, Box<Expr>),
Or(Box<Expr>, Box<Expr>),
Xor(Box<Expr>, Box<Expr>),
Not(Box<Spanned<Expr>>),
And(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
Or(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
Xor(Box<Spanned<Expr>>, Box<Spanned<Expr>>),
}
#[derive(Debug)]
pub struct FormulaSpec {
pub start: Option<Expr>, // None: *
pub start: Option<Spanned<Expr>>, // None: *
pub start_delta: Option<Delta>,
pub start_time: Option<Time>,
pub end_delta: Option<Delta>,