Моему приложению нужно выполнить некоторые математические операции с некоторыми данными. Поскольку эти операции будут меняться очень часто, я подумал об использовании интерпретируемого языка и позволил пользователю писать их.
Я вижу, что в PHP есть как LUA, так и JS-анализатор, однако документация очень плохая.
Существуют ли интерпретируемые языки, которые можно анализировать с PHP? Мне нужны только базовые операторы if-then-else и math
Даже если документации немного, я пойду на LUA, используя скрипт установки, найденный здесь https://github.com/chtombleson/php-lua-install-script
Другие поддерживаемые языки перечислены здесь http://pecl.php.net/packages.php?catpid=59&catname = Языки
Я знаю, что уже поздно отвечать на это, но …
Работа с настраиваемой пользовательской логикой и отсутствие простого, готового к работе решения — вот почему я просто пошел дальше и создал свой собственный язык сценариев под названием прими.
Написан исключительно на PHP, изолирован в песочнице и интерпретируется PHP. Сделано без зависимостей от некоторых внешних двоичных файлов и / или библиотек или каких-либо необычных, нестандартных расширений PHP.
Я имею в виду, phpv8 / v8js довольно здорово (и похоже, что они проделали большую работу за последние 2 года), но посаживании его к трудовой деятельности часть была для меня довольно грубой — по крайней мере, в то время, когда я занимался исследованиями существующих сценариев (и с моими ограниченными знаниями Linux). Загрузка и компиляция Google V8, настроить компиляцию расширения и, наконец, заставить его работать — это даже не вариант иногда, если у вас нет абсолютного контроля над вашей машиной (облачный хостинг и прочее).
Прими наиболее определенно очень, очень плохой на любой полноценный язык сценариев / программирования, такой как PHP, JS, Python и т. д. — как по функциям, так и по производительности (интерпретируется PHP).
Цель Прими не состоит в том, чтобы делать сложные вещи — иметь ООП, поддерживать классы, асинхронные вещи или еще много чего (по крайней мере, не сейчас) — а чтобы обеспечить простой способ для разработчика, чтобы позволить его / ее клиентам написать собственную логику (вычисления, условия, циклы, манипуляции со строками и т. д.) это может быть благополучно выполнен внутри интерпретатора Primi, который сам исполняется PHP и, таким образом, ограничивается собственной виртуальной машиной PHP.
И все это без каких-либо изменений в окружающей среде (Установка бинарных файлов для всей ОС, компиляция библиотек).
прими может быть установлен как Композитор а затем используется мгновенно:
composer require smuuf/primi
И это все для процесса установки.
Затем интерпретатор можно использовать так:
$context = new \Smuuf\Primi\Context;
$interpreter = new \Smuuf\Primi\Interpreter($context);
try {
// Let the interpreter run a source code.
$interpreter->run('a = 1; b = a + 2; c = "some string"; d = c + " extra thing";');
// Get defined variables from primary context and print them.
foreach ($context->getVariables() as $name => $value) {
printf("%s (%s) ... %s\n", $name, $value::TYPE, $value->getPhpValue());
}
} catch (\Smuuf\Primi\ErrorException $e) {
die($e->getMessage());
}
Запуск этого кода в PHP приведет к следующему:
a (number) ... 1
b (number) ... 3
c (string) ... some string
d (string) ... some string extra thing
Я автор этого
Если вы обнаружите какие-либо ошибки, о которых будете сообщать, у вас есть предложения по новым функциям, или вы просто хотите посмотреть, как это работает или хотите помочь, вы можете найти все остальное здесь: https://github.com/smuuf/primi.
Я, вероятно, сделал бы это комментарием, но это слишком долго, и это технически ПОЧТИ ответ :-p
Если вам нужен самый простой подход для ваших пользователей … когда пользователь вводит уравнение, а затем вы несете ответственность за его использование на последующих страницах … тогда вы можете выполнить разбор строк.
Так, например, вы найдете все текстовые символы в строке и конвертируете их во входные данные. Итак, с помощью уравнения «2x» вы бы создали один вход: 2<input name='x' />
Затем в посте вы конвертируете 2x в:
$result = floatval(2) * floatval($_GET['x']);
Примерно так довольно безопасно, если вы не доверяете ни уравнению, ни пользовательскому вводу в виде кода PHP … гарантируете правильные типы и т. Д. Однако, в зависимости от вашего опыта, правильно анализируйте строку и превращаете 2y в 2 * у, и т. д., будет вашим вызовом, и больше, чем я могу ответить в данное время.
Дело в MathML в том, что если вы можете взять уравнение пользователя и преобразовать его в MathML, вы сможете воспользоваться работой других людей для обработки уравнения. Суть моего комментария заключалась не в том, чтобы пользователь сам использовал MathML … это ваша работа 🙂