2012-06-05 106 views
2

我嘗試了一些分層數據解析成的boost :: utree結構,但它似乎沒有爲expexted工作。 這是我做的:nested utree with boost :: spirit :: qi?

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,以反映該字符串的嵌套性質feeded到phrase_parse()中。像:

(21 「你好」(34 「某些」) 「奇怪」(12 「世界」))

如何獲得這種輸出的?

PS使用升壓1.49.0使用Visual Studio 2010

回答

3

這是相當簡單的... 我剛在 '外' 齊規則的聲明更改爲:

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

從而將規則的屬性類型更改爲utree :: list_type。但我不知道爲什麼這個工程......

而在升壓1.47.0存在與utree未能與語義動作配合使用時,它的傳播屬性值中的另一個bug。

相關問題