回答
使用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