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

标签 c++ parsing boost-spirit dataformat

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

无论如何,基本任务始终是获取一个文本文件并将其中的内容填充到某种数据结构中,以便我们的 C++ 代码可以对信息执行某些操作。

现在,我已经手动实现了一些简单的(哦,还有很多错误)解析器,我非常鄙视它。 :-)

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

到目前为止我发现的是“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?

最佳答案

  • 提振精神

  • Coco/R (C++)

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

编辑 为了让事情变得非常清楚,从来没有我不能用 Coco/R 做的事情。

但是,我真的沉迷于 Spirit 为我一般推断属性类型(转换)的轻松程度。这是主要的节省时间。但这需要付出代价:

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

关于c++ - 如何在现代 C++ 中解析文本数据文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8007310/

相关文章:

javascript - JS Date - 正确解析 ddMMyyyy 格式的日期

javascript - Suitescript,nlapiRequestURL,无法将 JSON 从 URL 转换为对象/数组

c++ - skipper 在 boost::spirit 中不起作用

c++ - 如何使用 Boost.Spirit 在 C++ 中序列化一个 double,以便输出接近标准流的输出?

c++ - 可伸缩常数

c++ - 为什么 boost::hana 的集合不能默认构造?

c++ - C/C++ - 在不使用内置函数的情况下旋转数组的有效方法(作业)

c++ - 使用 DFS 进行后序打印

javascript - 如何解析MP4破折号文件的 `sidx`

c++ - 将 boost::spirit 符号表作为继承属性传递到语法中