c ++ lex和bison对自制标记器/解析器的优势是什么?

mok*_*oka 7 c++ parsing bison tokenize

我想在c ++中进行一些解析和标记以用于学习目的.现在我经常在网上阅读这个主题时遇到野牛/ yacc和lex.使用STL或boost :: regex或者甚至只是C编写的标记器/解析器是否会有任何市长的好处?

Car*_*icz 13

我最近写了一个简单的词法分析器和解析器.

事实证明,词法分析器手动编码更简单.但解析器有点困难.我的Bison生成的解析器几乎完全正常工作,它给了我很多关于我忘记状态的有用信息.我后来手工编写了相同的解析器,但在我完美地工作之前需要进行更多的调试.

为词法分析器和解析器生成工具的吸引力在于,您可以用干净,易于阅读的语言编写规范,这种语言接近于您的规范的最短版本.手写解析器通常至少是两倍大.此外,自动解析器(/ lexer)附带了许多诊断代码和逻辑,可帮助您调试内容.

如果您的语言或要求发生变化,那么类似BNF语言的解析器/词法分析器规范也更容易更改.如果您正在处理手写的解析器/词法分析器,您可能需要深入挖掘代码并进行重大更改.

最后,因为它们通常被实现为有限状态机而没有回溯(在Bison上有很多选项,所以这并不总是给定的),你的自动生成的代码很可能比手工编码的产品更有效.