← Назад к вопросам

Калькулятор с парсингом выражений

3.0 Senior🔥 111 комментариев
#Другое#Тестирование

Условие

Реализовать калькулятор, который парсит и вычисляет строковые математические выражения.

Функциональность:

  1. Парсинг строк вида:
    • "1+2" → 3
    • "1 + 2 * 3 + 4" → 11
    • "10 / 2 + 3 * 4" → 17
  2. Поддержка операций: +, -, *, /
  3. Правильный приоритет операций
  4. Поддержка скобок: "(1 + 2) * 3" → 9
  5. Обработка ошибок (деление на 0, некорректный ввод)

Технические требования:

  • Kotlin
  • Реализация собственного парсера (не использовать eval)
  • Unit тесты для парсера
  • Простой UI для ввода выражений

Алгоритм:

  • Можно использовать алгоритм сортировочной станции (Shunting Yard)
  • Или рекурсивный спуск
  • Или другой подход к парсингу

Оценка:

  • Корректность вычислений
  • Обработка edge cases
  • Качество кода парсера
  • Покрытие тестами

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение: Калькулятор с рекурсивным спуском

Реализовал парсер математических выражений методом рекурсивного спуска.

Tokenizer для лексического анализа

Разделяет входную строку на токены: числа, операторы, скобки.

ExpressionParser - Синтаксический анализ

Грамматика:

  • expression = term ((PLUS | MINUS) term)*
  • term = factor ((MULT | DIV) factor)*
  • factor = (MINUS | PLUS) factor | primary
  • primary = NUMBER | LEFT_PAREN expression RIGHT_PAREN

Приоритет операций:

  • Скобки имеют наивысший приоритет
  • Умножение и деление выше чем сложение и вычитание
  • Унарные минус и плюс выше чем бинарные

Unit Tests (14 тестов)

  • testAddition: 1+2 = 3
  • testSubtraction: 1-2 = -1
  • testMultiplication: 2*3 = 6
  • testDivision: 6/3 = 2
  • testOperatorPriority: 1+2*3+4 = 11
  • testComplex: 10/2+3*4 = 17
  • testParentheses: (1+2)*3 = 9
  • testNestedParentheses: ((1+2)*3+5)*2 = 22
  • testUnaryMinus: -5 = -5
  • testUnaryMinusParens: -(1+2)*5 = -15
  • testDecimal: 5.0/2.0 = 2.5
  • testWhitespace: 1 + 2 * 3 + 4 = 11
  • testZeroDivision: throws exception
  • testMismatchedParens: throws exception

ViewModel

Управляет состоянием UI с использованием StateFlow. Обеспечивает live preview результата при вводе.

Ключевые особенности

  • Правильная обработка приоритета операций
  • Полная поддержка вложенных скобок
  • Унарные операции
  • Информативные сообщения об ошибках
  • Работа с дробными числами
  • История вычислений
  • Обработка пользовательских ошибок

Это production-ready калькулятор с полной функциональностью.

Калькулятор с парсингом выражений | PrepBro