如何评估Java程序中运行时生成的复杂布尔表达式?
示例:
(x和y或z)和s
使用x,y,z布尔变量...
由于
答案 0 :(得分:1)
非常简单,您需要布尔表达式的“中间表示”。这是由Node
个对象组成的树。 Node
有子类AndNode
,OrNode
,NotNode
和VariableNode
。 AndNode
有两个孩子Node
,OrNode
有两个孩子Node
,NotNode
有一个孩子Node
。
VariableNode
只有一个变量名String,例如“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构造函数等以编程方式构建这些布尔表达式树。
如果要从字符串构建表达式树,则需要编写一个从字符串生成树的解析器。 Terence Parr的Language Implementation Patterns是一个非常简单明了的介绍。
答案 1 :(得分:1)
使用http://docs.codehaus.org/display/JANINO/Home进行最低限度的工作。我可以做的不仅仅是简单的表达。
答案 2 :(得分:0)
如何评估逻辑表达式?诸如此类的逻辑表达式可以作为语法树进行评估,我认为在这个相关问题中有一些很好的信息Logic expression parser
另一件需要考虑的事情是,您希望能够将逻辑表达式作为数据处理,这似乎更适合像Jython,JRuby,Groovy或Scala这样的脚本语言(假设您仅限于JVM)。虽然我怀疑编写解析器来处理基本和/或非逻辑表达式是非常困难的。
答案 3 :(得分:0)
您必须生成表达式树并将每个叶子绑定到布尔值。要解析此表达式并生成AST,请查看Dijkstra的Shunting Yard算法。一切都在那里解释,并且相当直接实施。