2

如何評估在Java程序中運行時生成的複雜布爾表達式?評估java中的布爾表達式在運行時生成

實施例:

(x和y或z)的和s

與X,Y,Z布爾型變量...

由於

+2

你的問題不清楚。 if((x && y || z)&& s)`有什麼問題`? – 2011-01-30 22:17:10

+1

你能舉一個代碼示例來展示你如何表達你的表達式嗎? – sinelaw 2011-01-30 22:17:17

+0

表達式從xml文件中加載,但布爾變量根據程序的當前狀態採用不同的值。所以我不能使用上面建議的if,因爲它不總是相同的表達式...... – sdfrevfse 2011-01-30 22:23:33

回答

0

如何評估的邏輯表達式?像這樣的邏輯表達式可以被評估爲一個語法樹,我認爲在這個相關的問題中有一些很好的信息Logic expression parser

另一件需要思考的事情是,您希望能夠將邏輯表達式作爲數據來處理,這看起來更適合於像Jython,JRuby,Groovy或Scala這樣的腳本語言(假設你只限於JVM)。雖然我懷疑編寫解析器來處理基本表達式和/或非邏輯表達式會很困難。

0

您必須生成一個表達式樹並將每個葉綁定到一個布爾值。爲了解析這個表達式並生成一個AST,可以看看Dijkstra的Shunting Yard算法。所有內容都在那裏解釋,並且相當直接的實施。

1

簡而言之,您需要布爾表達式的「中間表示」。這是一棵由Node對象組成的樹。 Node具有的子類AndNode,OrNode,NotNodeVariableNode。一個AndNode有兩個孩子Node s,一個OrNode有兩個孩子Node s和一個NotNode有一個孩子Node

A VariableNode只有一個變量名字符串,例如「x」。您將有一個HashMap<String, Boolean>其中每個變量名稱鍵具有關聯的布爾值。

每個節點類都有一個eval()方法,用於評估其表達式並返回booleanVariableNode.eval()方法在您的HashMap中查找變量的值並將其返回。 NotNode.eval()返回!child.eval()AndNode.evaluate()返回child1.eval() && child2.eval(),而OrNode.evaluate()返回child1.eval() || child2.eval()。要評估整個布爾表達式樹,只需調用根節點的方法eval()即可。

可以通過編程方式構建這些布爾表達式樹,使用Java構造函數等

如果你想從字符串構建表達式樹,你需要編寫一個從字符串產生一個樹解析器。特倫斯帕爾的Language Implementation Patterns是一個非常簡單明瞭的介紹。