21 #ifndef RAPIDJSON_READER_H_
22 #define RAPIDJSON_READER_H_
28 #include "encodings.h"
29 #include "internal/meta.h"
30 #include "internal/pow10.h"
31 #include "internal/stack.h"
33 #if defined(RAPIDJSON_SIMD) && defined(_MSC_VER)
35 #pragma intrinsic(_BitScanForward)
37 #ifdef RAPIDJSON_SSE42
38 #include <nmmintrin.h>
39 #elif defined(RAPIDJSON_SSE2)
40 #include <emmintrin.h>
45 RAPIDJSON_DIAG_OFF(4127)
46 RAPIDJSON_DIAG_OFF(4702)
49 #define RAPIDJSON_NOTHING
50 #ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN
51 #define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \
52 RAPIDJSON_MULTILINEMACRO_BEGIN \
53 if (HasParseError()) { return value; } \
54 RAPIDJSON_MULTILINEMACRO_END
56 #define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \
57 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
59 #ifndef RAPIDJSON_PARSE_ERROR_NORETURN
60 #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \
61 RAPIDJSON_MULTILINEMACRO_BEGIN \
62 RAPIDJSON_ASSERT(!HasParseError()); \
63 parseResult_.Set(parseErrorCode,offset); \
64 RAPIDJSON_MULTILINEMACRO_END
67 #ifndef RAPIDJSON_PARSE_ERROR
68 #define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \
69 RAPIDJSON_MULTILINEMACRO_BEGIN \
70 RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
71 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
72 RAPIDJSON_MULTILINEMACRO_END
75 #include "error/error.h"
126 template<
typename Encoding = UTF8<>,
typename Derived =
void>
128 typedef typename Encoding::Ch Ch;
130 typedef typename internal::SelectIf<internal::IsSame<Derived, void>,
BaseReaderHandler, Derived>
::Type Override;
132 bool Default() {
return true; }
133 bool Null() {
return static_cast<Override&
>(*this).Default(); }
134 bool Bool(
bool) {
return static_cast<Override&
>(*this).Default(); }
135 bool Int(
int) {
return static_cast<Override&
>(*this).Default(); }
136 bool Uint(
unsigned) {
return static_cast<Override&
>(*this).Default(); }
137 bool Int64(int64_t) {
return static_cast<Override&
>(*this).Default(); }
138 bool Uint64(uint64_t) {
return static_cast<Override&
>(*this).Default(); }
139 bool Double(
double) {
return static_cast<Override&
>(*this).Default(); }
140 bool String(
const Ch*,
SizeType,
bool) {
return static_cast<Override&
>(*this).Default(); }
141 bool StartObject() {
return static_cast<Override&
>(*this).Default(); }
142 bool EndObject(
SizeType) {
return static_cast<Override&
>(*this).Default(); }
143 bool StartArray() {
return static_cast<Override&
>(*this).Default(); }
144 bool EndArray(
SizeType) {
return static_cast<Override&
>(*this).Default(); }
152 template<typename Stream, int = StreamTraits<Stream>::copyOptimization>
153 class StreamLocalCopy;
156 template<
typename Stream>
157 class StreamLocalCopy<
Stream, 1> {
159 StreamLocalCopy(
Stream& original) : s(original), original_(original) {}
160 ~StreamLocalCopy() { original_ = s; }
165 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
171 template<
typename Stream>
172 class StreamLocalCopy<Stream, 0> {
174 StreamLocalCopy(Stream& original) : s(original) {}
179 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
191 template<
typename InputStream>
193 internal::StreamLocalCopy<InputStream> copy(is);
194 InputStream& s(copy.s);
196 while (s.Peek() ==
' ' || s.Peek() ==
'\n' || s.Peek() ==
'\r' || s.Peek() ==
'\t')
200 #ifdef RAPIDJSON_SSE42
202 inline const char *SkipWhitespace_SIMD(
const char* p) {
203 static const char whitespace[16] =
" \n\r\t";
204 static const char whitespaces[4][17] = {
206 "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",
207 "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r",
208 "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"};
211 const char* ap =
reinterpret_cast<const char*
>(
reinterpret_cast<size_t>(p) & ~15);
216 const __m128i w0 = _mm_loadu_si128((
const __m128i *)&whitespaces[0][0]);
217 const __m128i w1 = _mm_loadu_si128((
const __m128i *)&whitespaces[1][0]);
218 const __m128i w2 = _mm_loadu_si128((
const __m128i *)&whitespaces[2][0]);
219 const __m128i w3 = _mm_loadu_si128((
const __m128i *)&whitespaces[3][0]);
221 unsigned char shift =
reinterpret_cast<size_t>(p) & 15;
222 const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i*>(ap));
223 __m128i x = _mm_cmpeq_epi8(s, w0);
224 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
225 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
226 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
227 unsigned short r = (
unsigned short)~_mm_movemask_epi8(x);
228 r = r >> shift << shift;
230 #ifdef _MSC_VER // Find the index of first non-whitespace
231 unsigned long offset;
232 _BitScanForward(&offset, r);
235 return ap + __builtin_ffs(r) - 1;
241 const __m128i w = _mm_loadu_si128((
const __m128i *)&whitespace[0]);
245 const __m128i s = _mm_load_si128((
const __m128i *)ap);
246 const unsigned r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY));
248 #ifdef _MSC_VER // Find the index of first non-whitespace
249 unsigned long offset;
250 _BitScanForward(&offset, r);
253 return ap + __builtin_ffs(r) - 1;
259 #elif defined(RAPIDJSON_SSE2)
262 inline const char *SkipWhitespace_SIMD(
const char* p) {
263 static const char whitespaces[4][17] = {
265 "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",
266 "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r",
267 "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"};
269 const __m128i w0 = _mm_loadu_si128((
const __m128i *)&whitespaces[0][0]);
270 const __m128i w1 = _mm_loadu_si128((
const __m128i *)&whitespaces[1][0]);
271 const __m128i w2 = _mm_loadu_si128((
const __m128i *)&whitespaces[2][0]);
272 const __m128i w3 = _mm_loadu_si128((
const __m128i *)&whitespaces[3][0]);
275 const char* ap =
reinterpret_cast<const char*
>(
reinterpret_cast<size_t>(p) & ~15);
279 unsigned char shift =
reinterpret_cast<size_t>(p) & 15;
280 const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i*>(ap));
281 __m128i x = _mm_cmpeq_epi8(s, w0);
282 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
283 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
284 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
285 unsigned short r = (
unsigned short)~_mm_movemask_epi8(x);
286 r = r >> shift << shift;
288 #ifdef _MSC_VER // Find the index of first non-whitespace
289 unsigned long offset;
290 _BitScanForward(&offset, r);
293 return ap + __builtin_ffs(r) - 1;
301 const __m128i s = _mm_load_si128((
const __m128i *)ap);
302 __m128i x = _mm_cmpeq_epi8(s, w0);
303 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
304 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
305 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
306 unsigned short r = (
unsigned short)~_mm_movemask_epi8(x);
308 #ifdef _MSC_VER // Find the index of first non-whitespace
309 unsigned long offset;
310 _BitScanForward(&offset, r);
313 return ap + __builtin_ffs(r) - 1;
319 #endif // RAPIDJSON_SSE2
321 #ifdef RAPIDJSON_SIMD
324 is.src_ =
const_cast<char*
>(SkipWhitespace_SIMD(is.src_));
329 is.src_ = SkipWhitespace_SIMD(is.src_);
331 #endif // RAPIDJSON_SIMD
352 template <
typename SourceEncoding,
typename TargetEncoding,
typename Allocator = MemoryPoolAllocator<> >
355 typedef typename SourceEncoding::Ch
Ch;
361 GenericReader(
Allocator* allocator = 0,
size_t stackCapacity = kDefaultStackCapacity) : stack_(allocator, stackCapacity), parseResult_() {}
371 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
374 return IterativeParse<parseFlags>(is, handler);
376 parseResult_.
Clear();
378 ClearStackOnExit scope(*
this);
382 if (is.Peek() ==
'\0') {
384 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
387 ParseValue<parseFlags>(is, handler);
388 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
393 if (is.Peek() !=
'\0') {
395 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
410 template <
typename InputStream,
typename Handler>
412 return Parse<kParseDefaultFlags>(is, handler);
429 void ClearStack() { stack_.Clear(); }
432 struct ClearStackOnExit {
434 ~ClearStackOnExit() { r_.ClearStack(); }
437 ClearStackOnExit(
const ClearStackOnExit&);
438 ClearStackOnExit& operator=(
const ClearStackOnExit&);
442 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
443 void ParseObject(InputStream& is, Handler& handler) {
447 if (!handler.StartObject())
452 if (is.Peek() ==
'}') {
454 if (!handler.EndObject(0))
460 if (is.Peek() !=
'"')
463 ParseString<parseFlags>(is, handler);
464 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
468 if (is.Take() !=
':')
473 ParseValue<parseFlags>(is, handler);
474 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
483 if (!handler.EndObject(memberCount))
493 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
494 void ParseArray(InputStream& is, Handler& handler) {
498 if (!handler.StartArray())
503 if (is.Peek() ==
']') {
505 if (!handler.EndArray(0))
511 ParseValue<parseFlags>(is, handler);
512 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
520 if (!handler.EndArray(elementCount))
529 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
530 void ParseNull(InputStream& is, Handler& handler) {
534 if (is.Take() ==
'u' && is.Take() ==
'l' && is.Take() ==
'l') {
542 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
543 void ParseTrue(InputStream& is, Handler& handler) {
547 if (is.Take() ==
'r' && is.Take() ==
'u' && is.Take() ==
'e') {
548 if (!handler.Bool(
true))
555 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
556 void ParseFalse(InputStream& is, Handler& handler) {
560 if (is.Take() ==
'a' && is.Take() ==
'l' && is.Take() ==
's' && is.Take() ==
'e') {
561 if (!handler.Bool(
false))
569 template<
typename InputStream>
570 unsigned ParseHex4(InputStream& is) {
571 unsigned codepoint = 0;
572 for (
int i = 0; i < 4; i++) {
575 codepoint +=
static_cast<unsigned>(c);
576 if (c >=
'0' && c <=
'9')
578 else if (c >=
'A' && c <=
'F')
579 codepoint -=
'A' - 10;
580 else if (c >=
'a' && c <=
'f')
581 codepoint -=
'a' - 10;
584 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
592 typedef typename TargetEncoding::Ch
Ch;
594 StackStream(internal::Stack<Allocator>& stack) : stack_(stack), length_(0) {}
595 RAPIDJSON_FORCEINLINE
void Put(
Ch c) {
596 *stack_.template Push<Ch>() = c;
599 internal::Stack<Allocator>& stack_;
603 StackStream(
const StackStream&);
604 StackStream& operator=(
const StackStream&);
608 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
609 void ParseString(InputStream& is, Handler& handler) {
610 internal::StreamLocalCopy<InputStream> copy(is);
611 InputStream& s(copy.s);
614 typename InputStream::Ch *head = s.PutBegin();
615 ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
616 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
617 size_t length = s.PutEnd(head) - 1;
619 if (!handler.String((
typename TargetEncoding::Ch*)head,
SizeType(length),
false))
623 StackStream stackStream(stack_);
624 ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
625 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
626 if (!handler.String(stack_.template Pop<typename TargetEncoding::Ch>(stackStream.length_), stackStream.length_ - 1,
true))
633 template<
unsigned parseFlags,
typename SEncoding,
typename TEncoding,
typename InputStream,
typename OutputStream>
634 RAPIDJSON_FORCEINLINE
void ParseStringToStream(InputStream& is, OutputStream& os) {
635 #define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
636 static const char escape[256] = {
637 Z16, Z16, 0, 0,
'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'/',
638 Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'\\', 0, 0, 0,
639 0, 0,
'\b', 0, 0, 0,
'\f', 0, 0, 0, 0, 0, 0, 0,
'\n', 0,
640 0, 0,
'\r', 0,
'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
641 Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
653 if ((
sizeof(
Ch) == 1 ||
unsigned(e) < 256) && escape[(
unsigned char)e]) {
654 os.Put(escape[(
unsigned char)e]);
657 unsigned codepoint = ParseHex4(is);
658 if (codepoint >= 0xD800 && codepoint <= 0xDBFF) {
660 if (is.Take() !=
'\\' || is.Take() !=
'u')
662 unsigned codepoint2 = ParseHex4(is);
663 if (codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)
665 codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
667 TEncoding::Encode(os, codepoint);
679 else if ((
unsigned)c < 0x20)
683 !Transcoder<SEncoding, TEncoding>::Validate(is, os) :
690 inline double StrtodFastPath(
double significand,
int exp) {
697 return significand * internal::Pow10(exp);
699 return significand / internal::Pow10(-exp);
702 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
703 void ParseNumber(InputStream& is, Handler& handler) {
704 internal::StreamLocalCopy<InputStream> copy(is);
705 InputStream& s(copy.s);
709 if (s.Peek() ==
'-') {
716 bool try64bit =
false;
717 if (s.Peek() ==
'0') {
721 else if (s.Peek() >=
'1' && s.Peek() <=
'9') {
722 i =
static_cast<unsigned>(s.Take() -
'0');
725 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
726 if (i >= 214748364) {
727 if (i != 214748364 || s.Peek() >
'8') {
732 i = i * 10 +
static_cast<unsigned>(s.Take() -
'0');
735 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
736 if (i >= 429496729) {
737 if (i != 429496729 || s.Peek() >
'5') {
742 i = i * 10 +
static_cast<unsigned>(s.Take() -
'0');
750 bool useDouble =
false;
754 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
760 i64 = i64 * 10 +
static_cast<unsigned>(s.Take() -
'0');
763 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
769 i64 = i64 * 10 +
static_cast<unsigned>(s.Take() -
'0');
777 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
778 if (d >= 1.7976931348623157e307)
780 d = d * 10 + (s.Take() -
'0');
786 if (s.Peek() ==
'.') {
788 d = try64bit ? (double)i64 : (
double)i;
793 if (s.Peek() >= '0' && s.Peek() <= '9') {
794 d = d * 10 + (s.Take() -
'0');
800 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
802 d = d * 10 + (s.Peek() -
'0');
811 if (s.Peek() ==
'e' || s.Peek() ==
'E') {
813 d = try64bit ? (double)i64 : (
double)i;
818 bool expMinus = false;
821 else if (s.Peek() == '-') {
826 if (s.Peek() >=
'0' && s.Peek() <=
'9') {
827 exp = s.Take() -
'0';
828 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
829 exp = exp * 10 + (s.Take() -
'0');
830 if (exp > 308 && !expMinus)
844 int expSum = exp + expFrac;
847 d = StrtodFastPath(d, exp);
848 d = StrtodFastPath(d, expFrac);
851 d = StrtodFastPath(d, expSum);
853 cont = handler.Double(minus ? -d : d);
858 cont = handler.Int64(-(int64_t)i64);
860 cont = handler.Uint64(i64);
864 cont = handler.Int(-(
int)i);
866 cont = handler.Uint(i);
874 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
875 void ParseValue(InputStream& is, Handler& handler) {
877 case 'n': ParseNull <parseFlags>(is, handler);
break;
878 case 't': ParseTrue <parseFlags>(is, handler);
break;
879 case 'f': ParseFalse <parseFlags>(is, handler);
break;
880 case '"': ParseString<parseFlags>(is, handler);
break;
881 case '{': ParseObject<parseFlags>(is, handler);
break;
882 case '[': ParseArray <parseFlags>(is, handler);
break;
883 default : ParseNumber<parseFlags>(is, handler);
890 enum IterativeParsingState {
891 IterativeParsingStartState = 0,
892 IterativeParsingFinishState,
893 IterativeParsingErrorState,
896 IterativeParsingObjectInitialState,
897 IterativeParsingMemberKeyState,
898 IterativeParsingKeyValueDelimiterState,
899 IterativeParsingMemberValueState,
900 IterativeParsingMemberDelimiterState,
901 IterativeParsingObjectFinishState,
904 IterativeParsingArrayInitialState,
905 IterativeParsingElementState,
906 IterativeParsingElementDelimiterState,
907 IterativeParsingArrayFinishState,
910 IterativeParsingValueState,
912 cIterativeParsingStateCount
917 LeftBracketToken = 0,
920 LeftCurlyBracketToken,
921 RightCurlyBracketToken,
935 RAPIDJSON_FORCEINLINE Token Tokenize(
Ch c) {
936 #define N NumberToken
937 #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
939 static const unsigned char tokenMap[256] = {
942 N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N,
943 N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N,
945 N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N,
946 N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N,
947 N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N,
948 N16, N16, N16, N16, N16, N16, N16, N16
953 if (
sizeof(
Ch) == 1 ||
unsigned(c) < 256)
954 return (Token)tokenMap[(
unsigned char)c];
959 RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
961 static const char G[cIterativeParsingStateCount][kTokenCount] = {
964 IterativeParsingArrayInitialState,
965 IterativeParsingErrorState,
966 IterativeParsingObjectInitialState,
967 IterativeParsingErrorState,
968 IterativeParsingErrorState,
969 IterativeParsingErrorState,
970 IterativeParsingValueState,
971 IterativeParsingValueState,
972 IterativeParsingValueState,
973 IterativeParsingValueState,
974 IterativeParsingValueState
978 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
979 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
980 IterativeParsingErrorState
984 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
985 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
986 IterativeParsingErrorState
990 IterativeParsingErrorState,
991 IterativeParsingErrorState,
992 IterativeParsingErrorState,
993 IterativeParsingObjectFinishState,
994 IterativeParsingErrorState,
995 IterativeParsingErrorState,
996 IterativeParsingMemberKeyState,
997 IterativeParsingErrorState,
998 IterativeParsingErrorState,
999 IterativeParsingErrorState,
1000 IterativeParsingErrorState
1004 IterativeParsingErrorState,
1005 IterativeParsingErrorState,
1006 IterativeParsingErrorState,
1007 IterativeParsingErrorState,
1008 IterativeParsingErrorState,
1009 IterativeParsingKeyValueDelimiterState,
1010 IterativeParsingErrorState,
1011 IterativeParsingErrorState,
1012 IterativeParsingErrorState,
1013 IterativeParsingErrorState,
1014 IterativeParsingErrorState
1018 IterativeParsingArrayInitialState,
1019 IterativeParsingErrorState,
1020 IterativeParsingObjectInitialState,
1021 IterativeParsingErrorState,
1022 IterativeParsingErrorState,
1023 IterativeParsingErrorState,
1024 IterativeParsingMemberValueState,
1025 IterativeParsingMemberValueState,
1026 IterativeParsingMemberValueState,
1027 IterativeParsingMemberValueState,
1028 IterativeParsingMemberValueState
1032 IterativeParsingErrorState,
1033 IterativeParsingErrorState,
1034 IterativeParsingErrorState,
1035 IterativeParsingObjectFinishState,
1036 IterativeParsingMemberDelimiterState,
1037 IterativeParsingErrorState,
1038 IterativeParsingErrorState,
1039 IterativeParsingErrorState,
1040 IterativeParsingErrorState,
1041 IterativeParsingErrorState,
1042 IterativeParsingErrorState
1046 IterativeParsingErrorState,
1047 IterativeParsingErrorState,
1048 IterativeParsingErrorState,
1049 IterativeParsingErrorState,
1050 IterativeParsingErrorState,
1051 IterativeParsingErrorState,
1052 IterativeParsingMemberKeyState,
1053 IterativeParsingErrorState,
1054 IterativeParsingErrorState,
1055 IterativeParsingErrorState,
1056 IterativeParsingErrorState
1060 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1061 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1062 IterativeParsingErrorState
1066 IterativeParsingArrayInitialState,
1067 IterativeParsingArrayFinishState,
1068 IterativeParsingObjectInitialState,
1069 IterativeParsingErrorState,
1070 IterativeParsingErrorState,
1071 IterativeParsingErrorState,
1072 IterativeParsingElementState,
1073 IterativeParsingElementState,
1074 IterativeParsingElementState,
1075 IterativeParsingElementState,
1076 IterativeParsingElementState
1080 IterativeParsingErrorState,
1081 IterativeParsingArrayFinishState,
1082 IterativeParsingErrorState,
1083 IterativeParsingErrorState,
1084 IterativeParsingElementDelimiterState,
1085 IterativeParsingErrorState,
1086 IterativeParsingErrorState,
1087 IterativeParsingErrorState,
1088 IterativeParsingErrorState,
1089 IterativeParsingErrorState,
1090 IterativeParsingErrorState
1094 IterativeParsingArrayInitialState,
1095 IterativeParsingErrorState,
1096 IterativeParsingObjectInitialState,
1097 IterativeParsingErrorState,
1098 IterativeParsingErrorState,
1099 IterativeParsingErrorState,
1100 IterativeParsingElementState,
1101 IterativeParsingElementState,
1102 IterativeParsingElementState,
1103 IterativeParsingElementState,
1104 IterativeParsingElementState
1108 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1109 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1110 IterativeParsingErrorState
1114 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1115 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1116 IterativeParsingErrorState
1120 return (IterativeParsingState)G[state][token];
1125 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1126 RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) {
1128 case IterativeParsingStartState:
1130 return IterativeParsingErrorState;
1132 case IterativeParsingFinishState:
1135 case IterativeParsingErrorState:
1138 case IterativeParsingObjectInitialState:
1139 case IterativeParsingArrayInitialState:
1143 IterativeParsingState n = src;
1144 if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
1145 n = IterativeParsingElementState;
1146 else if (src == IterativeParsingKeyValueDelimiterState)
1147 n = IterativeParsingMemberValueState;
1149 *stack_.template Push<SizeType>(1) = n;
1151 *stack_.template Push<SizeType>(1) = 0;
1153 bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
1157 return IterativeParsingErrorState;
1165 case IterativeParsingMemberKeyState:
1166 ParseString<parseFlags>(is, handler);
1168 return IterativeParsingErrorState;
1172 case IterativeParsingKeyValueDelimiterState:
1173 if (token == ColonToken) {
1178 return IterativeParsingErrorState;
1180 case IterativeParsingMemberValueState:
1182 ParseValue<parseFlags>(is, handler);
1184 return IterativeParsingErrorState;
1188 case IterativeParsingElementState:
1190 ParseValue<parseFlags>(is, handler);
1192 return IterativeParsingErrorState;
1196 case IterativeParsingMemberDelimiterState:
1197 case IterativeParsingElementDelimiterState:
1200 *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
1203 case IterativeParsingObjectFinishState:
1206 SizeType c = *stack_.template Pop<SizeType>(1);
1208 if (src == IterativeParsingMemberValueState)
1211 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1213 if (n == IterativeParsingStartState)
1214 n = IterativeParsingFinishState;
1216 bool hr = handler.EndObject(c);
1220 return IterativeParsingErrorState;
1228 case IterativeParsingArrayFinishState:
1231 SizeType c = *stack_.template Pop<SizeType>(1);
1233 if (src == IterativeParsingElementState)
1236 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1238 if (n == IterativeParsingStartState)
1239 n = IterativeParsingFinishState;
1241 bool hr = handler.EndArray(c);
1245 return IterativeParsingErrorState;
1253 case IterativeParsingValueState:
1255 ParseValue<parseFlags>(is, handler);
1257 return IterativeParsingErrorState;
1259 return IterativeParsingFinishState;
1263 return IterativeParsingErrorState;
1267 template <
typename InputStream>
1268 void HandleError(IterativeParsingState src, InputStream& is) {
1277 case IterativeParsingObjectInitialState:
1286 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1287 ParseResult IterativeParse(InputStream& is, Handler& handler) {
1288 parseResult_.
Clear();
1289 ClearStackOnExit scope(*
this);
1290 IterativeParsingState state = IterativeParsingStartState;
1293 while (is.Peek() !=
'\0') {
1294 Token t = Tokenize(is.Peek());
1295 IterativeParsingState n = Predict(state, t);
1296 IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
1298 if (d == IterativeParsingErrorState) {
1299 HandleError(state, is);
1313 if (state != IterativeParsingFinishState)
1314 HandleError(state, is);
1316 return parseResult_;
1319 static const size_t kDefaultStackCapacity = 256;
1320 internal::Stack<Allocator> stack_;
1321 ParseResult parseResult_;
1333 #endif // RAPIDJSON_READER_H_
Result of parsing (wraps ParseErrorCode)
Definition: error.h:97
The document root must not follow by other values.
Definition: error.h:60
Iterative(constant complexity in terms of function call stack size) parsing.
Definition: reader.h:89
Concept for receiving events from GenericReader upon parsing. The functions return true if no error o...
Validate encoding of JSON strings.
Definition: reader.h:88
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
Definition: rapidjson.h:138
SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator.
Definition: reader.h:353
SourceEncoding::Ch Ch
SourceEncoding character type.
Definition: reader.h:355
unsigned SizeType
Use 32-bit array/string indices even for 64-bit platform, instead of using size_t.
Definition: rapidjson.h:162
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
Definition: reader.h:422
ParseErrorCode GetParseErrorCode() const
Get the ParseErrorCode of last parsing.
Definition: reader.h:419
Invalid value.
Definition: error.h:62
Miss fraction part in number.
Definition: error.h:77
The document is empty.
Definition: error.h:59
The surrogate pair in string is invalid.
Definition: error.h:71
GenericInsituStringStream< UTF8<> > InsituStringStream
Insitu string stream with UTF8 encoding.
Definition: rapidjson.h:414
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text (with kParseDefaultFlags)
Definition: reader.h:411
Missing a colon after a name of object member.
Definition: error.h:65
Missing a closing quotation mark in string.
Definition: error.h:73
Invalid escape character in string.
Definition: error.h:72
Missing a name for object member.
Definition: error.h:64
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:175
Number too big to be stored in double.
Definition: error.h:76
Type
Type of JSON value.
Definition: rapidjson.h:420
After parsing a complete JSON root from stream, stop further processing the rest of stream...
Definition: reader.h:90
GenericReader(Allocator *allocator=0, size_t stackCapacity=kDefaultStackCapacity)
Constructor.
Definition: reader.h:361
void SkipWhitespace(InputStream &is)
Skip the JSON white spaces in a stream.
Definition: reader.h:192
GenericStringStream< UTF8<> > StringStream
String stream with UTF8 encoding.
Definition: rapidjson.h:373
Invalid encoding in string.
Definition: error.h:74
bool IsError() const
Whether the result is an error.
Definition: error.h:112
bool HasParseError() const
Whether a parse error has occured in the last parsing.
Definition: reader.h:416
Default parse flags. Non-destructive parsing. Text strings are decoded into allocated buffer...
Definition: reader.h:86
ParseFlag
Combination of parseFlags.
Definition: reader.h:85
Concept for reading and writing characters.
ParseErrorCode Code() const
Get the error code.
Definition: error.h:105
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text.
Definition: reader.h:372
Missing a comma or '}' after an object member.
Definition: error.h:66
Default implementation of Handler.
Definition: reader.h:127
common definitions and configuration
In-situ(destructive) parsing.
Definition: reader.h:87
ParseErrorCode
Error code of parsing.
Definition: error.h:56
UTF-8 encoding.
Definition: encodings.h:101
Unspecific syntax error.
Definition: error.h:81
Concept for allocating, resizing and freeing memory block.
Parsing was terminated.
Definition: error.h:80
size_t Offset() const
Get the error offset, if IsError(), 0 otherwise.
Definition: error.h:107
GenericReader< UTF8<>, UTF8<> > Reader
Reader with UTF8 encoding and default allocator.
Definition: reader.h:1325
static RAPIDJSON_FORCEINLINE bool Transcode(InputStream &is, OutputStream &os)
Take one Unicode codepoint from source encoding, convert it to target encoding and put it to the outp...
Definition: encodings.h:594
Incorrect hex digit after \u escape in string.
Definition: error.h:70
Miss exponent in number.
Definition: error.h:78
Missing a comma or ']' after an array element.
Definition: error.h:68
void Clear()
Reset error code.
Definition: error.h:119