
Комментарии 11
Вы проделали неплохую работу. Но совершенно забыли указать среди аналогов https://symfony.com/doc/current/components/expression_language.html
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