Парсинг формулы, введенной пользователем (eval) - PullRequest
0 голосов
/ 21 ноября 2010

Добрый день всем,

Я пытаюсь выяснить, как разрешить пользователям вызывать метод для некоторых указанных данных.

Я хотел бы предоставить предопределенный набор функций:

  • Скользящая средняя, ​​moving_ave (x, 5) .. будет 5-дневной скользящей средней по x.
  • 3 * x + y .... и так далее ...

Итак, в основном, я предоставлю пользователям различные серии данных (x, y, z ....) и набор функций moving_ave, + - / * .... и они должны иметь возможность писать простые формулы (ограниченные функциями, которые я предоставляю).

как это можно сделать?

Я буду развертывать этона App Engine для Java .

так что я узнал о JSR-223 ... но я не уверен, подходит ли он?Я думаю, что могу использовать функцию Eval.

Спасибо,

Ответы [ 3 ]

1 голос
/ 22 ноября 2010

Звучит так, будто вы хотите интерпретатора простой грамматики. Будьте очень осторожны с подходами, такими как предложенные Aerosteak; Позволять своему пользователю напрямую вызывать функции в вашем коде опасно, и легко допускать ошибки, помещая их в «песочницу», что приводит к уязвимостям безопасности. Также вам потребуется написать собственный синтаксический анализатор.

Самым простым подходом, вероятно, является использование существующего языка - Javascript, вероятно, подходит очень хорошо, и вы можете использовать Rhino , интерпретатор Javascript, написанный на Java.

0 голосов
/ 22 ноября 2010

Это звучит как что-то, что может быть сделано на клиенте, а не на сервере. Вы можете написать несколько удобных функций javascript, которые вызывают API-интерфейс restful на сервере, чтобы предоставить необходимые данные для еще нескольких удобных функций javascript, которые выполняют полезные вычисления. Почти всегда безопасно позволить пользователям оценивать свои собственные клиенты .. они могут сделать это в любом случае.

0 голосов
/ 21 ноября 2010

Вам потребуется использовать Reflection для вызова неизвестного метода.Посмотрите на Apache BeanUtil.

У вас может быть TextBox со значением: 1,2,3, Преобразовать эти значения в массив объектов.

Есть еще одно поле ComBo со всеми возможными способамивызов.

Затем используйте Bean Util для вызова метода с массивом объектов.

Для примера:

class MyMathManager {

public void doCalculationType1 (Object args ...) {..} public void doCalculationType2 (Object args ...) {..} public void doCalculationType3 (Object args ...) {..}

Затем посмотрите на Java BeanUtil для вызова этих методов.

Удачи.

...