added integer division
This commit is contained in:
parent
2ed3a82b79
commit
2c2c78114f
2 changed files with 11 additions and 1 deletions
10
src/dice.rs
10
src/dice.rs
|
|
@ -16,6 +16,7 @@ pub enum Expression {
|
||||||
Sub(ExpBox, ExpBox),
|
Sub(ExpBox, ExpBox),
|
||||||
Mul(ExpBox, ExpBox),
|
Mul(ExpBox, ExpBox),
|
||||||
Div(ExpBox, ExpBox),
|
Div(ExpBox, ExpBox),
|
||||||
|
IntDiv(ExpBox, ExpBox),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone)]
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
|
|
@ -246,6 +247,12 @@ impl Expression {
|
||||||
let rhs = rhs_node.evaluate(rng, w, precedence)?;
|
let rhs = rhs_node.evaluate(rng, w, precedence)?;
|
||||||
lhs / rhs
|
lhs / rhs
|
||||||
}
|
}
|
||||||
|
IntDiv(lhs_node, rhs_node) => {
|
||||||
|
let lhs = lhs_node.evaluate(rng, w, precedence)?;
|
||||||
|
write!(w, " // ")?;
|
||||||
|
let rhs = rhs_node.evaluate(rng, w, precedence)?;
|
||||||
|
lhs.div_euclid(rhs)
|
||||||
|
}
|
||||||
};
|
};
|
||||||
if needs_parens {
|
if needs_parens {
|
||||||
write!(w, ")")?;
|
write!(w, ")")?;
|
||||||
|
|
@ -306,6 +313,7 @@ impl Expression {
|
||||||
Expression::Sub(lhs, rhs) => lhs.avg()? - rhs.avg()?,
|
Expression::Sub(lhs, rhs) => lhs.avg()? - rhs.avg()?,
|
||||||
Expression::Mul(lhs, rhs) => lhs.avg()? * rhs.avg()?,
|
Expression::Mul(lhs, rhs) => lhs.avg()? * rhs.avg()?,
|
||||||
Expression::Div(lhs, rhs) => lhs.avg()? / rhs.avg()?,
|
Expression::Div(lhs, rhs) => lhs.avg()? / rhs.avg()?,
|
||||||
|
Expression::IntDiv(lhs, rhs) => lhs.avg()?.div_euclid(rhs.avg()?),
|
||||||
};
|
};
|
||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
@ -358,7 +366,7 @@ impl Expression {
|
||||||
Const(_) => 1,
|
Const(_) => 1,
|
||||||
Dice { .. } => 2,
|
Dice { .. } => 2,
|
||||||
Neg(_) => 5,
|
Neg(_) => 5,
|
||||||
Mul(_, _) | Div(_, _) => 7,
|
Mul(_, _) | Div(_, _) | IntDiv(_, _) => 7,
|
||||||
Add(_, _) | Sub(_, _) => 8,
|
Add(_, _) | Sub(_, _) => 8,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,7 @@ fn expr<'c, 'i>(
|
||||||
fail(),
|
fail(),
|
||||||
complete(alt((
|
complete(alt((
|
||||||
binary_op(7, Left, spaced_op("*")),
|
binary_op(7, Left, spaced_op("*")),
|
||||||
|
binary_op(7, Left, spaced_op("//")),
|
||||||
binary_op(7, Left, spaced_op("/")),
|
binary_op(7, Left, spaced_op("/")),
|
||||||
binary_op(8, Left, spaced_op("+")),
|
binary_op(8, Left, spaced_op("+")),
|
||||||
binary_op(8, Left, spaced_op("-")),
|
binary_op(8, Left, spaced_op("-")),
|
||||||
|
|
@ -101,6 +102,7 @@ fn expr<'c, 'i>(
|
||||||
Ok(match op {
|
Ok(match op {
|
||||||
Prefix("-", x) => Neg(Box::new(x)),
|
Prefix("-", x) => Neg(Box::new(x)),
|
||||||
Binary(lhs, "*", rhs) => Mul(Box::new(lhs), Box::new(rhs)),
|
Binary(lhs, "*", rhs) => Mul(Box::new(lhs), Box::new(rhs)),
|
||||||
|
Binary(lhs, "//", rhs) => IntDiv(Box::new(lhs), Box::new(rhs)),
|
||||||
Binary(lhs, "/", rhs) => Div(Box::new(lhs), Box::new(rhs)),
|
Binary(lhs, "/", rhs) => Div(Box::new(lhs), Box::new(rhs)),
|
||||||
Binary(lhs, "+", rhs) => Add(Box::new(lhs), Box::new(rhs)),
|
Binary(lhs, "+", rhs) => Add(Box::new(lhs), Box::new(rhs)),
|
||||||
Binary(lhs, "-", rhs) => Sub(Box::new(lhs), Box::new(rhs)),
|
Binary(lhs, "-", rhs) => Sub(Box::new(lhs), Box::new(rhs)),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue