回答
使用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. 布爾表達式評估
- 4. 在C中評估布爾表達式
- 5. 評估布爾字符串表達式?
- 6. 布爾表達式評估c#
- 7. SQL Server布爾表達式評估
- 8. 布爾表達式中的評估函數和表達式
- 9. 用於布爾表達式評估的Javascript評估
- 10. 如何使用Datatable的Compute方法在運行時評估布爾表達式?
- 11. Java中評估的布爾表達式順序?
- 12. 它將在布爾表達式中進行評估?
- 13. 如何在C++布爾表達式中評估指針?
- 14. 在Python中評估Sympy布爾表達式
- 15. Java Eclipse評估表達式
- 16. 使用SQL Server(CLR)進行邏輯/布爾表達式評估
- 17. 使用給定上下文進行布爾表達式評估
- 18. 在java中評估後綴表達式
- 19. 如何評估C中的布爾表達式?
- 20. 切換到Python中的布爾表達式評估
- 21. 評估許多布爾表達式,如Ruby中的Array#連接
- 22. 從JavaScript中的變量評估布爾表達式
- 23. 評估腳本解釋器中的布爾表達式
- 24. 字符串中的評估布爾表達式 - 去
- 25. C++中的布爾表達式解析和評估
- 26. 如何評估LINQ表達式樹中的獨立布爾表達式
- 27. 評估布爾表達式的值的算法
- 28. T-SQL - 用於評估布爾表達式字符串的Tehnique
- 29. 瞭解長布爾表達式的評估
- 30. 布爾AND不評估表達式的兩邊
你的問題不清楚。 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