gpt4 book ai didi

c++ - Antlr 的优势(相对于 lex/yacc/bison)

转载 作者:IT老高 更新时间:2023-10-28 11:33:05 26 4
gpt4 key购买 nike

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

我过去曾在各种论坛上看到过关于 Antlr 的正面评价,我很好奇我可能遗漏了什么。因此,如果您两者都使用过,请告诉我 Antlr 中哪个更好或更高级。我目前的限制是我在 C++ 商店工作,我们发布的任何产品都不会包含 Java,因此生成的解析器必须遵循该规则。

最佳答案

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


一个主要区别是 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 更易于使用。

关于c++ - Antlr 的优势(相对于 lex/yacc/bison),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/212900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com