【问题标题】:evaluate boolean expression in java generate at runtime在运行时评估java中的布尔表达式生成
【发布时间】:2011-01-30 22:14:11
【问题描述】:

如何在 Java 程序中计算运行时生成的复杂布尔表达式?

例子:

(x 和 y 或 z) 和 s

带有 x、y、z 布尔变量 ...

谢谢

【问题讨论】:

  • 您的问题不清楚。 if ((x && y || z) && s) 怎么了?
  • 你能给出一个代码示例来说明你是如何表示你的表达式的吗?
  • 表达式是从 xml 文件加载的,但是布尔变量根据程序的当前状态取不同的值。所以我不能使用上面建议的 if 因为它并不总是相同的表达式...
  • 好吧,那么您将不得不构建一个解析器(没什么大不了的,但支持嵌套 - 所以甚至不要使用正则表达式!),构建一个 AST 并使用映射变量名对其进行评估 = > 布尔值。
  • @delnan 也许更容易使用 PEP ling.ohio-state.edu/~scott/#projects-pep 来解析它,然后按照你的建议做。

标签: java runtime generator boolean-expression expression-evaluation


【解决方案1】:

使用http://docs.codehaus.org/display/JANINO/Home 进行最少的工作。我能做的不仅仅是简单的表达。

【讨论】:

  • 在我指向的页面上,docs.codehaus.org/display/JANINO/Basic。第一个示例就足够了,只需将类型更改为布尔值。
  • 谢谢,这是一个简单而直接的解决方案,可以满足我的兴趣。
【解决方案2】:

很简单,您需要布尔表达式的“中间表示”。这是由Node 对象组成的树。 Node 具有子类 AndNodeOrNodeNotNodeVariableNode。一个AndNode 有两个孩子Nodes,一个OrNode 有两个孩子Nodes,一个NotNode 有一个孩子Node

VariableNode 只有一个变量名字符串,例如“x”。您将拥有一个 HashMap<String, Boolean>,其中每个变量名称键都有一个关联的布尔值。

每个 Node 类都有一个 eval() 方法,该方法计算其表达式并返回一个 booleanVariableNode.eval() 方法在 HashMap 中查找变量的值并返回它。 NotNode.eval() 返回!child.eval()AndNode.evaluate() 返回child1.eval() && child2.eval(),而OrNode.evaluate() 返回child1.eval() || child2.eval()。要计算整个布尔表达式树,只需调用根节点的 eval() 方法即可。

您可以使用 Java 构造函数等以编程方式构建这些布尔表达式树。

如果您想从字符串构建表达式树,您需要编写一个解析器来从字符串生成树。 Terence Parr 的Language Implementation Patterns 对此进行了非常简单明了的介绍。

【讨论】:

  • 这种方法对我很有效。我还在 JSF webapp 中实现了一个可视化表达式编辑器 UI,使用 Tomahawk 树视图控件来显示节点。
【解决方案3】:

如何评估一个逻辑表达式?诸如此类的逻辑表达式可以作为语法树进行评估,我认为在这个相关问题Logic expression parser

中有一些很好的信息

另一个想到的事情是您希望能够将逻辑表达式作为数据处理,这似乎更适合 Jython、JRuby、Groovy 或 Scala 等脚本语言(假设您仅限于JVM)。虽然我怀疑编写解析器来处理基本和/或/非逻辑表达式会非常困难。

【讨论】:

    【解决方案4】:

    您必须生成一个表达式树并将每个叶子绑定到一个布尔值。要解析此表达式并生成 AST,请查看 Dijkstra 的 Shunting Yard 算法。一切都在其中进行了解释,并且实施起来相当简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      相关资源
      最近更新 更多