2012-08-13 99 views
3

对于我们产品的Web服务接口,我们正在定义类似查询字符串的sql。他们不遵循确切的SQL语法。它是这样工作的。这些字符串存在于xml请求中。我的应用程序解析字符串并根据内容创建Java对象。这些java对象用于查询数据库。下面是查询字符串的几个例子:解析“SQL like”查询字符串

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

的键(的objectType例如)以及值(设备/ networkEntity)通常列举。因此,解析机制的期望是:

  1. 如果查询字符串中存在任何未知元素(键/值),则应该失败。
  2. 元素(键/值)应出现在定义的顺序(这仅仅是为了简化解析逻辑)
  3. 今后,除了“==”和“& &”,其它操作也可以得到介绍。
  4. 可以有键/值的不同组合导致大量的唯一查询字符串。

现在我正在使用String.split和Scanner的组合来解析字符串。但是,我发现代码变得越来越复杂,越来越难以调试。到目前为止,我还没有引入任何重要的验证。因此,我期待代码变得更加复杂和“丑陋”。

[问]是否有任何库可以帮助我解析这样的字符串。任何其他建议/想法也将不胜感激。

回答

5

有几个Java库用于将输入数据解析为对象树。值得注意的是:

  • JParsec - 解析器组合框架(tutorial)。
  • ANTLR(另一种语言识别工具) - 一种语言工具,提供从语法描述(tutorial)中构建识别器,解释器,编译器和翻译器的框架。
  • JavaCC - (tutorial)。

这取决于您的喜好和背景使用哪一个。 JParsec仅以本地Java语言构造解析器(不包括外部语法文件等),另外两个则从语法描述文件生成解析器。

开始时使用这样的解析器库看起来有点吓人,但这并不困难,它会为您节省很多麻烦调试和维护您自己的解析器。如果您以后需要改进语言(添加新的运算符,运算符优先级,括号等),它将非常容易。

另请参见Yacc equivalent for Java

+0

我给JParsec一个尝试。将继续发布。 – 2012-08-14 05:36:10

+0

@ArnabBiswas这也是我的选择。 – 2012-08-14 05:47:06