解析“类SQL”查询字符串

3

我们的产品使用Web服务接口,定义了类似SQL的查询字符串,但其语法并不完全遵循SQL标准。其工作原理如下:这些字符串包含在XML请求中。我的应用程序会解析这些字符串,并基于内容创建Java对象。这些Java对象用于查询数据库。以下是一些查询字符串示例:

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

键(例如objectType)和值(设备/网络实体)通常是枚举的。因此,解析机制的期望是:

  1. 如果查询字符串中有任何未知元素(键/值),则应该失败。
  2. 元素(键/值)应按照定义的顺序出现(这只是为了简化解析逻辑)。
  3. 未来除了“==”和“&&”之外,还可能引入其他操作。
  4. 可以通过不同的键/值组合得到大量唯一的查询字符串。

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

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

1个回答

5

有几个Java库可以将输入数据解析成对象树。其中比较出名的有:

  • JParsec - 解析器组合框架 (教程)。
  • ANTLR (ANother Tool for Language Recognition) - 一种提供从语法描述构造识别器、解释器、编译器和翻译器的语言工具 (教程)。
  • JavaCC - (教程)。

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

使用此类解析器库可能一开始会有些令人害怕,但这并不难,并且它将为您节省大量调试和维护自己的解析器的麻烦。如果您以后需要改进语言(添加新的运算符、运算符优先级、括号等),这将非常容易。

另见Java的Yacc等效工具


我正在尝试使用JParsec。会继续发布进展。 - Arnab Biswas
@ArnabBiswas 我也会选择这个。 - Petr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接