From bd62d666b691d0f4dca990eceb2aefeb4caea8da Mon Sep 17 00:00:00 2001 From: xtarzyk Date: Tue, 31 Mar 2026 18:49:37 +0200 Subject: [PATCH] calculator successfully updated by agent --- calculator/pkg/calculator.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/calculator/pkg/calculator.py b/calculator/pkg/calculator.py index 6f5eb6c..bf4b520 100644 --- a/calculator/pkg/calculator.py +++ b/calculator/pkg/calculator.py @@ -16,15 +16,36 @@ class Calculator: def evaluate(self, expression): if not expression or expression.isspace(): return None - tokens = expression.strip().split() + tokens = self._tokenize(expression) return self._evaluate_infix(tokens) + def _tokenize(self, expression): + # Add spaces around operators and parentheses for easy splitting + expression = ( + expression.replace("(", " ( ") + .replace(")", " ) ") + .replace("+", " + ") + .replace("-", " - ") + .replace("*", " * ") + .replace("/", " / ") + ) + return [token for token in expression.split() if token] + def _evaluate_infix(self, tokens): values = [] operators = [] for token in tokens: - if token in self.operators: + if token == "(": + operators.append(token) + elif token == ")": + while operators and operators[-1] != "(": + self._apply_operator(operators, values) + if operators and operators[-1] == "(": + operators.pop() # Pop the opening parenthesis + else: + raise ValueError("Mismatched parentheses") + elif token in self.operators: while ( operators and operators[-1] in self.operators @@ -39,6 +60,8 @@ class Calculator: raise ValueError(f"invalid token: {token}") while operators: + if operators[-1] == "(": + raise ValueError("Mismatched parentheses") self._apply_operator(operators, values) if len(values) != 1: