bpw*_*621 6 parsing yacc flex-lexer
我读到的与这些实用程序有关的大多数帖子通常都建议使用其他方法来获得相同的效果.例如,通常提到这些工具的问题至少有一个答案包含以下一些内容:
假设开发人员......
所以我的问题是:
lex/yacc和衍生品在今天如此普遍存在的原因是它们比其他工具存在的时间长得多,它们在文献中有更多的覆盖范围,而且传统上它们都带有Unix操作系统.它与其他词法分析器和解析器生成器工具的比较几乎没有什么关系.
无论您选择哪种工具,总会有一个重要的学习曲线.因此,一旦您使用了一个给定的工具并且在使用中变得相对舒适,您就不太可能想要学习另一个工具的额外工作.那是很自然的.
此外,在20世纪60年代末和70年代早期创建lex/yacc时,硬件限制对解析提出了严峻挑战.Yacc使用的表驱动LR解析方法当时是最合适的,因为它可以通过使用相对较小的通用程序逻辑并将状态保持在磁带或磁盘上的文件中来实现,占用内存较少.诸如LL之类的代码驱动的解析方法具有更大的最小内存占用,因为解析器程序的代码本身代表语法,因此它需要完全适合RAM来执行,并且它将状态保持在RAM中的堆栈上.
当内存变得越来越丰富时,更多的研究进入了不同的解析方法,如LL和PEG,以及如何使用这些方法构建工具.这意味着在lex/yacc系列之后创建的许多替代工具使用不同类型的语法.然而,切换语法类型也会产生重要的学习曲线.一旦熟悉了一种语法,例如LR或LALR语法,就不太可能想要切换到使用不同类型语法的工具,例如LL语法.
总体而言,lex/yacc系列工具通常比最近到来的工具更为简陋,这些工具通常具有复杂的用户界面,可以图形化地显示语法和语法冲突,甚至通过自动重构来解决冲突.
因此,如果您之前没有使用任何解析器工具的经验,那么无论如何您必须学习新工具,那么您应该考虑其他因素,例如语法和冲突的图形可视化,自动重构,良好文档的可用性,语言其中生成的词法分析器/解析器可以输出等等.不要选择任何工具只是因为"这是其他人似乎正在使用的".
以下是我可以想到使用lex/yacc或flex/bison的一些原因: