何时更好地使用ANTLR等解析器与编写自己的解析代码?

Vir*_*hah 5 parsing antlr

我需要解析一个看起来像这样的简单DSL:

funcA Type1 a (funcB Type1 b) ReturnType c
Run Code Online (Sandbox Code Playgroud)

由于我没有使用语法分析工具的经验,我认为自己编写一个基本的解析器会更快(在Java中).

即使对于简单的DSL,我会使用像ANTLR这样的东西来构建一个合适的语法定义吗?

dan*_*ben 5

简单的答案:编写描述语法的规则比编写接受语法所描述的语言的代码更容易。

如果您需要解析的唯一内容看起来与上面所写的完全一样,那么我会说您可以手动编写它。

更一般地说,我想说大多数正则语言可以手动更快地解析(使用正则表达式)。

如果您正在解析具有大量规则和产生式的上下文无关语言,ANTLR(或其他解析器生成器)可以使生活变得更加轻松。

另外,如果您有一种简单的语言,并且预计将来会变得更加复杂,那么将规则描述添加到 ANTLR 语法中比将它们构建到手动编码的解析器中会更容易。


que*_*zen 5

语法往往会不断发展(需求也是如此)。Home Brew 解析器很难维护,并导致重新发明轮子的例子。如果您认为可以用 java 编写一个快速解析器,那么您应该知道使用任何 lex/yacc/compiler-compiler 解决方案都会更快。词法分析器更容易编写,然后您会想要自己的规则优先语义,这不容易测试或维护。ANTLR还提供了一个可视化AST的IDE,你能打败那个伙伴吗?额外的优点是能够使用字符串模板生成中间代码,这是完全不同的方面。