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

例子:

(x 和 y 或 z)和 s

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

谢谢

有帮助吗?

解决方案

使用 http://docs.codehaus.org/display/JANINO/Home 最少的工作。除了简单的表达方式,我还可以做更多的事情。

其他提示

简而言之,您需要布尔表达式的“中间表示”。这是一棵由以下组成的树 Node 对象。 Node 有这个子类 AndNode, OrNode, NotNode, , 和 VariableNode. 。一个 AndNode 有两个孩子 Node, 一个 OrNode 有两个孩子 Nodes 和一个 NotNode 有一个孩子 Node.

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

每个 Node 类都有一个 eval() 计算其表达式并返回一个的方法 boolean. 。这 VariableNode.eval() 方法查找变量的值 HashMap 并返回它。 NotNode.eval() 回报 !child.eval(). AndNode.evaluate() 回报 child1.eval() && child2.eval(), , 尽管 OrNode.evaluate() 回报 child1.eval() || child2.eval(). 。要评估整个布尔表达式树,只需调用根节点的 eval() 方法。

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

如果您想从字符串构建表达式树,则需要编写一个解析器来从字符串生成树。特伦斯·帕尔的 语言实现模式 对此有一个非常简单明了的介绍。

如何计算逻辑表达式?诸如此类的逻辑表达式可以作为语法树求值,我认为在此相关问题中有一些很好的信息逻辑表达式解析器

我想到的另一件事是,您希望能够将逻辑表达式作为数据进行处理,这似乎更适合于脚本语言,例如Jython,JRuby,Groovy或Scala(假设您仅限于JVM)。尽管我对此表示怀疑,但编写一个解析器来处理基本和/或/非逻辑表达式将非常困难。

您将必须生成一个表达式树并将每个叶子绑定到一个布尔值。要解析此表达式并生成AST,请看一下Dijkstra的 Shunting Yard 算法。一切都在这里进行了解释,并且很容易实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top