2

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

例子:

(x 和 y 或 z) 和 s

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

谢谢

4

4 回答 4

1

简而言之,您需要布尔表达式的“中间表示”。这是由Node对象组成的树。 Node有子类AndNode, OrNode,NotNodeVariableNode. AnAndNode有两个孩子Node,anOrNode有两个孩子Node,aNotNode有一个孩子Node

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

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

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

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

于 2011-01-30T23:09:43.497 回答
1

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

于 2011-01-31T02:24:26.007 回答
0

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

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

于 2011-01-30T22:24:34.117 回答
0

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

于 2011-01-30T22:57:21.197 回答