回答
使用http://docs.codehaus.org/display/JANINO/Home最低限度的工作。我可以做的不仅仅是简单的表达。
如何评估的逻辑表达式?像这样的逻辑表达式可以被评估为一个语法树,我认为在这个相关的问题中有一些很好的信息Logic expression parser
另一件需要思考的事情是,您希望能够将逻辑表达式作为数据来处理,这看起来更适合于像Jython,JRuby,Groovy或Scala这样的脚本语言(假设你只限于JVM)。虽然我怀疑编写解析器来处理基本表达式和/或非逻辑表达式会很困难。
您必须生成一个表达式树并将每个叶绑定到一个布尔值。为了解析这个表达式并生成一个AST,可以看看Dijkstra的Shunting Yard算法。所有内容都在那里解释,并且相当直接的实施。
简而言之,您需要布尔表达式的“中间表示”。这是一棵由Node
对象组成的树。 Node
具有的子类AndNode
,OrNode
,NotNode
和VariableNode
。一个AndNode
有两个孩子Node
s,一个OrNode
有两个孩子Node
s和一个NotNode
有一个孩子Node
。
A VariableNode
只有一个变量名字符串,例如“x”。您将有一个HashMap<String, Boolean>
其中每个变量名称键具有关联的布尔值。
每个节点类都有一个eval()
方法,用于评估其表达式并返回boolean
。 VariableNode.eval()
方法在您的HashMap
中查找变量的值并将其返回。 NotNode.eval()
返回!child.eval()
。 AndNode.evaluate()
返回child1.eval() && child2.eval()
,而OrNode.evaluate()
返回child1.eval() || child2.eval()
。要评估整个布尔表达式树,只需调用根节点的方法eval()
即可。
可以通过编程方式构建这些布尔表达式树,使用Java构造函数等
如果你想从字符串构建表达式树,你需要编写一个从字符串产生一个树解析器。特伦斯帕尔的Language Implementation Patterns是一个非常简单明了的介绍。
- 1. Java中的布尔表达式评估
- 2. 布尔表达式评估
- 3. 布尔表达式评估c#
- 4. SQL Server布尔表达式评估
- 5. 用于布尔表达式评估的Javascript评估
- 6. Java中评估的布尔表达式顺序?
- 7. 如何在C++布尔表达式中评估指针?
- 8. 使用SQL Server(CLR)进行逻辑/布尔表达式评估
- 9. 切换到Python中的布尔表达式评估
- 10. 字符串中的评估布尔表达式 - 去
- 11. 如何评估C中的布尔表达式?
- 12. 如何评估LINQ表达式树中的独立布尔表达式
- 13. 了解长布尔表达式的评估
- 14. 使用“新布尔()”,以评估的逻辑表达式
- 15. 查找可能的布尔值来评估表达式为真
- 16. T-SQL - 用于评估布尔表达式字符串的Tehnique
- 17. 拉姆达的布尔评估
- 18. 如何在运行时编译/评估Scala表达式?
- 19. 在运行时不会评估角度表达式。为什么?
- 20. 如何使用eval()评估python字符串布尔表达式?
- 21. Chrome Javascript是否正确评估布尔表达式?
- 22. 为什么普通法则在评估布尔表达式时不适合LINQ?
- 23. 如何在Spring表达式语言中运行嵌套评估
- 24. 评估表达式仅产生
- 25. 发生事件时发生错误的Lambda表达式评估
- 26. 评估一个if语句的行为不同,然后评估布尔表达式
- 27. 评估在枫树中的表达式
- 28. 在javascript中的表达式评估
- 29. Java递归数学表达式评估
- 30. 表达式树评估java.lang.NumberFormatException java
你的问题不清楚。 if((x && y || z)&& s)`有什么问题`? – 2011-01-30 22:17:10
你能举一个代码示例来展示你如何表达你的表达式吗? – sinelaw 2011-01-30 22:17:17
表达式从xml文件中加载,但布尔变量根据程序的当前状态采用不同的值。所以我不能使用上面建议的if,因为它不总是相同的表达式...... – sdfrevfse 2011-01-30 22:23:33