当前位置:  开发笔记 > 编程语言 > 正文

Antlr的优势(相比之下,lex/yacc/bison)

如何解决《Antlr的优势(相比之下,lex/yacc/bison)》经验,为你挑选了5个好方法。

我过去曾经使用过lex和yacc(更常见的是bison)用于各种项目,通常是翻译(例如EDIF的子集流入EDA应用程序).另外,我必须支持基于几十年前的lex/yacc语法的代码.所以我知道我的工具,虽然我不是专家.

我在过去的各种论坛上看过关于Antlr的积极评论,我很好奇我可能会缺少什么.因此,如果您同时使用了两者,请告诉我Antlr中哪些更好或更先进.我目前的限制是我在C++商店工作,我们发布的任何产品都不包含Java,因此生成的解析器必须遵循该规则.



1> Daniel Spiew..:

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

expr ::= expr '+' expr
       | expr '-' expr
       | '(' expr ')'
       | NUM ;

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

expr ::= expr '.' ID '(' actuals ')' ;

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

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

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


我刚刚完成了对ANTLR下一版本v3.4的立即左递归支持.处理LR表达式规则和类似C声明规则的东西.:)
我最近发现的另一个评论虽然已有十年之久,却对*输出进行了合理的观察*:http://compilers.iecc.com/comparch/article/98-11-040:"ANTLR/PCCTS是LL,它使语法成为可能编写更难,但生成的代码是可读的.Yacc是LALR(当然你知道)使语法编写更容易,但生成的代码也可能是象形文字."
因此,Antlr在您的感知中可能具有单一的优势,即它在构建阶段产生的sr和rr等错误更少?我希望我会尝试一下,但最终可能会坚持我所知道的......
"实际"规则是否需要第二条规则来表明简单的"expr"是实际的?否则,很好的解释.

2> trijezdci..:

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的一大优点是图形IDE工具,称为ANTLRworks.它是一个完整的语法和语言设计实验室.它在您键入语法规则时可视化,如果发现任何冲突,它将以图形方式显示冲突是什么以及导致冲突的原因.它甚至可以自动重构和解决左递归等冲突.一旦你有了一个无冲突的语法,你可以让ANTLRworks解析你的语言的输入文件,并为你构建一个解析树和AST,并在IDE中以图形方式显示树.这是一个非常大的优势,因为它可以为您节省大量的工作时间:在开始编码之前,您会在语言设计中发现概念错误!我还没有为LALR语法找到任何这样的工具,似乎没有任何这样的工具.

即使是那些不希望生成解析器但只需手动编码的人,ANTLRworks也是语言设计/原型设计的绝佳工具.很可能是最好的这样的工具.不幸的是,如果你想构建LALR解析器,这对你没有帮助.简单地从LALR切换到LL以利用ANTLRworks可能是值得的,但对于某些人来说,切换语法类型可能是一种非常痛苦的经历.换句话说:YMMV.


喜欢它,因为它解释了不同机制背后的历史,使人们立即理解

3> Cristi Diaco..:

ANTLR的几个优点:

可以输出各种语言的解析器 - 运行生成的解析器不需要Java.

令人敬畏的GUI使语法调试变得容易(例如,您可以在GUI中看到生成的AST,无需额外的工具)

生成的代码实际上是人类可读的(它是ANTLR的目标之一),并且它生成LL解析器的事实肯定有助于这方面.

终端的定义也是无上下文的(与(f)lex中的正则表达式相反) - 因此允许例如包含正确闭合括号的终端的定义

我的.02 $



4> John with wa..:

ANTRL的另一个优点是你可以使用ANTLRWORKS,虽然我不能说这是一个严格的优势,因为其他生成器也可能有类似的工具.



5> 小智..:

Bison和Flex导致较小的内存占用,但您没有图形IDE.

antlr使用更多内存,但你有antlrworks,一个图形IDE.

Bison/Flex内存使用量通常为mbyte左右.与antlr对比 - 假设它为您要解析的文件中的每个标记使用512字节的内存.在32位系统上有400万个令牌,而你的虚拟内存不足.

如果您要解析的文件很大,则antlr可能会耗尽内存,因此如果您只想解析配置文件,那么这将是一个可行的解决方案.否则,如果要解析包含大量数据的文件,请尝试Bison.


我很好奇.你能指出描述每个令牌消耗512字节内存的文档吗?我记不起那次讨论了.我选择的Google关键字也不让我满意......
推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有