2

我尝试将一些分层数据解析为 boost::utree 结构,但它似乎不像expexted那样工作。这就是我所做的:

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 反映输入到短语解析()中的字符串的嵌套性质。喜欢:

(21“你好”(34“一些”)“奇怪”(12“世界”))

我如何获得这种输出?

PS 在 Visual Studio 2010 中使用 boost 1.49.0

4

1 回答 1

3

这很简单......我只需要将“外”气规则的声明更改为:

qi::rule<const char*, utree::list_type(), chars::space_type> outer;

从而将规则的属性类型更改为 utree::list_type。但是我不知道为什么会这样......

在 boost 1.47.0 中,还有另一个错误,即 utree 在与语义操作结合使用时无法传播其属性值。

于 2012-06-06T15:08:13.370 回答