From 5597bc72671d0128e6f0dba446c4dc8d47bf37d0 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Mon, 25 Nov 2024 18:58:53 +0300 Subject: fixed subtle operator precedence bug * It was possible to provoke operator right-associativity when placing a high-precedence operator between two low-precedence operators. 1-6*5-1 evaluated to -28 instead of the expected -30. * The reason is that SciTECO relies on operators to be resolved from left-to-right as soon as possible. The higher precedence operator prevents that and pushing the 2nd "-" only evaluated 6*5. At the end 1-30-1 would be left on the stack. teco_expressions_eval() however evaluates from right-to-left which is wrong in this case. * Instead, we now do a full eval on every operator with a lower precedence, making sure that 1-30 is evaluated first. --- src/expressions.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/expressions.c') diff --git a/src/expressions.c b/src/expressions.c index 25213e9..2424fb3 100644 --- a/src/expressions.c +++ b/src/expressions.c @@ -145,7 +145,7 @@ teco_expressions_push_calc(teco_operator_t op, GError **error) /* calculate if op has lower precedence than op on stack */ if (first >= 0 && teco_expressions_precedence(op) <= teco_expressions_precedence(teco_expressions_peek_op(first)) && - !teco_expressions_calc(error)) + !teco_expressions_eval(FALSE, error)) return FALSE; teco_expressions_push_op(op); -- cgit v1.2.3