11

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

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

现在,我已经手动实现了一些简单的(而且是错误的)解析器,而且我鄙视的很少。:-)

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

到目前为止我发现的是“你推荐什么解析器生成器”,但我不太确定我是否在使用解析器生成器(如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 的复杂性?

4

3 回答 3

3

我强烈建议硬着头皮使用 Boost.Spirit。尽管错误信息足以让人脑洞大开,但这对我来说是值得的。我已经使用它在几个小时而不是几天内实现了对记录不足(或未记录)的自定义文件格式的解析器。

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

于 2011-11-11T09:59:40.550 回答
3
  • 提升精神

  • 可可/R (C++)

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

编辑为了让事情变得非常清楚,从来没有什么事情是我无法用 Coco/R 做的。

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

  • 学习曲线,维护
  • 编译时间(但解析器不经常改变)
于 2011-11-11T12:13:56.813 回答
0

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

于 2011-11-04T10:15:17.687 回答