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

为了学习目的,我想在c ++中做一些解析和标记。 当我在网上阅读有关这个​​主题时,我经常遇到bison / yacc和lex。 是否有任何市长利益使用这些例如使用STL或boost :: regex编写的标记器/解析器,或者甚至可能只是C?


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

事实证明,词法分析器手工编码更简单。 但解析器有点困难。 我的野牛生成的解析器几乎可以马上工作,它给了我很多关于我忘记了状态的有用信息。 后来我手工编写了同样的解析器,但在完成工作之前需要进行更多的调试。

为词法分析器和解析器生成工具的吸引力在于,您可以使用干净,易于阅读的语言编写规范,该规范接近于尽可能缩短规范的范围。 一个手写解析器通常至少是两倍大。 此外,自动分析器(/词法分析器)附带了很多诊断代码和逻辑,可帮助您调试。

如果您的语言或需求发生变化,那么类似BNF语言的解析器/词法分析器规范也更容易更改。 如果你正在处理一个手写的解析器/词法分析器,你可能需要深入研究你的代码并做出重大改变。

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


其他人已经为你编写和调试了他们?


它更容易,而且更一般。 Bison / Lex可以强化和解析任意语法,并以更简单的格式呈现它。 它们也可能更快,这取决于你编写正则表达式的程度。

我不想用C语言编写我自己的解析器,因为这种语言对字符串没有很好的直觉。 如果你写自己的,我会建议perl缓解正则表达式(或者可能是python)。

使用现有的工具可能会更快,但它可能会或可能不那么有趣。 如果你有时间并且因为它只是为了学习,那就去做吧。 首先,C ++是一门很好的语言。

链接地址: http://www.djcxy.com/p/63199.html

上一篇: c++ what is the advantage of lex and bison to a selfmade tokenizer / parser

下一篇: How to write a recursive descent parser from scratch?