我试图将一些层次数据解析为boost::utree结构,但它似乎并不像删除的那样工作。我就是这样做的:
qi::rule<const char*, utree(), chars::space_type> inner, outer;
outer %= '<' > qi::int_ > *inner > '>';
inner %= outer | qi::as_string[qi::lexeme[+(chars::alnum - '>')]];
const char txt[] = "<21 hello <34 some> strange <12 world>>";
const char* txtIt = txt;
try {
if (qi::phrase_parse(txtIt, txt + strlen(txt), outer, chars::space, data))
{
std::cout << "Numbers parsed" << std::endl;
HGrammar::traverseData()(data);
}
//return;
data.clear();
}catch(qi::expectation_failure<...>(...)) ...其中traverseData()只是对operator<<(cout,utree)的调用。我得到的是:
( 21“你好”34“一些”奇怪的“12”世界“)
然而,我希望utree能够反映phrase_parse()中输入的字符串的嵌套性质。比如:
( 21 "hello“( 34 "some”)“奇怪”( 12 "world“))
怎样才能得到这样的输出?
PS与2010一起使用boost 1.49.0
发布于 2012-06-06 15:08:13
很简单..。我只需将“外气”规则的声明改为:
qi::rule<const char*, utree::list_type(), chars::space_type> outer;因此,将规则的属性类型更改为utree::list_type。但我不知道为什么这样做..。
在boost 1.47.0中,还有另一个bug,当与语义操作一起使用时,utree无法传播其属性值。
https://stackoverflow.com/questions/10894632
复制相似问题