Pull to refresh

Comments 11

Спасибо за оценку! Вроде, не забыл указать - 3й в списке в разделе "Интерпретаторы выражений от других авторов"

А зачем и почему обратная польская нотация? ЛИСПы, а вслед за ними буквально все AST используют прямую + 2 3, причем упростится и решатель.

И вот тут, насколько могу судить по беглому просмотру, некрасиво: trim приведет аргументы к строкам и вернет строку, так что, строго говоря, вы будете сравнивать не значения, а их строковые представления.

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

(в предыдущем коменте не разобрался с кодом автора)

В 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)");

походу мой косяк, поправлю

Sign up to leave a comment.

Articles