2

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

实施例:

(x和y或z)的和s

与X,Y,Z布尔型变量...

由于

+2

你的问题不清楚。 if((x && y || z)&& s)`有什么问题`? – 2011-01-30 22:17:10

+1

你能举一个代码示例来展示你如何表达你的表达式吗? – sinelaw 2011-01-30 22:17:17

+0

表达式从xml文件中加载,但布尔变量根据程序的当前状态采用不同的值。所以我不能使用上面建议的if,因为它不总是相同的表达式...... – sdfrevfse 2011-01-30 22:23:33

回答

0

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

另一件需要思考的事情是,您希望能够将逻辑表达式作为数据来处理,这看起来更适合于像Jython,JRuby,Groovy或Scala这样的脚本语言(假设你只限于JVM)。虽然我怀疑编写解析器来处理基本表达式和/或非逻辑表达式会很困难。

0

您必须生成一个表达式树并将每个叶绑定到一个布尔值。为了解析这个表达式并生成一个AST,可以看看Dijkstra的Shunting Yard算法。所有内容都在那里解释,并且相当直接的实施。

1

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

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

每个节点类都有一个eval()方法,用于评估其表达式并返回booleanVariableNode.eval()方法在您的HashMap中查找变量的值并将其返回。 NotNode.eval()返回!child.eval()AndNode.evaluate()返回child1.eval() && child2.eval(),而OrNode.evaluate()返回child1.eval() || child2.eval()。要评估整个布尔表达式树,只需调用根节点的方法eval()即可。

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

如果你想从字符串构建表达式树,你需要编写一个从字符串产生一个树解析器。特伦斯帕尔的Language Implementation Patterns是一个非常简单明了的介绍。