Java的开放源码ABNF解析器实现?

Java的开放源码ABNF解析器实现?,java,parsing,Java,Parsing,我需要Java中的一个增强的Backus Naur表单解析器(RFC 5234)来验证一些语言 为了不重新发明轮子,我更愿意使用ABNF解析器的现有开源实现(如果已经存在的话) 我需要开源,因为它允许我根据需要维护代码 有人知道存在什么吗?从ABNF生成解析器的源java。我观察到(见Ralph的答案)有一些局限性: aparse不喜欢这些注释,必须在生成代码之前手动删除它们 所有语句都需要以结尾在行的末尾 APASE不应用RFC 5234定义的“核心”ABNF规则,因此如果您的语法基于这些规

我需要Java中的一个增强的Backus Naur表单解析器(RFC 5234)来验证一些语言

为了不重新发明轮子,我更愿意使用ABNF解析器的现有开源实现(如果已经存在的话)

我需要开源,因为它允许我根据需要维护代码


有人知道存在什么吗?

从ABNF生成解析器的源java。

我观察到(见Ralph的答案)有一些局限性:

  • aparse不喜欢这些注释,必须在生成代码之前手动删除它们
  • 所有语句都需要以
    结尾在行的末尾
  • APASE不应用RFC 5234定义的“核心”ABNF规则,因此如果您的语法基于这些规则,则必须从RFC复制这些规则
  • APASE不喜欢语法中的循环(例如,
    S-->NT1 NT2 T1;NT1-->S|T2;…
    ),可能会遇到无休止的循环
Parse2的开发者已经证实了这些观察结果。简而言之:Parse2可以解析ABNF语法的一个子集,但是如果您找到一个现有的ABNF语法并尝试将其提供给软件,它很可能会出现问题

如果您自己指定ABNF语法并记住这些限制,那么这个库应该适合您。如果您必须使用现有的ABNF语法,那么在生成代码之前,您可能需要在语法中投入更多的精力


PS:Parse2库源代码目前不可用,即使编译的二进制代码(java字节码)是免费的。

如果要验证的语言已经有ABNF规范,这是一个好主意。如果没有,那么您真的应该寻找一个解析器生成器系统,它已经为许多langauge定义进行了编码和测试。在这种特殊的形式中,我会惊讶地发现许多现有的语言定义。@IraBaxter RFC822(电子邮件)、RFC2045(MIME)、RFC3501(IMAP)。。。事实上,我所合作过的每一个严肃的RFC都在ABNF中。@djechlin:有趣。有多少实现直接使用ABNF?@IraBaxter不确定你的意思?从某种意义上说,它们都是,因为协议就是这样定义的。“多少”是什么意思?有多少人在github上,并且至少在一个不太起眼的项目中使用,但却不起作用?你是说有多少是在没有人为干预的情况下从ABNF自动生成的?我不知道。可能很少,因为没有人想要在无效HTML上抛出错误的HTML解析器。第一步自动生成,然后修改?电话线在哪里?总而言之:不知道。@irabakster不那么直截了当,我被带到这个问题上来,因为我正在寻找一个由其ABNF生成的IMAP解析器。我们使用了一个大而难看的正则表达式,你不应该这样做,因此,解析IMAP字符串是我们整个应用程序中最昂贵的部分。我正在努力解决这个问题。将查看Javamail的实现以及其他内容。进一步搜索ABNF解析器生成器,发现[Java APG][1](生成需要GPL v2+库才能运行的代码)和[ABNF解析器生成器][2](生成的代码未获得许可)。所以我能找到的最好的Java解析器生成器是[abnf parser generator],因为它生成了一个非常强大的LR(1)[3]解析器。[1] [2] [3]