首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Antlr的优势(与lex/yacc/bison相比)

Antlr的优势(与lex/yacc/bison相比)
EN

Stack Overflow用户
提问于 2008-10-17 16:40:26
回答 3查看 46.7K关注 0票数 151

我过去在各种项目中使用过lex和yacc (更常见的是bison),通常是翻译器(例如,流到EDA应用程序中的EDIF的子集)。此外,我必须支持基于几十年前的lex/yacc语法的代码。所以我知道如何使用这些工具,尽管我不是专家。

我在过去的各种论坛上看到过关于Antlr的正面评论,我很好奇我可能会错过什么。所以如果你用过两者,请告诉我在Antlr中哪个更好,哪个更高级。我目前的限制是我在一家C++商店工作,我们交付的任何产品都不会包含Java,因此产生的解析器必须遵循这一规则。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-10-17 16:50:11

更新/警告:此答案可能已过期!

一个主要区别是ANTLR生成LL(*)解析器,而YACC和Bison都生成LALR解析器。这对于许多应用程序来说是一个重要的区别,最明显的是运算符:

代码语言:javascript
运行
复制
expr ::= expr '+' expr
       | expr '-' expr
       | '(' expr ')'
       | NUM ;

ANTLR完全无法按原样处理此语法。要使用ANTLR (或任何其他LL解析器生成器),您需要将此语法转换为非左递归的语法。但是,Bison对这种形式的语法没有问题。您需要将'+‘和'-’声明为左结合运算符,但这并不是左递归的严格要求。一个更好的例子可能是调度:

代码语言:javascript
运行
复制
expr ::= expr '.' ID '(' actuals ')' ;

actuals ::= actuals ',' expr | expr ;

注意,expractuals规则都是左递归的。当涉及到代码生成时,这会产生一个更有效的AST,因为它避免了多个寄存器和不必要的溢出(向左的树可以折叠,而向右的树不能)。

就个人喜好而言,我认为LALR语法更容易构建和调试。缺点是你必须处理一些隐蔽的错误,比如shift-reduce和(可怕的) reduce-reduce。这些是Bison在生成解析器时捕获的错误,因此它不会影响最终用户体验,但它可以使开发过程更有趣。正是由于这个原因,ANTLR通常被认为比YACC/Bison更容易使用。

票数 151
EN

Stack Overflow用户

发布于 2009-12-14 19:41:18

YACC/Bison和ANTLR之间最重要的区别是这些工具可以处理的语法类型。YACC/Bison处理LALR语法,ANTLR处理LL语法。

通常,长期使用LALR语法的人会发现使用LL语法更加困难,反之亦然。这并不意味着语法或工具本身就更难使用。你觉得哪个工具更容易使用主要取决于你对语法类型的熟悉程度。

就优点而言,LALR语法在某些方面优于LL语法,而LL语法在其他方面优于LALR语法。

YACC/Bison生成表驱动的解析器,这意味着“处理逻辑”包含在解析器程序的数据中,而不是包含在解析器的代码中。结果是,即使是非常复杂的语言的解析器也有相对较小的代码占用空间。这在硬件非常有限的20世纪60年代和70年代更为重要。表驱动的解析器生成器可以追溯到这个时代,当时的主要需求是代码占用空间小。

ANTLR生成递归下降解析器,这意味着“处理逻辑”包含在解析器的代码中,因为语法的每个产生规则都由解析器代码中的一个函数表示。这样做的好处是,通过读取解析器的代码,可以更容易地理解解析器在做什么。此外,递归下降解析器通常比表驱动的解析器更快。然而,对于非常复杂的语言,代码占用的空间将会更大。这在20世纪60年代和70年代是一个问题。当时,由于硬件的限制,只有像Pascal这样的相对较小的语言是以这种方式实现的。

ANTLR生成的解析器通常在10.000行代码附近,甚至更多。手写递归下降解析器通常处于相同的水平。Wirth的Oberon编译器可能是最紧凑的,大约有4000行代码,包括代码生成,但Oberon是一种非常紧凑的语言,只有大约40条产生式规则。

正如有人已经指出的,ANTLR的一个很大的优势是图形集成开发工具,称为ANTLRworks。它是一个完整的语法和语言设计实验室。当你输入语法规则时,它会可视化你的语法规则,如果它发现任何冲突,它会以图形方式显示冲突是什么,以及是什么导致了冲突。它甚至可以自动重构和解决冲突,如左递归。一旦你有了一个无冲突的语法,你就可以让ANTLRworks解析你的语言的输入文件,为你构建一个解析树,并在集成开发环境中以图形的方式显示该树。这是一个非常大的优势,因为它可以为您节省大量的工作时间:您将在开始编码之前发现语言设计中的概念性错误!我还没有为LALR语法找到这样的工具,似乎没有这样的工具。

即使对于那些不想生成解析器而是手工编写解析器的人来说,ANTLRworks也是一个很棒的语言设计/原型开发工具。很可能是可用的最好的工具。不幸的是,如果您想要构建LALR解析器,这对您没有帮助。仅仅为了利用ANTLRworks而从LALR切换到LL可能是值得的,但对于一些人来说,切换语法类型可能是一种非常痛苦的经历。换句话说: YMMV。

票数 123
EN

Stack Overflow用户

发布于 2008-12-02 01:19:31

ANTRL的另一个优势是您可以使用ANTLRWORKS,尽管我不能说这是一个严格的优势,因为其他生成器可能也有类似的工具。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/212900

复制
相关文章

相似问题

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