我想用Boost.Spirit來解析嵌套列表的數字。這是我到目前爲止有:用Boost.Spirit解析嵌套列表
//define a test string
std::string string = "[[\t1 , 2 ], [3, 4, 65.4]]";
auto it = string.begin();
//parse the string
std::vector<std::vector<double>> vector;
auto listRule = "[" >> (qi::double_ % ",") >> "]";
auto list2Rule = "[" >> (listRule % ",") >> "]";
bool match = qi::phrase_parse(it, string.end(), list2Rule, ascii::space, vector);
//check if we have a match
std::cout << "matched: " << std::boolalpha << match << '\n';
if (it != string.end())
std::cout << "unmatched part: " << std::string{it, string.end()} << '\n';
//print the result
std::cout << "result\n";
for (const auto& v : vector) {
std::cout << "[";
for (double i : v)
std::cout << i << ",";
std::cout << "]\n";
}
以上奇妙的作品和版畫:
matched: true
result
[1,2,]
[3,4,65.4,]
我現在面臨的問題是,它不接受空名單。例如,通過改變字符串像這樣:
std::string string = "[[\t1 , 2 ], [3, 4, 65.4], []]";
然後我不匹配(即match == false
和it == string.begin()
)。顯然,該矢量仍然被填充,但最後一個空列表丟失。任何人都可以提供解釋,爲什麼這是這種情況,以及如何解決它?
的''%解析器被定義爲:「列表。解析一個或多個分隔符b「。IIRC,你可以簡單地將列表標記爲可選項,並且它會做你想做的事情:'」[「>> - (listRule%」,「)>>」]「; ' – Frank
Uhmm .. nope,似乎不起作用。在這種情況下(和'listRule'和'list2Rule'中的所有組合一起,我得到一個載體列表,每個載體只有一個值... – matpen