| 12
 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