2012-08-13 94 views
3

對於我們產品的Web服務接口,我們正在定義類似查詢字符串的sql。他們不遵循確切的SQL語法。它是這樣工作的。這些字符串存在於xml請求中。我的應用程序解析字符串並根據內容創建Java對象。這些java對象用於查詢數據庫。下面是查詢字符串的幾個例子:解析「SQL like」查詢字符串

objectType==device && deviceType==mobile && returnType==full 
objectType==device && deviceType==computer && deviceState==connected && returnType==basic 
objectType==networkEntity && namePattern==*.nw && networkEntityType==SGSN 

的鍵(的objectType例如)以及值(設備/ networkEntity)通常列舉。因此,解析機制的期望是:

  1. 如果查詢字符串中存在任何未知元素(鍵/值),則應該失敗。
  2. 元素(鍵/值)應出現在定義的順序(這僅僅是爲了簡化解析邏輯)
  3. 今後,除了「==」和「& &」,其它操作也可以得到介紹。
  4. 可以有鍵/值的不同組合導致大量的唯一查詢字符串。

現在我正在使用String.split和Scanner的組合來解析字符串。但是,我發現代碼變得越來越複雜,越來越難以調試。到目前爲止,我還沒有引入任何重要的驗證。因此,我期待代碼變得更加複雜和「醜陋」。

[問]是否有任何庫可以幫助我解析這樣的字符串。任何其他建議/想法也將不勝感激。

回答

5

有幾個Java庫用於將輸入數據解析爲對象樹。值得注意的是:

  • JParsec - 解析器組合框架(tutorial)。
  • ANTLR(另一種語言識別工具) - 一種語言工具,提供從語法描述(tutorial)中構建識別器,解釋器,編譯器和翻譯器的框架。
  • JavaCC - (tutorial)。

這取決於您的喜好和背景使用哪一個。 JParsec僅以本地Java語言構造解析器(不包括外部語法文件等),另外兩個則從語法描述文件生成解析器。

開始時使用這樣的解析器庫看起來有點嚇人,但這並不困難,它會爲您節省很多麻煩調試和維護您自己的解析器。如果您以後需要改進語言(添加新的運算符,運算符優先級,括號等),它將非常容易。

另請參見Yacc equivalent for Java

+0

我給JParsec一個嘗試。將繼續發佈。 – 2012-08-14 05:36:10

+0

@ArnabBiswas這也是我的選擇。 – 2012-08-14 05:47:06