我创建的通用解析器在代码行方面相当小,但我能够成功地用于我的目的。它可以处理递归语法,表现良好,支持正则表达式,允许正常的标记化模式或上下文特定的标记化,这反过来允许其他冲突的标记在语法中工作得很好等等。
由于ANTLR的整体受欢迎程度,我认为可能值得更多地了解它(也许我一直在重新发明轮子)但在投入时间之前,我想知道它是否可以做同样的事情。我的解析器目前提供给我的东西。不幸的是,我无法找到足够全面的功能列表,至少没有一个能够回答我在下面提出的问题。
ANTRL是否提供以下功能?
我的解析器旨在帮助您完成代码完成 会在IDE中看到。当无法解析输入时,它总是给出 它应该在发生故障的地方匹配。一个 类似的功能是针对递归规则,当有一个 成功解析输入我可以获得有关可能的信息 如果我有更长的输入(或者如果我要在代码完成方面继续输入),我将不得不满足的规则。
从我对ANTLR的了解到它似乎支持了一个访客 图案。我的解析器实际上也使用了访问者模式,但它也是 提供关于匹配的一些上下文,例如具有匹配的堆栈 深度信息等。例如,如果一种语言有 我的访问者方法允许我使用嵌套函数的函数 只处理我关心的关卡中的函数。我还假设它提供了匹配的开始和结束索引。
我的解析器支持正则表达式并与特定的上下文结合使用 标记化模式我可以以某些性能为代价使一些语法显着缩小(对于DSL来说一点也不差)。一个例子是我可以有一个匹配单词“is”的标记和另一个匹配模式“\ w +”的标记,单词“is”将根据上下文转换为适当的标记,即使两者都是这些可以匹配“是”这个词。 ANTRL是否支持正则表达式或与此特定于上下文的标记化器类似的东西?
我的解析器支持搜索模式,这基本上意味着我不需要解析整个输入,但我可以通过它解析我感兴趣的部分。
答案 0 :(得分:1)
我认为PEG-Parser更适合您的要求。但请记住,解析和lexing的严格分离更有效。
如果您还没有使用DFA-regex用于lexing,如果性能问题,那么切换技术(无论是ANTLR还是PEG-Parsers)都可能是一个很好的下一步。