Реализация Shunting Yard в PHP необходима, интерпретирует и анализирует строку, выполняет математическое сравнение и возвращает логический результат

Я ищу что-то, что может интерпретировать строку в php и выполнять простой математический расчет, а затем возвращать логический результат относительно того, является ли выражение истинным или ложным.

Например:

  1. Сью типы в «3 * {mysalary} / 9 = 10000"
  2. PHP разбивает это на два выражения – explode ('=', string);
  3. PHP берет мой список полей базы данных и заменяет любые «{}» поля с разделителями данными (typecasted to int)
  4. Затем PHP оценивает выражение математики
  5. Затем php сравнивает левую сторону с правой стороной
  6. булев результат.

Это может показаться сложным, но это должно быть очень просто. Вот ограничения: 1 / математические операторы привязаны к: + – / * 2 / операторы сравнения привязаны к: => <> = <= 3 / не нужны сравнения с плавающей запятой, все может быть выполнено на целочисленном уровне. Таким образом, любые деления можно округлить, если нужно, или просто просто округлить конечный результат

Будут только два выражения с одним оператором сравнения. Если есть какая-то ошибка, мы просто вернем false.

Кто-нибудь видел что-то, что может сделать это уже? Я знаю, что могу что-то сделать, но зачем изобретать колесо?

Если вы ничего не заметили, вам не пришло в голову перечислить некоторые «полученные» или оговорки, о которых вы можете придумать при построении этого.

Прочитав еще несколько, я понимаю, что могу использовать алгоритм шунтирования . Кто-нибудь имеет реализацию этого в PHP?

Я знаю, что eval может быть простым способом выполнить это, однако, это касается меня, что пользователь может очень легко сломать что-то с помощью этого метода или вызвать синтаксические ошибки. Я бы предпочел не включать его в решение, или если я это сделаю, тогда ему нужно будет жестко контролировать, как он используется.

Благодарю.

Джейсон

Related of "Реализация Shunting Yard в PHP необходима, интерпретирует и анализирует строку, выполняет математическое сравнение и возвращает логический результат"

Взгляните на класс evalMath на PHPClasses. Это должно делать почти все, что вам нужно, включая замену переменных (например, задание значения для «mysalary» в вашем примере перед оценкой выражения)

Существует механизм выражения парсера (реализации для JavaScript + Node , PHP , Python и ActionScript), на github Xpresion (ps. Я автор)

Двигатель достаточно гибкий и настраиваемый, можно создавать синтаксические анализаторы, которые анализируют любое выражение, которое также включает определяемые пользователем переменные , определяемые пользователем функции , полиморфные операторы и общие n-арные операторы (например, trernary if-then-else )

Алгоритм достаточно общий (можно сказать, обобщенная вариация алгоритма Шунтинского двора )

Подход, который я возьму, это:

  1. Обозначьте выражение
  2. Разделите его на абстрактное синтаксическое дерево
  3. Выполнять замену переменных (см. Ожидаемую оценку )
  4. Вычислить результат

Теперь…

  • Алгоритм шунтирования – способ сделать шаги 1 и 2.
  • Вы можете проверить, является ли выражение синтаксически правильным после второго шага
  • Как вы рассчитываете, результат будет зависеть от того, как построен АСТ.

Самый сложный шаг – второй; вы должны рассмотреть приоритет оператора, круглые скобки и другие вещи, но есть много литературы по этому поводу (вы даже можете просто следовать этой ссылке в Википедии)

почему вы просто не выполняете замены переменных, а затем делаете preg_replace("/[^0-9+-*\/]/", '', $inputString) , а затем используете либо eval() либо create_function() ? Если вы используете это, вы ДОЛЖНЫ убедиться, что, возможно, небезопасные «инструкции» удалены, поэтому я использовал preg_replace, поэтому он удалял бы любую литеральную строку