2011-06-03 76 views
1

我需要分析一些文本树:在升压精神解析嵌套数据

std::string data = "<delimiter>field1a fieald1b fieald1c<delimiter1>subfield11<delimiter1>subfieald12<delimiter1>subfieald13 ... <delimiter>field2a fieald2b fieald2c<delimiter1>subfield21<delimiter1>subfieald22<delimiter1>subfieald23 ..." 

其中<delimiter>,<delimiter1>是的std :: string的一部分,而不是单个字符

很可能令牌化这个字符串提振::精神?

回答

3

列表解析器是你的朋友:

namespace qi = boost::spirit::qi; 

// tokenize on '<delimiter1>' and return the vector 
rule<std::string::iterator, qi::space_type, std::vector<std::string>()> fields = 
    *(char_ - "<delimiter1>") % "<delimiter1>"; 

std::string data("<delimiter>field1a fieald1b ..."); 
std::vector<std::vector<std::string> > fields_data; 

// tokenize of '<delimiter>' and return a vector of vectors 
qi::phrase_parse(data.begin(), data.end(), 
    fields % "<delimiter>", qi::space, fields_data); 

您可能需要最近精神的版本,这个工作(升压V1.47或SVN主干)。

+0

非常感谢!我实现了你的代码编译没有任何错误,但解析时忽略了lexeme''。我使用目前的稳定提振(1.46.1)。当我在1.47测试时,我会写出来。 – triclosan 2011-06-05 19:58:43

2

是的,你可以使用精神来做这种格式,但在我看来,远远超过你的需要。

我只是直接使用std string函数对tokenise进行编码。交替提升:正则表达式应该很容易为你做到这一点。

+0

随着您的需求不断发展,手写解析器很快成长为不可维护的堆意大利面代码。更好地从一个原则性的起点开始。 – Lambdageek 2011-06-03 19:52:54

+0

但是他的规范很简单 - 真正的记号器比解析器更能描述他所需要的东西 – Elemental 2011-06-04 08:09:41