Implement proper errors for expression evaluation
... the hard way
This commit is contained in:
parent
efa9b7de03
commit
5ee70bd769
4 changed files with 186 additions and 75 deletions
|
|
@ -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>,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue