首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用lex/yacc替代品的原因?

使用lex/yacc替代品的原因?
EN

Stack Overflow用户
提问于 2013-05-13 15:49:46
回答 2查看 5.2K关注 0票数 17

大约每年我必须开发或至少设计一种语法和解析器--这似乎是我工作生活中的一个常量。

每次我面对这个任务,大约一年,我,相当一个lex/yacc (flex/bison .)盖伊,考虑,或重新考虑,替代普通的莱克斯/雅克,然后,经过一些思考和尝试,我回到朴素莱克斯/雅克。

因为我在应用程序的中心有一个CORBA服务器,所以我可以从用几乎所有语言编写的解析器中调用,所以这一次我看了一下

  • antlr4 (Java)和antlr3 (Java但有其他语言的RT ),
  • SableCC (Java)
  • 解析::EBNF,Parse::Yapp和Marpa (Perl),
  • 和SimpleParse (Python),

对我来说,带有antlrworks的串联antlr4看起来是最有希望的候选人,但我还不相信花在进入它上的时间最终会被摊销。

我必须开发的语法类似于SQL (在结构上,而不是在主题方面)。

为什么任何替代方案会使我的任务比使用普通的lex/yacc更容易呢?

EN

Stack Overflow用户

回答已采纳

发布于 2013-05-14 12:40:09

您还应该考虑的是,各种解析器生成器生成的解析器非常不同。Yacc/bison生成自下而上的解析器,这些解析器通常很难理解,很难调试,并且提供奇怪的错误消息。例如,ANTLR生成一个递归下降自顶向下的解析器,它使更容易理解,您实际上可以很容易地调试它,您只能为一个解析操作使用子规则(例如,只解析表达式而不是整个语言)。

此外,它的错误恢复要好得多,并且会产生很多更干净的错误。有各种各样的IDE/插件/扩展使使用ANTLR语法变得非常容易(ANTLRWorks、IntelliJ插件、Visual代码扩展等)。而且您可以从相同的语法生成不同语言(C、C++、C#、C#等)的解析器(除非您的语法中有特定于语言的操作,您已经在您的问题中提到了这一点)。当我们谈到动作时:由于底层解析器中的评估原则(shift令牌、shift令牌,将它们还原为一个新的令牌并转移它等等)。行动很容易在那里造成麻烦,例如执行不止一次。由ANTLR生成的解析器则不是这样。

多年来,我还尝试过各种解析器生成器,甚至编写了自己的生成器,但我会随时推荐ANTLR作为首选工具。

票数 13
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16526165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档