嵌套的乌树与提升::精神::气

nested utree with boost::spirit::qi?

本文关键字:精神 嵌套      更新时间:2023-10-16

我尝试将一些分层数据解析为 boost::utree 结构,但它似乎没有像 expexex.这就是我所做的:

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() 只是对运算符<<(cout, utree) 的调用。这就是我得到的:

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

然而,我希望 utree 反映馈入 phrase_parse() 的字符串的嵌套性质。喜欢:

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

如何获得这种输出?

PS 使用 boost 1.49.0 与 Visual Studio 2010

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

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

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

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