Информация об изменениях

Сообщение Re[2]: вычислить выражение записанное в виде строки символов от 01.02.2026 10:26

Изменено 01.02.2026 11:37 system.console

Re[2]: вычислить выражение записанное в виде строки символов
M>Опиши, какие операторы будешь использовать, и их приоритет. Напиши, что хочешь использовать группирующие скобки. Скорми это дипсику, и попроси его написать парсер рекурсивного спуска. Он справится. Я так делал. Единственно, у меня уже был лексер, и на выходе лексера (на входе парсера) уже были токены — оператор/литерал/идентификатор/скобка. Он мне на питоне написал, но я без проблем переделал под себя на плюсиках. Возможно, на PHP он сразу сможет написать. Ну, и пусть тебе лексер напишет, или совместит его с парсером.
M>Да, не забудь указать, что +/- могут быть унарными.
M>Скажи ему, что значения хочешь складывать на стек, вызывать операторную функцию, и помещать результат обратно на стек.
я попробую конечно чисто заради любопытства посмотреть, на что он способен этот ваш гигачат, но мне хотелось бы что-то совсем коротко чтобы.
Может какую-то библиотечку подключить, где есть нужная мне функция.
А то все эти грамматики-парсеры-лексеры я уже давно забыл, если и знал когда-то.
На худой конец оставлю eval, только предварительно проверку сделаю, чтобы там в качестве параметра ничего кроме 0..9,+,-,*,/,(,) не могло пролезть
Re[2]: вычислить выражение записанное в виде строки символов
M>Опиши, какие операторы будешь использовать, и их приоритет. Напиши, что хочешь использовать группирующие скобки. Скорми это дипсику, и попроси его написать парсер рекурсивного спуска. Он справится. Я так делал. Единственно, у меня уже был лексер, и на выходе лексера (на входе парсера) уже были токены — оператор/литерал/идентификатор/скобка. Он мне на питоне написал, но я без проблем переделал под себя на плюсиках. Возможно, на PHP он сразу сможет написать. Ну, и пусть тебе лексер напишет, или совместит его с парсером.
M>Да, не забудь указать, что +/- могут быть унарными.
M>Скажи ему, что значения хочешь складывать на стек, вызывать операторную функцию, и помещать результат обратно на стек.
я попробую конечно чисто заради любопытства посмотреть, на что он способен этот ваш гигачат, но мне хотелось бы что-то совсем коротко чтобы.
Может какую-то библиотечку подключить, где есть нужная мне функция.
А то все эти грамматики-парсеры-лексеры я уже давно забыл, если и знал когда-то.
На худой конец оставлю eval, только предварительно проверку сделаю, чтобы там в качестве параметра ничего кроме 0..9,+,-,*,/,(,) не могло пролезть

ЗЫ. Ниже результат работы gigachat

// Функция для обработки арифметического выражения
function calculateExpression($expression)
{
    // Очищаем пробелы
    $expression = str_replace(' ', '', $expression);
    
    try {
        // Используем встроенную функцию eval() осторожно
        return eval("return ($expression);");
    } catch (\\ParseError | \\DivisionByZeroError $e) {
        throw new Exception("Ошибка вычисления выражения: {$e->getMessage()}");
    }
}

[/q]