解析“SQL like”查询字符串
问题描述:
对于我们产品的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)通常列举。因此,解析机制的期望是:
- 如果查询字符串中存在任何未知元素(键/值),则应该失败。
- 元素(键/值)应出现在定义的顺序(这仅仅是为了简化解析逻辑)
- 今后,除了“==”和“& &”,其它操作也可以得到介绍。
- 可以有键/值的不同组合导致大量的唯一查询字符串。
现在我正在使用String.split和Scanner的组合来解析字符串。但是,我发现代码变得越来越复杂,越来越难以调试。到目前为止,我还没有引入任何重要的验证。因此,我期待代码变得更加复杂和“丑陋”。
[问]是否有任何库可以帮助我解析这样的字符串。任何其他建议/想法也将不胜感激。
答
有几个Java库用于将输入数据解析为对象树。值得注意的是:
- JParsec - 解析器组合框架(tutorial)。
- ANTLR(另一种语言识别工具) - 一种语言工具,提供从语法描述(tutorial)中构建识别器,解释器,编译器和翻译器的框架。
- JavaCC - (tutorial)。
这取决于您的喜好和背景使用哪一个。 JParsec仅以本地Java语言构造解析器(不包括外部语法文件等),另外两个则从语法描述文件生成解析器。
开始时使用这样的解析器库看起来有点吓人,但这并不困难,它会为您节省很多麻烦调试和维护您自己的解析器。如果您以后需要改进语言(添加新的运算符,运算符优先级,括号等),它将非常容易。
我给JParsec一个尝试。将继续发布。 – 2012-08-14 05:36:10
@ArnabBiswas这也是我的选择。 – 2012-08-14 05:47:06