ANTLR是否提供这些功能?

时间:2017-05-14 04:53:05

标签: java parsing antlr antlr4 dsl

我创建的通用解析器在代码行方面相当小,但我能够成功地用于我的目的。它可以处理递归语法,表现良好,支持正则表达式,允许正常的标记化模式或上下文特定的标记化,这反过来允许其他冲突的标记在语法中工作得很好等等。

由于ANTLR的整体受欢迎程度,我认为可能值得更多地了解它(也许我一直在重新发明轮子)但在投入时间之前,我想知道它是否可以做同样的事情。我的解析器目前提供给我的东西。不幸的是,我无法找到足够全面的功能列表,至少没有一个能够回答我在下面提出的问题。

ANTRL是否提供以下功能?

  • 我的解析器旨在帮助您完成代码完成 会在IDE中看到。当无法解析输入时,它总是给出 它应该在发生故障的地方匹配。一个 类似的功能是针对递归规则,当有一个 成功解析输入我可以获得有关可能的信息 如果我有更长的输入(或者如果我要在代码完成方面继续输入),我将不得不满足的规则。

  • 从我对ANTLR的了解到它似乎支持了一个访客 图案。我的解析器实际上也使用了访问者模式,但它也是 提供关于匹配的一些上下文,例如具有匹配的堆栈 深度信息等。例如,如果一种语言有 我的访问者方法允许我使用嵌套函数的函数 只处理我关心的关卡中的函数。我还假设它提供了匹配的开始和结束索引。

  • 我的解析器支持正则表达式并与特定的上下文结合使用 标记化模式我可以以某些性能为代价使一些语法显着缩小(对于DSL来说一点也不差)。一个例子是我可以有一个匹配单词“is”的标记和另一个匹配模式“\ w +”的标记,单词“is”将根据上下文转换为适当的标记,即使两者都是这些可以匹配“是”这个词。 ANTRL是否支持正则表达式或与此特定于上下文的标记化器类似的东西?

  • 我的解析器支持搜索模式,这基本上意味着我不需要解析整个输入,但我可以通过它解析我感兴趣的部分。

1 个答案:

答案 0 :(得分:1)

  1. ANTLR报告不匹配时可能的令牌,因此您可以将其用于自动完成
  2. ANTLR访客模式非常通用。 ANTLR生成界面,你必须实现它,所以你可以提供你想要的功能
  3. ANTLR严格区分lexing和解析。因此,不可能为同一令牌分配不同的令牌类型
  4. 您可能可以使用ANTLR实现搜索模式,但效率不高(除非您另外添加单独的高效搜索)
  5. 我认为PEG-Parser更适合您的要求。但请记住,解析和lexing的严格分离更有效。

    如果您还没有使用DFA-regex用于lexing,如果性能问题,那么切换技术(无论是ANTLR还是PEG-Parsers)都可能是一个很好的下一步。