提神气 : language/tool到analyse/cut一个"multiline"数据文件合适吗?

Boost Spirit Qi : Is it suitable language/tool to analyse/cut a "multiline" data file?

我想对数据文件应用各种操作:集合代数、统计、报告、更改。但是文件的格式与代码示例相去甚远,有点奇怪。有不同种类的物品,物品类型,其中一些被放在一起作为一个集合。下面有一个简单的例子。
我是 boost::spirit 的新手,我尝试编写代码来拆分项目并获取大多数治疗所需的基本信息(名称、版本、日期)。最终这对我来说似乎很棘手。 问题是我技术不够还是boost::spirit不适合这个格式?
研究boost::spirit不是浪费时间,以后肯定用得上。但是我没有找到像我这样的代码示例,我可能走的路不对。

>>>process_type_A
//name(typeA_1)
//version(A.1.99)
//date(2016.01.01)
//property1 "pA11"
//property2 "pA12"
//etc_A_1 (thousand of lines - a lot are "multiline" and/or mulitline sub-records)
<<<process_type_A
>>>process_type_A
//name(typeA_2)
//version(A.2.99)
//date(2016.01.02)
//property1 "pA21"
//property2 "pA22"
//etc_A_2 (hundred or thousand of lines)
<<<process_type_A
>>>process_type_B
//name(typeB_1)
//version(B.1.99)
//date(2016.02.01)
//property1 "pB11"
//property2 "pB12"
//etc_B_1 (hundred or thousand of lines)
<<<process_type_B
>>>paramset_type_C
//>>paramlist
////name(typeC_1)
////version(C.1.99)
////date(2016.03.01)
////property1 "pC11"
////property2 "pC12"
////etc_C_1 (hundred or thousand of lines)
//<<paramlist
//>>paramlist
////name(typeC_2)
////version(C.2.99)
////date(2016.04.01)
////property1 "pC21"
////property2 "pC22"
////etc_C_2 (hundred or thousand of lines)
//<<paramlist
<<<paramset_type_C

代码::块
提升 1.60.0
Windows 和 Linux

上的 GCC 编译器

我对 Qi 的主要建议是,它是一个非常强大和灵活的 解析 工具。您可以定义非常复杂的、可能是递归的结构,使用 boost::variant, boost::optional 等,并将这些类型与 qi 规则相关联,它似乎神奇地做了正确的事情,为您的数据提供了一个很好的 AST。

在我(有限的)经验中,最大的困难来源是当你试图让它做更多的事情并处理数据时。有时尝试 "eagerly" 在解析数据的同时进行一些处理很诱人,通常是在语义操作或其他方面。不要这样做!它通常会使事情最终变得更难阅读,更难调试,有时您会惊讶于如果语法必须回溯它已经执行的语义操作,将会发生什么。

qi 如果你能为你的数据写一个很好的语法,应该会很好用。如果您不能编写明确的语法,您可以使用 qi::eps 使其可解析,但您不想经常这样做 IMO。我认为 "hundreds or thousands" 项不会造成任何特殊问题。

现在的问题是 opinion-oriented -- 如果您可以 post 对您拥有的数据格式进行更完整的描述,或者更好的是,一个失败的完整代码示例,它可能更容易给出准确的答案。

我认为@Orient 是正确的:regex w/captures 就足够了。

但是,Spirit 具有无需链接器依赖性的优点。以下是一些启发灵感的方法(使用 seek[]raw[]):

  • Boost spirit revert parsing
  • (二进制内容)
  • 更复杂的逻辑:

Note that Spirit X3 (still experimental) also has a seek[] directive and it will compiler much faster.