在java运行时生成布尔表达式
如何在Java程序中计算运行时生成的复杂布尔表达式 例如: (x和y或z)和s 使用x、y、z布尔变量在java运行时生成布尔表达式,java,runtime,generator,boolean-expression,expression-evaluation,Java,Runtime,Generator,Boolean Expression,Expression Evaluation,如何在Java程序中计算运行时生成的复杂布尔表达式 例如: (x和y或z)和s 使用x、y、z布尔变量 谢谢如何计算逻辑表达式?像这样的逻辑表达式可以作为语法树来计算,我认为在这个相关的问题中有一些很好的信息 另一件让人想到的事情是,您希望能够将逻辑表达式作为数据处理,这似乎更适合像Jython、JRuby、Groovy或Scala这样的脚本语言(假设您仅限于JVM)。尽管我怀疑编写一个解析器来处理基本表达式和/或非逻辑表达式会非常困难。您必须生成一个表达式树,并将每个叶绑定到一个布尔值。要解析
谢谢如何计算逻辑表达式?像这样的逻辑表达式可以作为语法树来计算,我认为在这个相关的问题中有一些很好的信息
另一件让人想到的事情是,您希望能够将逻辑表达式作为数据处理,这似乎更适合像Jython、JRuby、Groovy或Scala这样的脚本语言(假设您仅限于JVM)。尽管我怀疑编写一个解析器来处理基本表达式和/或非逻辑表达式会非常困难。您必须生成一个表达式树,并将每个叶绑定到一个布尔值。要解析这个表达式并生成AST,请看一下Dijkstra的算法。所有内容都在这里进行了解释,并且很容易实现 非常简单,您需要布尔表达式的“中间表示”。这是由
节点
对象组成的树<代码>节点具有子类和节点
、或节点
、非节点
和变量节点
。一个和节点
有两个子节点
s;或节点
有两个子节点
s;非节点
有一个子节点
VariableNode
只有一个变量名字符串,例如“x”。您将拥有一个HashMap
,其中每个变量名键都有一个关联的布尔值
每个节点类都有一个eval()
方法,该方法计算其表达式并返回一个布尔值。VariableNode.eval()
方法在HashMap
中查找变量的值并返回它NotNode.eval()
返回!child.eval()
AndNode.evaluate()
返回child1.eval()&&child2.eval()
,而OrNode.evaluate()
返回child1.eval()| child2.eval()
。要计算整个布尔表达式树,只需调用根节点的eval()
方法
您可以使用Java构造函数等以编程方式构建这些布尔表达式树
如果要从字符串构建表达式树,则需要编写一个解析器,从字符串生成树。特伦斯·帕尔的介绍非常简单明了。用于最小工作量。我能做的不仅仅是简单的表达。你的问题不清楚。如果((x&&y | | z)&&s)
,有什么问题吗?能否给出一个代码示例,说明如何表示表达式?表达式是从xml文件加载的,但是布尔变量根据程序的当前状态采用不同的值。因此,我不能像上面建议的那样使用if,因为它并不总是相同的表达式……那么,您必须构建一个解析器(没有什么大的,但支持嵌套,所以甚至不要使用regex!),构建AST并使用映射变量names=>bools对其进行评估。@delnan可能更容易使用PEP对其进行解析,然后按照您的建议进行操作。在我指向的页面上。第一个例子就足够了,只需将类型更改为boolean即可。谢谢,这是一个简单而直接的解决方案,满足了我的兴趣。这种方法对我非常有效。我还使用Tomahawk treeview控件在JSF Web应用程序中实现了一个可视化表达式编辑器UI来显示节点。