在运行时评估java生成中的boolean表达式

时间:2011-01-30 22:14:11

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

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

示例:

(x和y或z)和s

使用x,y,z布尔变量...

由于

4 个答案:

答案 0 :(得分:1)

非常简单,您需要布尔表达式的“中间表示”。这是由Node个对象组成的树。 Node有子类AndNodeOrNodeNotNodeVariableNodeAndNode有两个孩子NodeOrNode有两个孩子NodeNotNode有一个孩子Node

VariableNode只有一个变量名String,例如“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是一个非常简单明了的介绍。

答案 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算法。一切都在那里解释,并且相当直接实施。