如何在现代C ++中解析文本数据文件?

时间:2011-11-04 09:43:14

标签: c++ parsing boost-spirit dataformat

我(也)经常面临必须解析文本数据文件的任务 - 在“每个人”使用XML之前使用的文本结构化数据表示形式 - 这是某种行业标准。 (这些太多了。)

无论如何,基本任务总是采用文本文件并填充某种数据结构中的内容,以便我们的C ++代码可以对信息做些什么。

现在,我已经手动实现了一些简单的(并且非常有缺陷的)解析器,并且我几乎没有鄙视。 : - )

所以 - 当我想将结构化文本数据“解析”为内存表示时,我想知道当前的技术水平是什么(想想:任意语言的XML数据绑定)。

到目前为止我发现的是“What parser generator do you recommend”,但我不太确定我是在使用解析器生成器(如ANTLR)。

明显的候选人似乎是pegtlBoost.Spirit,但他们似乎都很复杂(但至少他们是语言),上次我尝试过Spirit时,编译错误让我疯狂。 (并且pegtl需要兼容C ++ 11的编译器,这仍然是一个问题(VC ++ 2005)。)

所以我错过了一个更简单的解决方案来获得像

这样的东西
/begin COMPU_METHOD
  DEC "  Decimal value"
  RAT_FUNC
  "%3.0"
  "dec"
  COEFFS 0 1.000000 0.000000 0 0.000000 1.000000
/end COMPU_METHOD

进入C ++数据结构? (这只是这个文件的一部分可能看起来的任意示例。对于这个格式,我可以(并且可能应该)购买一个库来解析它,因为它足够广泛 - 我遇到的所有格式都不是这种情况。)

- 或者我应该选择Boost.Spirit的复杂性

3 个答案:

答案 0 :(得分:3)

我强烈建议咬紧牙关并使用Boost.Spirit。虽然错误信息可以足以让一个人的头骨,但它对我来说是值得的。我已经用它来在几小时而不是几天内为低(或非)记录的自定义文件格式实现解析器。

我发现接近它的最佳方法是将其视为“std::istream类固醇”,因为它使用相同的双角度表示法来表示分离。

答案 1 :(得分:3)

  • 提升精神

  • Coco/R (C++)

    我使用这种非常实用的解析器生成器获得了良好的结果,该生成器支持使用通用语法格式的许多lnaguages /平台。解析的速度与Boost Spirit相当(尽管使用泛型编程处理解析数据可能更有效)

编辑为了让事情变得清晰,我从来没有用Coco / R做过的事情。

但是,我真的沉迷于Spirit为我推断属性类型(转换)一般。这是主要的节省时间。但是涉及成本:

  • 学习曲线,维护
  • 编译时间(但解析器不经常更改)

答案 2 :(得分:0)

您没有提到您手动创建的解析器有多复杂。但我相信只要你将你的工作分成由专用状态机执行的词法和语法分析,这些简单的文件就可以通过手工制作的例程进行解析。第一个识别标记,例如在您的示例关键字,数字和字符串中,并将它们提供给第二个尝试识别较长句子并创建相应数据结构的标记。使用常规语法之后的简单文件,没有歧义和其他冲突,它应该非常简单和易于管理。