如何用Java解析基本查询(例如Google Data)?

时间:2008-10-14 11:54:05

标签: java parsing gdata-api

我有一个系统,我在其中查询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 ......

谁能指出我正确的方向?

谢谢!

1 个答案:

答案 0 :(得分:3)

正确的方法是使用AntlrJFlexJavaCC等解析器生成器。

快速而肮脏的方式是:

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