fix: collapse_toplevel
incorrect indexes and operation order (div before mult) co-authored by electria
This commit is contained in:
parent
580300a205
commit
375d7eb95f
1 changed files with 21 additions and 21 deletions
70
src/parse.rs
70
src/parse.rs
|
|
@ -173,7 +173,7 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
|
|||
_ => panic!("operator is missing an operand"),
|
||||
};
|
||||
|
||||
nodes.remove(operator);
|
||||
nodes.remove(start + operator);
|
||||
end -= 1;
|
||||
}
|
||||
while let Some(operator) = nodes[start..end]
|
||||
|
|
@ -185,7 +185,7 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
|
|||
_ => panic!("operator is missing an operand"),
|
||||
};
|
||||
|
||||
nodes.remove(operator);
|
||||
nodes.remove(start + operator);
|
||||
end -= 1;
|
||||
}
|
||||
|
||||
|
|
@ -204,31 +204,10 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
|
|||
|
||||
let number = lhs.pow(rhs).complete(PREC);
|
||||
|
||||
nodes.remove(operator - 1);
|
||||
nodes.remove(operator - 1);
|
||||
nodes.remove(start + operator - 1);
|
||||
nodes.remove(start + operator - 1);
|
||||
end -= 2;
|
||||
nodes[operator - 1] = Node::Number(number);
|
||||
}
|
||||
|
||||
while let Some(operator) = nodes[start..end]
|
||||
.iter()
|
||||
.position(|n| *n == Node::Operator(Operator::Mult))
|
||||
{
|
||||
let lhs = match &nodes[start..end][operator - 1] {
|
||||
Node::Number(n) => n,
|
||||
_ => panic!("operator is missing an operand"),
|
||||
};
|
||||
let rhs = match &nodes[start..end][operator + 1] {
|
||||
Node::Number(n) => n,
|
||||
_ => panic!("operator is missing an operand"),
|
||||
};
|
||||
|
||||
let number = (lhs * rhs).complete(PREC);
|
||||
|
||||
nodes.remove(operator - 1);
|
||||
nodes.remove(operator - 1);
|
||||
end -= 2;
|
||||
nodes[operator - 1] = Node::Number(number);
|
||||
nodes[start + operator - 1] = Node::Number(number);
|
||||
}
|
||||
|
||||
while let Some(operator) = nodes[start..end]
|
||||
|
|
@ -246,10 +225,31 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
|
|||
|
||||
let number = (lhs / rhs).complete(PREC);
|
||||
|
||||
nodes.remove(operator - 1);
|
||||
nodes.remove(operator - 1);
|
||||
nodes.remove(start + operator - 1);
|
||||
nodes.remove(start + operator - 1);
|
||||
end -= 2;
|
||||
nodes[operator - 1] = Node::Number(number);
|
||||
nodes[start + operator - 1] = Node::Number(number);
|
||||
}
|
||||
|
||||
while let Some(operator) = nodes[start..end]
|
||||
.iter()
|
||||
.position(|n| *n == Node::Operator(Operator::Mult))
|
||||
{
|
||||
let lhs = match &nodes[start..end][operator - 1] {
|
||||
Node::Number(n) => n,
|
||||
_ => panic!("operator is missing an operand"),
|
||||
};
|
||||
let rhs = match &nodes[start..end][operator + 1] {
|
||||
Node::Number(n) => n,
|
||||
_ => panic!("operator is missing an operand"),
|
||||
};
|
||||
|
||||
let number = (lhs * rhs).complete(PREC);
|
||||
|
||||
nodes.remove(start + operator - 1);
|
||||
nodes.remove(start + operator - 1);
|
||||
end -= 2;
|
||||
nodes[start + operator - 1] = Node::Number(number);
|
||||
}
|
||||
|
||||
while let Some(operator) = nodes[start..end]
|
||||
|
|
@ -267,10 +267,10 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
|
|||
|
||||
let number = (lhs + rhs).complete(PREC);
|
||||
|
||||
nodes.remove(operator - 1);
|
||||
nodes.remove(operator - 1);
|
||||
nodes.remove(start + operator - 1);
|
||||
nodes.remove(start + operator - 1);
|
||||
end -= 2;
|
||||
nodes[operator - 1] = Node::Number(number);
|
||||
nodes[start + operator - 1] = Node::Number(number);
|
||||
}
|
||||
|
||||
while let Some(operator) = nodes[start..end]
|
||||
|
|
@ -288,10 +288,10 @@ fn collapse_toplevel(nodes: &mut Vec<Node>, mut end: usize) {
|
|||
|
||||
let number = (lhs - rhs).complete(PREC);
|
||||
|
||||
nodes.remove(operator - 1);
|
||||
nodes.remove(operator - 1);
|
||||
nodes.remove(start + operator - 1);
|
||||
nodes.remove(start + operator - 1);
|
||||
end -= 2;
|
||||
nodes[operator - 1] = Node::Number(number);
|
||||
nodes[start + operator - 1] = Node::Number(number);
|
||||
}
|
||||
|
||||
if nodes.len() > 1 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue