如何评估在 Java 程序中运行时生成的复杂布尔表达式?
例子:
(x 和 y 或 z) 和 s
带有 x, y, z 布尔变量...
谢谢
如何评估在 Java 程序中运行时生成的复杂布尔表达式?
例子:
(x 和 y 或 z) 和 s
带有 x, y, z 布尔变量...
谢谢
简而言之,您需要布尔表达式的“中间表示”。这是由Node
对象组成的树。 Node
有子类AndNode
, OrNode
,NotNode
和VariableNode
. 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 的语言实现模式对此进行了非常简单明了的介绍。
使用http://docs.codehaus.org/display/JANINO/Home进行最少的工作。我可以做的不仅仅是简单的表达。
如何评估逻辑表达式?诸如此类的逻辑表达式可以作为语法树进行评估,我认为在这个相关问题Logic expression parser中有一些很好的信息
想到的另一件事是您希望能够将逻辑表达式作为数据处理,这似乎更适合脚本语言,例如 Jython、JRuby、Groovy 或 Scala(假设您仅限于 JVM) . 尽管我怀疑编写解析器来处理基本和/或/非逻辑表达式会非常困难。
您必须生成一个表达式树并将每个叶子绑定到一个布尔值。要解析此表达式并生成 AST,请查看 Dijkstra 的Shutting Yard算法。一切都在其中进行了解释,并且实施起来相当简单。