【发布时间】:2019-10-12 11:43:21
【问题描述】:
我想解析类似的东西
"{xxxx}
{xxxx}"
由 eol 分隔成 vector<vector<wchar_t>> : ({xxxx},{xxxx}) 以便“{”和“}”与内部字符保持在一起。
我的代码是:
#define BOOST_SPIRIT_UNICODE
#include <iostream>
#include<boost/spirit/include/qi.hpp>
#include<string>
#include<vector>
using namespace std;
namespace sw=boost::spirit::standard_wide;
namespace qi= boost::spirit::qi;
using boost::spirit::standard_wide::char_;
int main()
{
wstring s = L"{\"id\":23,\"text\":\"sf\nsf\"}\n{\"id\":23,\"text\":\"sfsf\"}";
qi::rule<wstring::iterator, vector<vector<wchar_t>>(), sw::blank_type> ru;
ru = (qi::char_(L"{") >> *(char_-char_(L"}")) >> char_(L"}")) % qi::eol;
vector<vector<wchar_t>> result;
qi::phrase_parse(s.begin(), s.end(), ru, sw::blank, result);
for (auto& v : result) {
//cout << "Size of string: " << v.size() << endl;
for (auto& s : v) {
wcout << s;
};
cout << endl;
};
std::cout << "Size of result"<<result.size()<<endl ;
}
但是输出是:
{
"id":23,"text":"sf
sf"
}
{
"id":23,"text":"sfsf"
}
Size of result6
看起来“{”变成了外部向量的 vector<wchar_t> 类型的单个元素。
然后考虑规则:
ru = (qi::char_(L"{") >> *(char_-char_(L"}")) >> char_(L"}")) % qi::eol;
根据文档,*(char_-char_(L"}")) 应该是vector<A>。因为a: A, b: vector<A> --> (a >> b): vector<A>,那么我认为(qi::char_(L"{") >> *(char_-char_(L"}")) >> char_(L"}"))应该是vector<wchar_t>。这与结果相矛盾。
我哪里错了?
【问题讨论】:
标签: c++ boost-spirit-qi