У меня есть система, в которой я запрашиваю документы на сервере 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, поэтому нет Parser ...
Кто может указать мне правильное направление?
Спасибо !




Правильный способ - использовать генератор парсеров, например Antlr, JFlex или JavaCC.
Быстрый и грязный способ:
String[] disjunctedPredicateGroups = query.split("\|");
List<String[]> normalizedPredicates = ArrayList<String[]>;
for (String conjunction : disjunctedPredicateGroups ) {
normalizedPredicates.add(conjunction.split("\[|\]"));
}
// process each predicate