为大型项目选择解析技术

时间:2011-10-29 12:47:30

标签: java parsing antlr parser-combinators

我必须处理许多不同的文件格式。至少50,也许超过100。

过去我和Antlr玩过。但是,由于以下几个原因,我不确定Antlr是否适合这个项目:

  • 很难组合和重用语法和/或语法片段
  • Antlr执行代码生成 - 对现有解析器进行更改需要返回Antlr,进行更改,重新生成代码,将代码集成回代码库,以及运行单元测试
  • 进行树构建/处理需要在Antlr中处理另一种语言 - 这是未来开发人员面临的潜在问题

基本上,我喜欢Antlr,但我认为它可能更适合为复杂语言创建一个或两个解析器,而不是为一些更简单的语言/格式创建100个解析器。

类似Antlr的解析器生成器的替代方法是解析器组合器。优点是解析器直接集成到代码中,使重用,测试和进一步抽象变得非常容易。此外,未来的开发人员不必学习如何使用新工具。解析器组合器的缺点是我不知道在Java中使用它们的任何重型库。

所以问题是:

  1. Antlr适合/打算用于如此庞大的解析项目吗?
  2. 在Java中进行大规模解析的其他选项是什么?

  3. 注意:某些文件格式是CSV或制表符分隔的,有些文件格式更复杂,有些文件格式与Java一样复杂。语义学上,它们也可能相当复杂(尽管不是全部都是)。

2 个答案:

答案 0 :(得分:0)

我个人过去曾使用Apache Tika,这非常适合我的需要,涵盖了各种各样的格式。我从来没有使用过Antlr所以无法真正评论它。

答案 1 :(得分:0)

There is a parsing technique非常适合组合,重用,继承和扩展解析器组件(甚至在运行时扩展正在运行的解析器)。

我永远不会将代码生成工具和一个好的声明性DSL视为一个缺点,但可能我离Java亚文化太远了。如果这些问题在某种程度上是有效的,那么它仍然不是问题 - 您可以使用组合器实现Packrat。它在Java中可能有点笨拙(由于缺少适当的闭包和lambdas),但仍然比典型的ad hoc递归下降解析器更具可读性。