3

私たちの製品の Web サービス インターフェイスでは、SQL のようなクエリ文字列を定義しています。それらは正確なSQL構文に従っていません。それはこのように動作します。文字列は xml 要求に存在します。私のアプリケーションは文字列を解析し、コンテンツに基づいて Java オブジェクトを作成しています。これらの Java オブジェクトは、DB へのクエリに使用されます。クエリ文字列の例を次に示します。

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

通常、キー (objectType など) と値 (device/networkEntity) は列挙されます。したがって、解析メカニズムからの期待は次のとおりです。

  1. 不明な要素 (キー/値) がクエリ文字列にある場合、失敗するはずです。
  2. 要素 (キー/値) は、定義された順序で表示される必要があります (これは、解析ロジックを単純化するためのものです)
  3. 将来、「==」と「&&」に加えて、他の操作も導入される可能性があります。
  4. キー/値のさまざまな組み合わせが存在する可能性があり、その結果、多数の一意のクエリ文字列が生成されます。

現在、String.split と Scanner の組み合わせを使用して文字列を解析しています。しかし、コードが複雑になり、デバッグが難しくなっていることがわかりました。これまで、主要な検証は導入していません。そのため、コードがさらに複雑で「醜い」ものになると予想しています。

[質問] そのような文字列を解析するのに役立つライブラリはありますか? その他の提案や考えも歓迎します。

4

1 に答える 1

5

入力データをオブジェクトのツリーに解析するための Java ライブラリがいくつかあります。特に:

  • JParsec - パーサー コンビネーター フレームワーク (チュートリアル)。
  • ANTLR (ANOther Tool for Language Recognition) - 文法記述からレコグナイザー、インタープリター、コンパイラー、およびトランスレーターを構築するためのフレームワークを提供する言語ツール (チュートリアル)。
  • JavaCC - (チュートリアル)。

どちらを使用するかは、好みや背景によって異なります。JParsec はネイティブ Java 言語のみでパーサーを構築し (外部文法ファイルなどは使用しません)、他の 2 つは文法記述ファイルからパーサーを生成します。

このようなパーサー ライブラリを使用することは、最初は少し怖いように思えるかもしれませんが、それほど難しくなく、独自のパーサーのデバッグと保守に伴う多くの問題を解決できます。後で言語を改善する必要がある場合 (新しい演算子、演算子の優先順位、括弧などを追加) は非常に簡単です。

Java に相当する Yaccも参照してください。

于 2012-08-13T07:55:27.857 に答える