评估运行时生成的java中的布尔表达式
-
27-10-2019 - |
题
如何计算 Java 程序运行时生成的复杂布尔表达式?
例子:
(x 和 y 或 z)和 s
带有 x、y、z 布尔变量...
谢谢
解决方案
使用 http://docs.codehaus.org/display/JANINO/Home 最少的工作。除了简单的表达方式,我还可以做更多的事情。
其他提示
简而言之,您需要布尔表达式的“中间表示”。这是一棵由以下组成的树 Node
对象。 Node
有这个子类 AndNode
, OrNode
, NotNode
, , 和 VariableNode
. 。一个 AndNode
有两个孩子 Node
, 一个 OrNode
有两个孩子 Node
s 和一个 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 算法。一切都在这里进行了解释,并且很容易实现。