Как мне разобрать базовый запрос (например, данные Google) в Java? - PullRequest
0 голосов
/ 14 октября 2008

У меня есть система, где я запрашиваю документы на сервере 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"]

По сути, язык запросов представляет собой список предикатов, которые можно комбинировать с ИЛИ ("|") или И (без разделителя). Каждый предикат является ограничением на поле. Ограничение может быть =, <,>, <=,> =, in и т. Д. ... Везде, где это имеет смысл, могут быть пробелы.

Я немного потерян между Regexp, StringTokenizer, StreamTokenizer и т. Д ... и я застрял с Java 1.4, так что нет парсера ...

Кто может указать мне правильное направление?

Спасибо!

1 Ответ

3 голосов
/ 14 октября 2008

Правильный способ будет использовать генератор синтаксического анализа, как Antlr , JFlex или JavaCC .

Быстрый и грязный способ будет:

String[] disjunctedPredicateGroups = query.split("\|");
List<String[]> normalizedPredicates = ArrayList<String[]>;
for (String conjunction : disjunctedPredicateGroups ) {
   normalizedPredicates.add(conjunction.split("\[|\]"));
}
// process each predicate
...