【发布时间】:2011-11-04 09:43:13
【问题描述】:
我(也)经常面临必须解析文本数据文件的任务——在“每个人”都使用 XML 之前你使用的那种文本结构化数据表示——这是某种行业标准。 (这些太多了。)
无论如何,基本任务始终是获取一个文本文件并将其中的内容填充到某种数据结构中,以便我们的 C++ 代码可以处理这些信息。
现在,我已经手动实现了一些简单的(而且有很多错误的)解析器,我鄙视的几乎没有。 :-)
所以 - 我想知道当我想将结构化文本数据“解析”成内存中的表示形式时,当前的技术状态是什么(想想:任意语言的 XML 数据绑定)。
到目前为止,我发现的是“What parser generator do you recommend”,但我不太确定我是否在使用解析器生成器(如 ANTLR)。
明显的候选者似乎是pegtl 和Boost.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 的复杂性?
【问题讨论】:
-
boost.spirit 并不比任何其他 (E)BNF 使用工具复杂得多。如果您想反映文件的完整语法(如果有的话)或者只是“获取”一些信息,这里的问题可能更多。完整语法的优点是在手工编码的解析代码中误解文件格式的逻辑错误更少。
-
文本文件的格式是否已经定义且不可更改,或者您是否允许定义或更改文本文件的格式?
-
@rve - 不,格式始终是固定的,来自第 3 方。
-
4 年过去了,如果您有兴趣,我们“刚刚”在github.com/ColinH/PEGTL 发布了一个新的和大大改进的 PEGTL 版本,它应该可以与 VS2015 一起使用
-
@Daniel - 太棒了!我们在 VS2015 上……不。等待 2005:20_0_5 ... 叹息 :-)
标签: c++ parsing boost-spirit dataformat