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

How are textual data files parsed in modern C++?

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

不管怎样,最基本的任务是总是在一个数据结构中使用一个文本文件并填充里面的内容,这样我们的C++代码就可以在信息中做一些事情。

现在,我已经用手实现了几个简单的(哦,太麻烦了)解析器,我更看不起的东西很少。-)

所以-我想知道,当我想将结构化的文本数据"解析"成内存中的表示形式(想想:针对任意语言的XML数据绑定)时,当前的技术状态是什么。

到目前为止,我发现"你推荐什么样的解析器生成器",但我不太确定我是在寻找解析器生成器(如antlr)。

显而易见的候选人似乎是佩格特和提振精神,但他们看起来都相当复杂(但至少他们是用语言),上一次我尝试精神时,编译器的错误让我抓狂。(PEGTL需要一个C++ 11兼容编译器,这里仍然是一个问题(VC++ 2005)。

所以我是不是错过了一个简单的解决方案

1
2
3
4
5
6
7
/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++数据结构?(这只是一个任意的例子,说明这样一个文件的一部分可能看起来如何。对于这种格式,我可以(也可能应该)购买一个库来解析它,因为它已经足够广泛了——对于我遇到的所有格式,情况并非如此。)

--或者我应该去追求复杂的东西,比如说精神振奋?


  • 提升精神

    • 我在这里的答案是一个类似于你的样品的演示;
    • 这里有一个更高级、更短的演示,可以解析为树结构
    • 更多示例搜索
  • COCO/R(C++)

    我对这个非常实用的解析器生成器有很好的效果,它支持使用公共语法格式的许多语言/平台。解析的速度与boost spirit相当(尽管使用通用编程可以更高效地处理解析的数据)

编辑使事情完全清楚,从来没有一件事我不能做可可/R。

然而,我真的沉迷于Spirit简单地为我推导属性类型(转换)。这是主要的省时器。不过,这涉及到一项成本:

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

我强烈建议你咬住子弹,然后使用Boost.Spirit。尽管这些错误信息足以让人头昏眼花,但对我来说还是值得的。我用它来实现欠文档(或未文档)自定义文件格式的解析器,只需几个小时,而不是几天。

我发现最好的方法是把它看作"类固醇中的std::istream",因为它使用相同的双角符号来表示分离。


您没有提到您手工创建的解析器有多复杂。但我相信,只要您将工作拆分为由专用状态机执行的词汇和语法分析,那么这些简单的文件肯定可以通过手工编写的例程进行解析。第一个识别符号,如示例关键字、数字和字符串中的标记,并将它们提供给第二个尝试识别较长的句子并创建相应的数据结构的标记。简单的文件遵循常规语法,没有歧义和其他冲突,它应该是真正简单和可管理的。