大约每年我必须开发或至少设计一种语法和解析器--这似乎是我工作生活中的一个常量。
每次我面对这个任务,大约一年,我,相当一个lex/yacc (flex/bison .)盖伊,考虑,或重新考虑,替代普通的莱克斯/雅克,然后,经过一些思考和尝试,我回到朴素莱克斯/雅克。
因为我在应用程序的中心有一个CORBA服务器,所以我可以从用几乎所有语言编写的解析器中调用,所以这一次我看了一下
对我来说,带有antlrworks的串联antlr4看起来是最有希望的候选人,但我还不相信花在进入它上的时间最终会被摊销。
我必须开发的语法类似于SQL (在结构上,而不是在主题方面)。
为什么任何替代方案会使我的任务比使用普通的lex/yacc更容易呢?
发布于 2013-05-14 12:40:09
您还应该考虑的是,各种解析器生成器生成的解析器非常不同。Yacc/bison生成自下而上的解析器,这些解析器通常很难理解,很难调试,并且提供奇怪的错误消息。例如,ANTLR生成一个递归下降自顶向下的解析器,它使更容易理解,您实际上可以很容易地调试它,您只能为一个解析操作使用子规则(例如,只解析表达式而不是整个语言)。
此外,它的错误恢复要好得多,并且会产生很多更干净的错误。有各种各样的IDE/插件/扩展使使用ANTLR语法变得非常容易(ANTLRWorks、IntelliJ插件、Visual代码扩展等)。而且您可以从相同的语法生成不同语言(C、C++、C#、C#等)的解析器(除非您的语法中有特定于语言的操作,您已经在您的问题中提到了这一点)。当我们谈到动作时:由于底层解析器中的评估原则(shift令牌、shift令牌,将它们还原为一个新的令牌并转移它等等)。行动很容易在那里造成麻烦,例如执行不止一次。由ANTLR生成的解析器则不是这样。
多年来,我还尝试过各种解析器生成器,甚至编写了自己的生成器,但我会随时推荐ANTLR作为首选工具。
https://stackoverflow.com/questions/16526165
复制相似问题