2011-12-29 77 views
2

我過去幾次遇到類似的問題,想知道用什麼語言(方法論)來解決類似問題(我是J2EE/Java開發人員) :用於序列處理或解析的首選語言/技術

問題:出一個可能的組詞,與給定規則的(說這個詞可以是A和X的組合,並且總是以X開頭,每個單詞用空格分隔),你有閱讀單詞序列並通過輸入解析以確定哪些單詞在合成上是正確的。簡而言之,這些是涉及解析技術的問題。說在Java中模擬自動售貨機的邏輯。

所以我想知道什麼是解決輸入分析問題的技術/最佳方法。像谷歌代碼果醬外星語言處理問題

Google code jam problem

難道我們使用類似ANTLR或一些Java庫。

我知道這個問題稍微通用的,但我不得不表達它沒有別的辦法。

P.S:我不想要一個解決方案,我正在尋找解決此類問題的最佳方法。

回答

2

可以使用的JavaCC進行復雜的分析。

對於相對簡單的解析和事件處理,我使用枚舉(s)作爲狀態機。尤其是推式解析器。

對於非常簡單的解析,您可以使用與等號,開關的indexOf或拆分(」「)或startsWith

+0

你談論這樣的做法:http://www.javacodegeeks.com/2011/07/java-secret-using-enum-to-build-state.html – Ayusman 2011-12-29 16:54:05

+0

自從我寫,我也有心裏。 ;)下半部分是使用枚舉作爲狀態機的一個例子。 – 2011-12-29 16:57:57

+0

偉大的彼得.. +1,我也嘗試在過去,卻無法充分理解它。讓我再嘗試一次。 – Ayusman 2011-12-29 17:17:18

1

如果要模擬的東西,本質上是一個有限狀態自動的邏輯,你可以簡單地手工編碼FSA。這是標準的計算機科學解決方案。一個不太明顯的方式做到這一點是使用詞法分析器發電機(有很多人),從事件的有效序列的描述產生的FSA(在詞法分析器發電機講,這些被稱爲「角色」,但你可以欺騙並將事件發生替換爲字符)。

如果您有關於匹配複雜的遞歸規則,你會想要一個更傳統的解析器。 可以用手,這些代碼也一樣,如果語法並不複雜;請參閱我的?SO answer on "how to build a recursive descent parser"。如果你的語法很複雜,或者它變化很快,你會想使用一個標準的解析器生成器。其他答案在這裏提出具體的答案,但有很多可供選擇的,通常都非常有能力。 [FWIW,我在1974年應用語法分析器生成器在May公司百貨商店的TRW POS終端中識別有效的事務序列。工作得很好。]

0

你可以使用ANTLR這是很好的,它會幫助複雜的問題但你也可以使用正則表達式,例如:spilled(「\\ s +」)。