Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java运行时生成布尔表达式_Java_Runtime_Generator_Boolean Expression_Expression Evaluation - Fatal编程技术网

在java运行时生成布尔表达式

在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)。尽管我怀疑编写一个解析器来处理基本表达式和/或非逻辑表达式会非常困难。您必须生成一个表达式树,并将每个叶绑定到一个布尔值。要解析

如何在Java程序中计算运行时生成的复杂布尔表达式

例如:

(x和y或z)和s

使用x、y、z布尔变量


谢谢

如何计算逻辑表达式?像这样的逻辑表达式可以作为语法树来计算,我认为在这个相关的问题中有一些很好的信息


另一件让人想到的事情是,您希望能够将逻辑表达式作为数据处理,这似乎更适合像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来显示节点。