提升精神气:它是否适合分析/削减多线"数据文件?

时间:2016-01-22 17:23:42

标签: boost 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编译器

2 个答案:

答案 0 :(得分:2)

我认为@Orient是对的:正则表达式w /捕获就足够了。

但是,Spirit在没有链接器依赖性的情况下具有优势。以下是一些方法(使用seek[]raw[])获取灵感:

  

请注意,Spirit X3(仍然是实验性的)也有一个seek[]指令,它会更快地编译

答案 1 :(得分:1)

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

我(有限)体验中最大的困难来源是当你试图让它做更多的事情并处理数据时。在解析数据的同时,通常在语义操作或其他事情中尝试“急切地”进行某些处理,这有时很诱人。不要这样做!它通常会使事情最终难以阅读,调试起来有点困难,有时如果语法必须回溯已经执行的语义操作,你会感到惊讶。

如果你能为你的数据编写一个很好的语法,

qi应该会很好用。如果你不能写一个明确的语法,你可能可以使用qi::eps使其可解析,但你不想经常这样做IMO。我不认为“数百或数千”的物品会造成任何特殊问题。

现在问题是以意见为导向 - 如果你可以发布一个更完整的数据格式描述,或者更好,一个完整的代码示例失败,它可能会更容易给出精确的答案。