0

REST / Atom サーバーにドキュメントを照会するシステムがあります。クエリは GData に触発され、次のようになります。

http://server/base/feeds/documents?bq=[type in {'news'}]

実際にクエリを実行せずに返されるドキュメントのタイプを知るために、「bq」パラメータを解析する必要があります。たとえば、

bq=[type = 'news']                      ->  return ["news"]
bq=[type in {'news'}]                   ->  return ["news"]
bq=[type in {'news', 'article'}]        ->  return ["news", "article"]
bq=[type = 'news']|[type = 'article']   ->  return ["news", "article"]
bq=[type = 'news']|[title = 'My Title'] ->  return ["news"]

基本的に、クエリ言語は、OR ("|") または AND (セパレーターなし) で結合できる述語のリストです。各述語は、フィールドに対する制約です。制約は、=、<、>、<=、>=、in などにすることができます。それが意味を成すところにはどこにでもスペースがあってもかまいません。

私はRegexp、StringTokenizer、StreamTokenizerなどの間で少し迷っています...そしてJava 1.4で立ち往生しているので、パーサーはありません...

誰が私を正しい方向に向けることができますか?

ありがとう !

4

1 に答える 1

3

正しい方法は、AntlrJFlexJavaCCなどのパーサー ジェネレーターを使用することです。

手早く汚れた方法は次のとおりです。

String[] disjunctedPredicateGroups = query.split("\|");
List<String[]> normalizedPredicates = ArrayList<String[]>;
for (String conjunction : disjunctedPredicateGroups ) {
   normalizedPredicates.add(conjunction.split("\[|\]"));
}
// process each predicate
于 2008-10-14T13:20:08.833 に答える