YACC/Bison 和 ANTLR 之间最显着的区别是这些工具可以处理的语法类型。YACC/Bison 处理 LALR 语法,ANTLR 处理 LL 语法。
通常,长期使用 LALR 语法的人会发现使用 LL 语法更加困难,反之亦然。这并不意味着语法或工具本质上更难使用。您发现哪种工具更容易使用将主要归结为对语法类型的熟悉程度。
就优势而言,LALR 语法在某些方面比 LL 语法具有优势,在其他方面 LL 语法比 LALR 语法具有优势。
YACC/Bison 生成表驱动解析器,这意味着“处理逻辑”包含在解析器程序的数据中,而不是在解析器的代码中。回报是即使是非常复杂的语言的解析器也具有相对较小的代码足迹。这在 1960 年代和 1970 年代硬件非常有限时更为重要。表驱动的解析器生成器可以追溯到这个时代,当时的主要要求是代码占用空间小。
ANTLR 生成递归下降解析器,这意味着“处理逻辑”包含在解析器的代码中,因为语法的每个产生式规则都由解析器代码中的一个函数表示。回报是通过阅读其代码更容易理解解析器在做什么。此外,递归下降解析器通常比表驱动解析器更快。但是,对于非常复杂的语言,代码占用空间会更大。这是 1960 年代和 1970 年代的一个问题。那时,由于硬件限制,只有相对较小的语言(例如 Pascal)以这种方式实现。
ANTLR 生成的解析器通常在 10.000 行代码左右,甚至更多。手写递归下降解析器通常在同一个球场。Wirth 的 Oberon 编译器可能是最紧凑的编译器,大约 4000 行代码,包括代码生成,但 Oberon 是一种非常紧凑的语言,只有大约 40 条生产规则。
正如有人已经指出的那样,ANTLR 的一大优势是图形 IDE 工具,称为 ANTLRworks。它是一个完整的语法和语言设计实验室。它会在您键入语法规则时将其可视化,如果发现任何冲突,它将以图形方式向您显示冲突是什么以及导致冲突的原因。它甚至可以自动重构和解决左递归等冲突。一旦你有了一个无冲突的语法,你就可以让 ANTLRworks 解析你的语言的输入文件,并为你构建一个解析树和 AST,并在 IDE 中以图形方式显示树。这是一个非常大的优势,因为它可以为您节省大量工作时间:在开始编码之前,您会发现语言设计中的概念错误!我还没有找到任何用于 LALR 语法的此类工具,似乎没有任何此类工具。
即使对于那些不想生成解析器而是手动编码的人来说,ANTLRworks 也是语言设计/原型设计的绝佳工具。很可能是最好的此类工具。不幸的是,如果您想构建 LALR 解析器,这对您没有帮助。仅仅为了利用 ANTLRworks 从 LALR 切换到 LL 可能是值得的,但是对于某些人来说,切换语法类型可能是一个非常痛苦的经历。换句话说:YMMV。