Boost 提神气:是否适合分析/切割a的语言/工具;“多行”;数据文件?

Boost 提神气:是否适合分析/切割a的语言/工具;“多行”;数据文件?,boost,boost-spirit,Boost,Boost Spirit,我想对数据文件应用各种操作:集合代数、统计、报告、更改。但是这些文件的格式远远不是代码示例,而且有点奇怪。有不同种类的项目、项目类型,其中一些项目作为一个集合放在一起。下面有一个简单的例子。 我是boost::spirit的新手,我尝试过编码来分割项目,并获得大多数治疗所需的基本信息(名称、版本、日期)。最终,这对我来说似乎很棘手。问题是我缺乏技能还是精神不适合这种形式? 学习精神不是浪费时间,我以后一定要用它。但是我没有找到像我这样的代码示例,我可能没有走正确的路 >>>pr

我想对数据文件应用各种操作:集合代数、统计、报告、更改。但是这些文件的格式远远不是代码示例,而且有点奇怪。有不同种类的项目、项目类型,其中一些项目作为一个集合放在一起。下面有一个简单的例子。
我是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
>>过程类型\u A
//姓名(A_1型)
//版本(A.1.99)
//日期(2016.01.01)
//物业1“pA11”
//物业2“pA12”
//etc_A_1(千行-很多是“多行”和/或多行子记录)
工艺类型
//姓名(A_2型)
//版本(A.2.99)
//日期(2016.01.02)
//物业1“pA21”
//物业2“pA22”
//etc_A_2(百行或千行)
过程类型
//姓名(B_1型)
//版本(B.1.99)
//日期(2016.02.01)
//物业1“pB11”
//物业2“pB12”
//etc_B_1(百行或千行)
参数集_类型_C
//>>参数列表
////姓名(C_1型)
////版本(C.1.99)
////日期(2016.03.01)
////物业1“pC11”
////物业2“pC12”
////etc_C_1(百行或千行)
//参数列表
////姓名(C_2型)
////版本(C.2.99)
////日期(2016.04.01)
////物业1“pC21”
////物业2“pC22”
////etc__2(百行或千行)

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

在我(有限的)经验中,最大的困难来源是当你试图让它做更多的事情,并处理数据时。有时,在解析数据的同时,尝试“急切地”进行一些处理是很有诱惑力的,通常是在语义操作或其他方面。别这样!它通常使事情最终更难阅读,调试也更难,有时如果语法必须回溯到它已经执行的语义操作,你会惊讶地发现会发生什么

qi
如果你能为你的数据编写一个好的语法,那么它应该很有用。如果您不能编写明确的语法,您可能可以使用
qi::eps
使其可解析,但您不希望在IMO中经常这样做。我不认为“成百上千”的项目会带来任何特殊问题


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

我认为@Orient是对的:这里的regex w/captures就足够了

然而,Spirit的优势在于它没有链接器依赖性。以下是一些获得灵感的方法(使用
seek[]
raw[]
):

  • (二进制内容)
  • 更复杂的逻辑:
请注意,Spirit X3(仍处于实验阶段)也有一个
seek[]
指令,它将更快地编译


我认为带捕获的正则表达式对于这种语法来说已经足够表达了。我经常在shell中使用正则表达式,由于代码可读性和性能,我无法想象使用它。我正在寻找boost::regex库。std::regex
不合适吗(我在上面是指它,而不是shell)?我认为,
boost::regex
并没有太出色。@Orient,你的建议听起来很明智。我将研究这些链接。我在查找stackoverflow的信息时没有找到它们。搜索时选择关键字的常见问题。“急切地”:没错,这对编码人员来说是个坏习惯。
无论如何,检查/解析/扫描这些文件类型中的某些数据子集将非常有用。