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 的组合来解析字符串。但是,我发现代码变得越来越复杂且难以调试。到目前为止,我还没有介绍任何主要的验证。有了这个,我期望代码变得更加复杂和“丑陋”。

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

4

1 回答 1

5

有几个 Java 库用于将输入数据解析为对象树。尤其:

  • JParsec - 解析器组合框架(教程)。
  • ANTLR(另一种语言识别工具)——一种语言工具,它提供了一个框架,用于从语法描述(教程)构建识别器、解释器、编译器和翻译器。
  • JavaCC -(教程)。

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

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

另请参见Java 的 Yacc 等效项

于 2012-08-13T07:55:27.857 回答