java - 为大型项目选择解析技术

标签 java parsing antlr parser-combinators

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

我过去曾使用过 Antlr。但是,出于以下几个原因,我不确定 Antlr 是否适合这个项目:

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

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

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

所以问题是:

  1. Antlr 是否适合/适用于如此庞大的解析项目?
  2. 在 Java 中进行大规模解析还有哪些其他选择?

注意:有些文件格式是 CSV 或制表符分隔的,有些稍微复杂一些,有些和 Java 一样复杂。在语义方面,它们也可能非常复杂(尽管并非全部)。

最佳答案

我个人用过Apache Tika在过去,这非常适合我的需要,涵盖了多种格式。我从未使用过 Antlr,所以无法对其发表评论。

关于java - 为大型项目选择解析技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7938989/

相关文章:

parsing - ANTLR vs. Happy vs. 其他解析器生成器

java - 有没有办法处理错误,使原始序列不会终止?

java - Eclipse Activity 不工作

java - 在关闭之前是否需要读取/跳过 InputStream 完成?

excel - 将带有各种分隔符的地址拆分为街道地址、城市、州、邮政编码和国家/地区

c - 需要一种方法来解析 C 中的代数表达式

perl - 如何用 Perl 解析相对日期?

java - Ivy 加载不必要的依赖项?

antlr - 如何在antlr中找到 token 的长度?

java - 在 ANTLR 中处理 EOF、空格和换行符