我需要解析一个简单的DSL,如下所示:
funcA Type1 a (funcB Type1 b) ReturnType c由于我没有语法分析工具的经验,我认为自己编写一个基本的解析器(用Java)会更快。
即使对于一个简单的DSL来说,使用像ANTLR这样的东西并构造一个适当的语法定义会不会更好?
发布于 2010-03-17 01:22:54
简单的答案:当编写描述语法的规则比编写接受语法描述的语言的代码更容易的时候。
如果你唯一需要解析的东西看起来和你上面写的一模一样,那么我会说你可以手写它。
更广泛地说,我会说大多数regular language可以更快地手工解析(使用正则表达式)。
如果您正在解析具有大量规则和结果的context-free language,则ANTLR (或其他解析器生成器)可以使工作变得更容易。
此外,如果您有一种简单的语言,并且希望将来变得更加复杂,那么将规则描述添加到ANTLR语法中将比将它们构建到手工编码的解析器中要容易得多。
发布于 2010-03-17 01:24:00
语法倾向于进化,(需求也是如此)。Home brew解析器很难维护,并导致重新发明轮子示例。如果您认为可以用java编写一个快速解析器,那么您应该知道使用lex/yacc/编译器-编译器解决方案会更快。词法分析器更容易编写,那么你会想要自己的规则优先语义,这不容易测试或维护。ANTLR也提供了一个可视化AST的ide,你能打败那个伙伴吗?附加的优点是能够使用字符串模板生成中间代码,这是完全不同的方面。
发布于 2010-03-17 01:23:24
当您想要开发和使用定制语言时,最好使用现成的解析器(生成器),如ANTLR。当您的目标是编写解析器时,最好编写自己的解析器。
除非您有编写解析器的丰富经验,并且能够以比使用ANTLR更快的方式获得一个工作的解析器。但我从你提出的问题中推测,这一退出条款并不适用。
https://stackoverflow.com/questions/2456494
复制相似问题