Java: библиотека для разбора и оценки выражений с неизвестными заранее идентификаторами - PullRequest
0 голосов
/ 12 декабря 2011

Мне нужно оценить логическое выражение.Цель состоит в том, чтобы отфильтровать набор тегов .Тэг может быть любым именем (скажем, как идентификатор Java).

Например:

foo OR (bar AND !baz)

Это будет верно для тегов:

  • foofee
  • foo bar boo
  • bar

Я не знаю заранее, какие имена понадобятся.Я проверил JEXL, но у него есть JexlContext , который по сути является картой, которую необходимо заполнить до оценки.

Мне нужна библиотека, которая вызывает функцию обратного вызова, чтобы определить, является ли идентификаторэто правда или ложь.Или любой другой механизм, позволяющий идентификаторы, неизвестные до оценки.

Он должен быть бесплатным, как в пиве (это для плагина Maven), так что о Jep не может быть и речи.

Что я могуиспользовать?

Ответы [ 3 ]

1 голос
/ 12 декабря 2011

Вы можете предоставить реализацию JexlContext, которая не зависит от Map. Вместо того, чтобы заполнять его перед оценкой, вы можете рассматривать его проверки для has, get как ваши обратные вызовы и игнорировать вызовы set.

0 голосов
/ 12 декабря 2011

Самый простой способ - использовать JavaScript, который является частью JDK начиная с java 6. Вот пример

    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("JavaScript");
    // populate variables foo, bar and baz to the engine, e.g.
    engine.put("foo", true);
    engine.put("bar", true);
    engine.put("baz", false);
    engine.eval("foo OR (bar AND !baz)"); 

Для получения дополнительной информации ознакомьтесь с руководством по Oracle .

0 голосов
/ 12 декабря 2011

Попробуйте Предикат в гуаве Google

...