我想在c ++中进行一些解析和标记以用于学习目的。现在我经常在网上阅读这个主题时遇到野牛/ yacc和lex。 使用STL或boost :: regex或者甚至只是C编写的标记器/解析器是否会有任何市长的好处?
答案 0 :(得分:13)
我最近写过一个简单的词法分析器和解析器。
事实证明,词法分析器手动编码更简单。但解析器有点困难。我的Bison生成的解析器几乎完全正常工作,它给了我很多关于我忘记状态的有用信息。我后来手工编写了相同的解析器,但在我完全正常工作之前需要进行更多的调试。
为词法分析器和解析器生成工具的吸引力在于,您可以使用干净,易于阅读的语言编写规范,这种语言几乎是您规范的最短版本。手写解析器通常至少是两倍大。此外,自动解析器(/ lexer)附带了许多诊断代码和逻辑,可帮助您调试。
如果您的语言或要求发生变化,使用类似BNF语言的解析器/词法分析器规范也会更容易更改。如果您正在处理手写的解析器/词法分析器,您可能需要深入挖掘代码并进行重大更改。
最后,因为它们通常被实现为有限状态机而没有回溯(在Bison上有很多选项,所以这并不总是给定的),你的自动生成的代码很可能比你的手更有效 - 编码产品。
答案 1 :(得分:4)
其他人已经为你写过并为他们辩护了吗?
答案 2 :(得分:1)
它更容易,而且更通用。 Bison / Lex可以整理和解析任意语法,并以更简单的格式呈现它。它们也可能更快,具体取决于你写正则表达式的程度。
我不想在C中编写自己的解析器,因为语言对字符串没有很好的直觉。如果你自己编写,我会推荐perl以便于正则表达式(或者可能是python)。
使用现有工具可能会更快,但它可能会或可能不会那么有趣。如果你有时间,因为它只是为了学习,那就去吧。 C ++是一个很好的语言。
答案 3 :(得分:0)
不同人的不同笔画。我个人喜欢递归下降解析器 - 我发现它们很容易理解,你可以让它们产生出色的最终用户错误信息给那些像野牛这样的工具产生的错误信息。