8 #ifndef INCLUDED_ORCUS_JSON_PARSER_HPP 9 #define INCLUDED_ORCUS_JSON_PARSER_HPP 11 #include "orcus/json_parser_base.hpp" 22 template<
typename _Handler>
26 typedef _Handler handler_type;
35 json_parser(
const char* p,
size_t n, handler_type& hdl);
51 handler_type& m_handler;
54 template<
typename _Handler>
56 const char* p,
size_t n, handler_type& hdl) :
59 template<
typename _Handler>
62 m_handler.begin_parse();
71 m_handler.end_parse();
74 template<
typename _Handler>
88 json::parse_error::throw_with(
89 "root_value: either '[' or '{' was expected, but '", cur_char(),
"' was found.", offset());
93 template<
typename _Handler>
94 void json_parser<_Handler>::value()
116 m_handler.boolean_true();
120 m_handler.boolean_false();
130 json::parse_error::throw_with(
"value: failed to parse '", cur_char(),
"'.", offset());
134 template<
typename _Handler>
135 void json_parser<_Handler>::array()
137 assert(cur_char() ==
'[');
139 m_handler.begin_array();
140 for (next(); has_char(); next())
142 if (cur_char() ==
']')
144 m_handler.end_array();
159 m_handler.end_array();
166 json::parse_error::throw_with(
167 "array: either ']' or ',' expected, but '", cur_char(),
"' found.", offset());
179 throw json::parse_error(
"array: failed to parse array.", offset());
182 template<
typename _Handler>
183 void json_parser<_Handler>::object()
185 assert(cur_char() ==
'{');
187 m_handler.begin_object();
188 for (next(); has_char(); next())
192 throw json::parse_error(
"object: stream ended prematurely before reaching a key.", offset());
197 m_handler.end_object();
204 json::parse_error::throw_with(
205 "object: '\"' was expected, but '", cur_char(),
"' found.", offset());
208 parse_quoted_string_state res = parse_string();
212 if (res.length == parse_quoted_string_state::error_no_closing_quote)
213 throw json::parse_error(
"object: stream ended prematurely before reaching the closing quote of a key.", offset());
214 else if (res.length == parse_quoted_string_state::error_illegal_escape_char)
215 json::parse_error::throw_with(
216 "object: illegal escape character '", cur_char(),
"' in key value.", offset());
218 throw json::parse_error(
"object: unknown error while parsing a key value.", offset());
221 m_handler.object_key(res.str, res.length, res.transient);
224 if (cur_char() !=
':')
225 json::parse_error::throw_with(
226 "object: ':' was expected, but '", cur_char(),
"' found.", offset());
232 throw json::parse_error(
"object: stream ended prematurely before reaching a value.", offset());
238 throw json::parse_error(
"object: stream ended prematurely before reaching either ']' or ','.", offset());
243 m_handler.end_object();
250 json::parse_error::throw_with(
251 "object: either ']' or ',' expected, but '", cur_char(),
"' found.", offset());
255 throw json::parse_error(
"object: closing '}' was never reached.", offset());
258 template<
typename _Handler>
259 void json_parser<_Handler>::number()
261 assert(is_numeric(cur_char()) || cur_char() ==
'-');
263 double val = parse_double_or_throw();
264 m_handler.number(val);
268 template<
typename _Handler>
269 void json_parser<_Handler>::string()
271 parse_quoted_string_state res = parse_string();
274 m_handler.string(res.str, res.length, res.transient);
279 if (res.length == parse_quoted_string_state::error_no_closing_quote)
280 throw json::parse_error(
"string: stream ended prematurely before reaching the closing quote.", offset());
281 else if (res.length == parse_quoted_string_state::error_illegal_escape_char)
282 json::parse_error::throw_with(
"string: illegal escape character '", cur_char(),
"'.", offset());
284 throw json::parse_error(
"string: unknown error.", offset());
void parse()
Definition: json_parser.hpp:60
json_parser(const char *p, size_t n, handler_type &hdl)
Definition: json_parser.hpp:55
Definition: json_parser_base.hpp:30
Definition: json_parser_base.hpp:18
Definition: json_parser.hpp:23
Definition: parser_base.hpp:35