【问题标题】:Java: Library for expression parsing & evaluation with identifiers not known in advanceJava:使用事先未知的标识符进行表达式解析和评估的库
【发布时间】:2011-12-12 18:30:11
【问题描述】:

我需要计算一个布尔表达式。 目的是过滤一组标记项目。 标记可以是任何名称(比如 Java 标识符)。

例如:

foo OR (bar AND !baz)

这对于标记的项目是正确的:

  • foo 费
  • 富吧嘘
  • 酒吧

我事先不知道需要哪些名字。 我检查了 JEXL,但它有 JexlContext,它基本上是一个需要在评估之前填充的地图。

我需要一些调用回调函数来决定标识符是真还是假的库。或任何其他允许标识符在评估之前未知的机制。

它必须像啤酒一样免费(它用于 Maven 插件),所以 Jep 是不可能的。

我可以使用什么?

【问题讨论】:

标签: java parsing callback boolean-expression expression-evaluation


【解决方案1】:

您可以提供不依赖于MapJexlContext 实现。您可以将其对 hasget 的检查视为回调,而不是在评估之前填充它,而忽略对 set 的调用。

【讨论】:

  • 听起来不错,我没有注意到它是一个界面:) 我会试试看。
【解决方案2】:

在 Google 的 guava 中尝试Predicate

【讨论】:

  • 表达式有解析器吗?
  • 不,它基于类和对象。根据上面的响应解析使用 ScriptEngine
【解决方案3】:

最简单的方法是使用自 java 6 以来作为 JDK 一部分的 JavaScript。这是一个示例

    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 的教程。

【讨论】:

  • 它如何处理未知标识符?
  • 实际上,我只能将 known 设置为 TRUE,如果它针对这种情况抛出特殊异常,我可以将其视为 false。
  • 还有一点 - JavaScript 不在 OpenJDK 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 2011-07-24
  • 2023-03-07
  • 2022-11-07
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
相关资源
最近更新 更多