Я разрабатываю распределенный калькулятор с использованием JavaScript и PHP. Калькулятор должен распознавать скобки и изменять порядок вычислений в соответствии со скобками. Все основные математические операции (*
, /
, +
, -
) имеют одинаковый приоритет (в отличие от общего приоритета). Я использую следующее регулярное выражение, чтобы получить пользовательский ввод и поместить в массив. Это регулярное выражение хорошо работает для положительных чисел:
/\d*\.\d+|\d+|[()/*+-]/g
Однако когда дело доходит до отрицательных чисел, происходит сбой, потому что я использую функцию рекурсивной замены, которая заменяет каждую пару скобок (и содержимое) результатом операций внутри этих скобок. Я делаю это, потому что это распределенный калькулятор, и я должен выполнять каждую атомарную операцию на стороне сервера, а затем возвращать результат обратно и показывать его в истории операций.
Все, что я хочу, это обнаружить отрицательные числа (чтобы сохранить их как один элемент в массиве). Я думаю, что это должно работать следующим образом: когда есть два последовательных оператора (с нулем или более пробелами между ними), а второй оператор является знаком минус (-
), знак минус должен быть объединен со следующим числом (как знак числа). Кроме того, если первому числу предшествует знак минус, знак должен быть присоединен к этому числу.