1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
template<typename Iterator>
struct JSonGrammar : boost::spirit::qi::grammar<Iterator, JSonPair(), boost::spirit::ascii::space_type>
{
JSonGrammar() :
JSonGrammar::base_type(json)
{
using boost::spirit::qi::lit;
using boost::spirit::qi::lexeme;
using boost::spirit::ascii::char_;
using boost::spirit::ascii::string;
using namespace boost::spirit::qi::labels;
using boost::phoenix::at_c;
using boost::phoenix::push_back;
string_ = lexeme[
'"' >>
*(
(char_('\\')[_val += _1] >> char_[_val += _1]) |
(char_[_val += _1]- '"')
)
>> '"'
];
json = dict[_val = _1] | pair[_val = _1] | array[at_c<1>(_val) = _1];
dict = '{' >> pair[_val += _1] % ',' >> '}';
array = '[' >> value[_val += _1] % ',' >> ']';
pair = string_ [at_c<0>(_val) = _1] >> ':' >> value [at_c<1>(_val) = _1];
value = lit("null") [_val = reinterpret_cast<void*>(NULL)]
| lit("true") [_val = true]
| lit("false") [_val = false]
| string_ [_val = _1]
| qi::double_ [_val = _1]
| array[_val += _1]
| dict[_val += _1]
;
}
boost::spirit::qi::rule<Iterator, std::string(), boost::spirit::ascii::space_type> string_;
boost::spirit::qi::rule<Iterator, JSonPair(), boost::spirit::ascii::space_type> json;
boost::spirit::qi::rule<Iterator, JSonPair(), boost::spirit::ascii::space_type> dict;
boost::spirit::qi::rule<Iterator, JSonPair(), boost::spirit::ascii::space_type> pair;
boost::spirit::qi::rule<Iterator, JSonValue(), boost::spirit::ascii::space_type> value;
boost::spirit::qi::rule<Iterator, JSonValue(), boost::spirit::ascii::space_type> array;
}; |
Partager