解析“SQL like”查询字符串

时间:2012-08-13 06:12:01

标签: java parsing

对于我们产品的Web服务接口,我们定义了sql之类的查询字符串。它们不遵循确切的sql语法。它的工作原理如下。字符串存在于xml请求中。我的应用程序是解析字符串并根据内容创建Java对象。这些java对象用于查询DB。以下是查询字符串的几个示例:

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

通常枚举键(例如objectType)和值(device / networkEntity)。所以解析机制的期望是:

  1. 如果查询字符串中存在任何未知元素(键/值),则它应该失败。
  2. 元素(键/值)应该以定义的顺序出现(这只是为了简化解析逻辑)
  3. 将来,除了“==”和“&&”之外,其他操作也可能会被引入。
  4. 可以有不同的键/值组合,从而产生大量唯一查询字符串。
  5. 现在我使用String.split和Scanner的组合来解析String。但是,我发现代码变得越来越复杂,越来越难以调试。到目前为止,我还没有提出任何重要的验证。有了这个,我期待代码变得更加复杂和“丑陋”。

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

1 个答案:

答案 0 :(得分:5)

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

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

这取决于您的偏好和背景使用哪一个。 JParsec仅构造本机Java语言的解析器(没有外部语法文件等),另外两个从语法描述文件生成解析器。

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

另见Yacc equivalent for Java