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

时间:2010-03-16 17:07:20

标签: parsing antlr

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

funcA Type1 a (funcB Type1 b) ReturnType c

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

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

3 个答案:

答案 0 :(得分:4)

语法倾向于进化,(与要求一样)。家庭酿造解析器很难维护并导致重新发明轮子的例子。如果您认为可以在java中编写快速解析器,那么您应该知道使用任何lex / yacc / compiler-compiler解决方案会更快。 Lexers更容易编写,然后您需要自己的规则优先级语义,这些语义不容易测试或维护。 ANTLR还提供了一个可视化AST的ide,你可以击败那个伙伴。增加的优势是能够使用字符串模板生成中间代码,这完全是一个不同的方面。

答案 1 :(得分:3)

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

如果您需要解析的内容与您上面所写的内容完全相同,那么我会说您可以手动编写它。

更一般地说,我会说大多数regular language可以手动解析(使用正则表达式)。

如果要解析具有大量规则和产品的context-free language,ANTLR(或其他解析器生成器)可以让生活更轻松。

另外,如果你有一种简单的语言,你希望将来变得更加复杂,那么将规则描述添加到ANTLR语法比将它们构建成手工编码的解析器更容易。

答案 2 :(得分:2)

当您想要开发和使用自定义语言时,最好使用现成的解析器(生成器),例如ANTLR。当您的目标是编写解析器时,最好编写自己的解析器。

除非你有很多编写解析器的经验,并且能够比使用ANTLR更快地获得有效的解析器。但是,我猜测你的问题是这个退出条款不适用。