我需要解析一个看起来像这样的简单DSL:
funcA Type1 a (funcB Type1 b) ReturnType c
由于我没有使用语法分析工具的经验,我认为自己编写一个基本的解析器会更快(在Java中)。
对于我来说,使用像ANTLR这样的东西并构建一个合适的语法定义,对于一个简单的DSL来说会更好吗?
答案 0 :(得分:4)
语法倾向于进化,(与要求一样)。家庭酿造解析器很难维护并导致重新发明轮子的例子。如果您认为可以在java中编写快速解析器,那么您应该知道使用任何lex / yacc / compiler-compiler解决方案会更快。 Lexers更容易编写,然后您需要自己的规则优先级语义,这些语义不容易测试或维护。 ANTLR还提供了一个可视化AST的ide,你可以击败那个伙伴。增加的优势是能够使用字符串模板生成中间代码,这完全是一个不同的方面。
答案 1 :(得分:3)
简单回答:编写描述语法的规则比编写接受语法描述语言的代码更容易。
如果您需要解析的内容与您上面所写的内容完全相同,那么我会说您可以手动编写它。
更一般地说,我会说大多数regular language可以手动解析(使用正则表达式)。
如果要解析具有大量规则和产品的context-free language,ANTLR(或其他解析器生成器)可以让生活更轻松。
另外,如果你有一种简单的语言,你希望将来变得更加复杂,那么将规则描述添加到ANTLR语法比将它们构建成手工编码的解析器更容易。
答案 2 :(得分:2)
当您想要开发和使用自定义语言时,最好使用现成的解析器(生成器),例如ANTLR。当您的目标是编写解析器时,最好编写自己的解析器。
除非你有很多编写解析器的经验,并且能够比使用ANTLR更快地获得有效的解析器。但是,我猜测你的问题是这个退出条款不适用。