Comments 11
Вы проделали неплохую работу. Но совершенно забыли указать среди аналогов https://symfony.com/doc/current/components/expression_language.html
А зачем и почему обратная польская нотация? ЛИСПы, а вслед за ними буквально все AST используют прямую + 2 3
, причем упростится и решатель.
И вот тут, насколько могу судить по беглому просмотру, некрасиво: trim
приведет аргументы к строкам и вернет строку, так что, строго говоря, вы будете сравнивать не значения, а их строковые представления.
Я решал похожую задачу на эликсире, и самым простым способом для меня оказалось построить sandbox для выполнения, а потом звать eval
. Но тут так, насколько я знаю, не получится.
del
(в предыдущем коменте не разобрался с кодом автора)
В RPN решатель на простом стеке, куда проще?
самым простым способом для меня оказалось построить sandbox для выполнения, а потом звать eval
Не знаю насколько эликсир позволяет огородить sandbox, но если вы даете пользователям вводить формулы, лучше чтобы так доверять не приходилось
А в чём смысл был писать всё это с нуля, а не использовать phplrt или antlr? И код лучше будет в итоге и поддерживать проще и работать быстрее. А то вот от такого чуть-чуть глаза начинают кровоточить))) https://github.com/iustato/bql/blob/master/src/ExpressionInterpreter.php
P.S. А eval реализуется тупо выполнением метода eval у AST ноды выражения: $node->eval()
Есть ещё вот такая штука:
https://github.com/smuuf/primi
В какой-то момент использовал её, всё работало как надо, а позже и вовсе стал использовать lua модуль :)
Унарный минус у вас не поддерживается, я правильно понял?
$bql->evaluate("a = -(5 + b)");
походу мой косяк, поправлю
Это довольно нетривиально, мне пришлось захардкодить и было интересно как у вас
https://github.com/arokettu/arithmetic-parser/blob/master/src/Parser.php#L259
Интерпретатор выражений на php, без использования eval