From 375d7eb95f5a3e6b41e11fc999777d062d99c157 Mon Sep 17 00:00:00 2001 From: Edeth-Baguette Date: Mon, 13 Jul 2026 18:06:04 -0700 Subject: [PATCH] fix: collapse_toplevel incorrect indexes and operation order (div before mult) co-authored by electria --- src/parse.rs | 70 ++++++++++++++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/parse.rs b/src/parse.rs index 7b96e33..18dd3c9 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -173,7 +173,7 @@ fn collapse_toplevel(nodes: &mut Vec, 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, 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, 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, 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, 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, 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 {