2013-03-18 61 views
1

我怎麼能最佳評估用戶指定的布爾表達式的字符串,如:如何將布爾表達式字符串轉換爲對象?

A & B | (C & !D) 

我需要做什麼用的?例如: 假設我們有一組人,並且用戶有一個輸入框,在那裏他可以寫爲:String像布爾表達式連接這些人兩個(及以上):

Peter & Klaus | (Peter & Clair | !Klaus) 

(我知道這表情沒有任何意義,只是作爲一個例子)。

然後我想用布爾語法來分割這個布爾字符串。 後來,如果一個人被重命名(例如彼得 - >約翰),我希望用戶賦予的表達式也用新名稱自動重命名。這樣用戶就可以用新名稱查看他保存的表達式的更新。

因此,我可能必須使用代表名稱後面的對象的ID來存儲布爾表達式。因此必須從db中的表達式中查找每個名字,因此必須用布爾語法分割字符串。

問題:

  • 我怎麼能最好的拆分此字符串?

  • 如何使用對象值存儲此表達式,以便在名稱更改時可以重新評估此字符串?

+0

也許我的問題題目不對:我不是真的想將表達式評估爲true或false,而是想根據這個布爾expr來解析/分割/製作引用。 – membersound 2013-03-18 10:52:51

+0

您是否正在尋找一種方法來「表示」這樣的表達式,並且最終並且只是可選地評估它的布爾值? 從概念上講,像這樣的東西? http://en.wikipedia.org/wiki/Binary_expression_tree 如果是這樣,你可能想看看ANTLR和類似的東西......這幾乎是他們存在的原因:詞法和句法解析... – mdm 2013-03-18 11:00:43

+0

I 「代表」或「存儲」是正確的詞。我想保存這個表達式,並用放置在數據庫中的對象(人物對象)來表示它。然後,如果有人被重命名,表達式應該被自動更新。或者,一旦保存的表達式應該使用保存的對象引用來顯示,並且執行像object.getName()這樣的操作來構建表達式的可視表示。 – membersound 2013-03-18 11:03:15

回答

1

一種解決方案是將信息解析成節點樹,其中節點可以存儲名稱,運算符或表達式。你可以在每個節點上使用一個id來允許你替換名字或者其他什麼。

要進行解析本身,基本要求非常簡單。這一切都取決於這些表達式可以變得多複雜。要做一個適當和完整的布爾表達式語法,我會推薦一個像antlr這樣的解析器工具。

相關問題