21 #ifndef RAPIDJSON_READER_H_
22 #define RAPIDJSON_READER_H_
27 #include "encodings.h"
28 #include "internal/meta.h"
29 #include "internal/pow10.h"
30 #include "internal/stack.h"
32 #if defined(RAPIDJSON_SIMD) && defined(_MSC_VER)
34 #pragma intrinsic(_BitScanForward)
36 #ifdef RAPIDJSON_SSE42
37 #include <nmmintrin.h>
38 #elif defined(RAPIDJSON_SSE2)
39 #include <emmintrin.h>
44 RAPIDJSON_DIAG_OFF(4127)
45 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)
90 #ifndef RAPIDJSON_PARSE_ERROR_NORETURN
91 #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \
92 RAPIDJSON_MULTILINEMACRO_BEGIN \
93 RAPIDJSON_ASSERT(!HasParseError()); \
94 SetParseError(parseErrorCode, offset); \
95 RAPIDJSON_MULTILINEMACRO_END
109 #ifndef RAPIDJSON_PARSE_ERROR
110 #define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \
111 RAPIDJSON_MULTILINEMACRO_BEGIN \
112 RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
113 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
114 RAPIDJSON_MULTILINEMACRO_END
119 namespace rapidjson {
169 template<
typename Encoding = UTF8<>,
typename Derived =
void>
171 typedef typename Encoding::Ch Ch;
173 typedef typename internal::SelectIf<internal::IsSame<Derived, void>,
BaseReaderHandler, Derived>
::Type Override;
175 bool Default() {
return true; }
176 bool Null() {
return static_cast<Override&
>(*this).Default(); }
177 bool Bool(
bool) {
return static_cast<Override&
>(*this).Default(); }
178 bool Int(
int) {
return static_cast<Override&
>(*this).Default(); }
179 bool Uint(
unsigned) {
return static_cast<Override&
>(*this).Default(); }
180 bool Int64(int64_t) {
return static_cast<Override&
>(*this).Default(); }
181 bool Uint64(uint64_t) {
return static_cast<Override&
>(*this).Default(); }
182 bool Double(
double) {
return static_cast<Override&
>(*this).Default(); }
183 bool String(
const Ch*,
SizeType,
bool) {
return static_cast<Override&
>(*this).Default(); }
184 bool StartObject() {
return static_cast<Override&
>(*this).Default(); }
185 bool Key(
const Ch* str,
SizeType len,
bool copy) {
return static_cast<Override&
>(*this).String(str, len, copy); }
186 bool EndObject(
SizeType) {
return static_cast<Override&
>(*this).Default(); }
187 bool StartArray() {
return static_cast<Override&
>(*this).Default(); }
188 bool EndArray(
SizeType) {
return static_cast<Override&
>(*this).Default(); }
196 template<typename Stream, int = StreamTraits<Stream>::copyOptimization>
197 class StreamLocalCopy;
200 template<
typename Stream>
201 class StreamLocalCopy<
Stream, 1> {
203 StreamLocalCopy(
Stream& original) : s(original), original_(original) {}
204 ~StreamLocalCopy() { original_ = s; }
209 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
215 template<
typename Stream>
216 class StreamLocalCopy<Stream, 0> {
218 StreamLocalCopy(Stream& original) : s(original) {}
223 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
235 template<
typename InputStream>
237 internal::StreamLocalCopy<InputStream> copy(is);
238 InputStream& s(copy.s);
240 while (s.Peek() ==
' ' || s.Peek() ==
'\n' || s.Peek() ==
'\r' || s.Peek() ==
'\t')
244 #ifdef RAPIDJSON_SSE42
246 inline const char *SkipWhitespace_SIMD(
const char* p) {
248 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
254 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) & ~15);
255 while (p != nextAligned)
256 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
262 static const char whitespace[16] =
" \n\r\t";
263 const __m128i w = _mm_loadu_si128((
const __m128i *)&whitespace[0]);
266 const __m128i s = _mm_load_si128((
const __m128i *)p);
267 const unsigned r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY));
269 #ifdef _MSC_VER // Find the index of first non-whitespace
270 unsigned long offset;
271 _BitScanForward(&offset, r);
274 return p + __builtin_ffs(r) - 1;
280 #elif defined(RAPIDJSON_SSE2)
283 inline const char *SkipWhitespace_SIMD(
const char* p) {
285 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
291 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) & ~15);
292 while (p != nextAligned)
293 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
299 static const char whitespaces[4][17] = {
301 "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",
302 "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r",
303 "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"};
305 const __m128i w0 = _mm_loadu_si128((
const __m128i *)&whitespaces[0][0]);
306 const __m128i w1 = _mm_loadu_si128((
const __m128i *)&whitespaces[1][0]);
307 const __m128i w2 = _mm_loadu_si128((
const __m128i *)&whitespaces[2][0]);
308 const __m128i w3 = _mm_loadu_si128((
const __m128i *)&whitespaces[3][0]);
311 const __m128i s = _mm_load_si128((
const __m128i *)p);
312 __m128i x = _mm_cmpeq_epi8(s, w0);
313 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
314 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
315 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
316 unsigned short r = (
unsigned short)~_mm_movemask_epi8(x);
318 #ifdef _MSC_VER // Find the index of first non-whitespace
319 unsigned long offset;
320 _BitScanForward(&offset, r);
323 return p + __builtin_ffs(r) - 1;
329 #endif // RAPIDJSON_SSE2
331 #ifdef RAPIDJSON_SIMD
334 is.src_ =
const_cast<char*
>(SkipWhitespace_SIMD(is.src_));
339 is.
src_ = SkipWhitespace_SIMD(is.
src_);
341 #endif // RAPIDJSON_SIMD
362 template <
typename SourceEncoding,
typename TargetEncoding,
typename StackAllocator = CrtAllocator>
365 typedef typename SourceEncoding::Ch
Ch;
371 GenericReader(StackAllocator* stackAllocator = 0,
size_t stackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_() {}
381 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
384 return IterativeParse<parseFlags>(is, handler);
386 parseResult_.
Clear();
388 ClearStackOnExit scope(*
this);
392 if (is.Peek() ==
'\0') {
394 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
397 ParseValue<parseFlags>(is, handler);
398 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
403 if (is.Peek() !=
'\0') {
405 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
420 template <
typename InputStream,
typename Handler>
422 return Parse<kParseDefaultFlags>(is, handler);
435 void SetParseError(
ParseErrorCode code,
size_t offset) { parseResult_.
Set(code, offset); }
442 void ClearStack() { stack_.Clear(); }
445 struct ClearStackOnExit {
447 ~ClearStackOnExit() { r_.ClearStack(); }
450 ClearStackOnExit(
const ClearStackOnExit&);
451 ClearStackOnExit& operator=(
const ClearStackOnExit&);
455 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
456 void ParseObject(InputStream& is, Handler& handler) {
460 if (!handler.StartObject())
465 if (is.Peek() ==
'}') {
467 if (!handler.EndObject(0))
473 if (is.Peek() !=
'"')
476 ParseString<parseFlags>(is, handler,
true);
477 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
481 if (is.Take() !=
':')
486 ParseValue<parseFlags>(is, handler);
487 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
496 if (!handler.EndObject(memberCount))
506 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
507 void ParseArray(InputStream& is, Handler& handler) {
511 if (!handler.StartArray())
516 if (is.Peek() ==
']') {
518 if (!handler.EndArray(0))
524 ParseValue<parseFlags>(is, handler);
525 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
533 if (!handler.EndArray(elementCount))
542 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
543 void ParseNull(InputStream& is, Handler& handler) {
547 if (is.Take() ==
'u' && is.Take() ==
'l' && is.Take() ==
'l') {
555 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
556 void ParseTrue(InputStream& is, Handler& handler) {
560 if (is.Take() ==
'r' && is.Take() ==
'u' && is.Take() ==
'e') {
561 if (!handler.Bool(
true))
568 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
569 void ParseFalse(InputStream& is, Handler& handler) {
573 if (is.Take() ==
'a' && is.Take() ==
'l' && is.Take() ==
's' && is.Take() ==
'e') {
574 if (!handler.Bool(
false))
582 template<
typename InputStream>
583 unsigned ParseHex4(InputStream& is) {
584 unsigned codepoint = 0;
585 for (
int i = 0; i < 4; i++) {
588 codepoint +=
static_cast<unsigned>(c);
589 if (c >=
'0' && c <=
'9')
591 else if (c >=
'A' && c <=
'F')
592 codepoint -=
'A' - 10;
593 else if (c >=
'a' && c <=
'f')
594 codepoint -=
'a' - 10;
597 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
605 typedef typename TargetEncoding::Ch
Ch;
607 StackStream(internal::Stack<StackAllocator>& stack) : stack_(stack), length_(0) {}
608 RAPIDJSON_FORCEINLINE
void Put(
Ch c) {
609 *stack_.template Push<Ch>() = c;
612 internal::Stack<StackAllocator>& stack_;
616 StackStream(
const StackStream&);
617 StackStream& operator=(
const StackStream&);
621 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
622 void ParseString(InputStream& is, Handler& handler,
bool isKey =
false) {
623 internal::StreamLocalCopy<InputStream> copy(is);
624 InputStream& s(copy.s);
626 bool success =
false;
628 typename InputStream::Ch *head = s.PutBegin();
629 ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
630 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
631 size_t length = s.PutEnd(head) - 1;
633 const typename TargetEncoding::Ch*
const str = (
typename TargetEncoding::Ch*)head;
634 success = (isKey ? handler.Key(str,
SizeType(length),
false) : handler.String(str,
SizeType(length),
false));
637 StackStream stackStream(stack_);
638 ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
639 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
640 const typename TargetEncoding::Ch*
const str = stack_.template Pop<typename TargetEncoding::Ch>(stackStream.length_);
641 success = (isKey ? handler.Key(str, stackStream.length_ - 1,
true) : handler.String(str, stackStream.length_ - 1,
true));
649 template<
unsigned parseFlags,
typename SEncoding,
typename TEncoding,
typename InputStream,
typename OutputStream>
650 RAPIDJSON_FORCEINLINE
void ParseStringToStream(InputStream& is, OutputStream& os) {
652 #define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
653 static const char escape[256] = {
654 Z16, Z16, 0, 0,
'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'/',
655 Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'\\', 0, 0, 0,
656 0, 0,
'\b', 0, 0, 0,
'\f', 0, 0, 0, 0, 0, 0, 0,
'\n', 0,
657 0, 0,
'\r', 0,
'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
658 Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
671 if ((
sizeof(
Ch) == 1 ||
unsigned(e) < 256) && escape[(
unsigned char)e]) {
672 os.Put(escape[(
unsigned char)e]);
675 unsigned codepoint = ParseHex4(is);
676 if (codepoint >= 0xD800 && codepoint <= 0xDBFF) {
678 if (is.Take() !=
'\\' || is.Take() !=
'u')
680 unsigned codepoint2 = ParseHex4(is);
681 if (codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)
683 codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
685 TEncoding::Encode(os, codepoint);
697 else if ((
unsigned)c < 0x20)
701 !Transcoder<SEncoding, TEncoding>::Validate(is, os) :
708 inline double StrtodFastPath(
double significand,
int exp) {
715 return significand * internal::Pow10(exp);
717 return significand / internal::Pow10(-exp);
720 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
721 void ParseNumber(InputStream& is, Handler& handler) {
722 internal::StreamLocalCopy<InputStream> copy(is);
723 InputStream& s(copy.s);
727 if (s.Peek() ==
'-') {
735 bool use64bit =
false;
736 if (s.Peek() ==
'0') {
740 else if (s.Peek() >=
'1' && s.Peek() <=
'9') {
741 i =
static_cast<unsigned>(s.Take() -
'0');
744 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
745 if (i >= 214748364) {
746 if (i != 214748364 || s.Peek() >
'8') {
752 i = i * 10 +
static_cast<unsigned>(s.Take() -
'0');
755 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
756 if (i >= 429496729) {
757 if (i != 429496729 || s.Peek() >
'5') {
763 i = i * 10 +
static_cast<unsigned>(s.Take() -
'0');
771 bool useDouble =
false;
774 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
781 i64 = i64 * 10 +
static_cast<unsigned>(s.Take() -
'0');
784 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
791 i64 = i64 * 10 +
static_cast<unsigned>(s.Take() -
'0');
797 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
798 if (d >= 1.7976931348623157e307)
800 d = d * 10 + (s.Take() -
'0');
806 if (s.Peek() ==
'.') {
815 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
819 i64 = i64 * 10 +
static_cast<unsigned>(s.Take() -
'0');
829 d = use64bit ? (double)i64 : (
double)i;
833 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
834 d = d * 10 + (s.Take() -
'0');
844 if (s.Peek() ==
'e' || s.Peek() ==
'E') {
846 d = use64bit ? (double)i64 : (
double)i;
851 bool expMinus = false;
854 else if (s.Peek() == '-') {
859 if (s.Peek() >=
'0' && s.Peek() <=
'9') {
860 exp = s.Take() -
'0';
861 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
862 exp = exp * 10 + (s.Take() -
'0');
863 if (exp > 308 && !expMinus)
877 int expSum = exp + expFrac;
880 d = StrtodFastPath(d, exp);
881 d = StrtodFastPath(d, expFrac);
884 d = StrtodFastPath(d, expSum);
886 cont = handler.Double(minus ? -d : d);
891 cont = handler.Int64(-(int64_t)i64);
893 cont = handler.Uint64(i64);
897 cont = handler.Int(-(
int)i);
899 cont = handler.Uint(i);
907 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
908 void ParseValue(InputStream& is, Handler& handler) {
910 case 'n': ParseNull <parseFlags>(is, handler);
break;
911 case 't': ParseTrue <parseFlags>(is, handler);
break;
912 case 'f': ParseFalse <parseFlags>(is, handler);
break;
913 case '"': ParseString<parseFlags>(is, handler);
break;
914 case '{': ParseObject<parseFlags>(is, handler);
break;
915 case '[': ParseArray <parseFlags>(is, handler);
break;
916 default : ParseNumber<parseFlags>(is, handler);
923 enum IterativeParsingState {
924 IterativeParsingStartState = 0,
925 IterativeParsingFinishState,
926 IterativeParsingErrorState,
929 IterativeParsingObjectInitialState,
930 IterativeParsingMemberKeyState,
931 IterativeParsingKeyValueDelimiterState,
932 IterativeParsingMemberValueState,
933 IterativeParsingMemberDelimiterState,
934 IterativeParsingObjectFinishState,
937 IterativeParsingArrayInitialState,
938 IterativeParsingElementState,
939 IterativeParsingElementDelimiterState,
940 IterativeParsingArrayFinishState,
943 IterativeParsingValueState,
945 cIterativeParsingStateCount
950 LeftBracketToken = 0,
953 LeftCurlyBracketToken,
954 RightCurlyBracketToken,
968 RAPIDJSON_FORCEINLINE Token Tokenize(
Ch c) {
971 #define N NumberToken
972 #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
974 static const unsigned char tokenMap[256] = {
977 N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N,
978 N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N,
980 N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N,
981 N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N,
982 N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N,
983 N16, N16, N16, N16, N16, N16, N16, N16
989 if (
sizeof(
Ch) == 1 ||
unsigned(c) < 256)
990 return (Token)tokenMap[(
unsigned char)c];
995 RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
997 static const char G[cIterativeParsingStateCount][kTokenCount] = {
1000 IterativeParsingArrayInitialState,
1001 IterativeParsingErrorState,
1002 IterativeParsingObjectInitialState,
1003 IterativeParsingErrorState,
1004 IterativeParsingErrorState,
1005 IterativeParsingErrorState,
1006 IterativeParsingValueState,
1007 IterativeParsingValueState,
1008 IterativeParsingValueState,
1009 IterativeParsingValueState,
1010 IterativeParsingValueState
1014 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1015 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1016 IterativeParsingErrorState
1020 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1021 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1022 IterativeParsingErrorState
1026 IterativeParsingErrorState,
1027 IterativeParsingErrorState,
1028 IterativeParsingErrorState,
1029 IterativeParsingObjectFinishState,
1030 IterativeParsingErrorState,
1031 IterativeParsingErrorState,
1032 IterativeParsingMemberKeyState,
1033 IterativeParsingErrorState,
1034 IterativeParsingErrorState,
1035 IterativeParsingErrorState,
1036 IterativeParsingErrorState
1040 IterativeParsingErrorState,
1041 IterativeParsingErrorState,
1042 IterativeParsingErrorState,
1043 IterativeParsingErrorState,
1044 IterativeParsingErrorState,
1045 IterativeParsingKeyValueDelimiterState,
1046 IterativeParsingErrorState,
1047 IterativeParsingErrorState,
1048 IterativeParsingErrorState,
1049 IterativeParsingErrorState,
1050 IterativeParsingErrorState
1054 IterativeParsingArrayInitialState,
1055 IterativeParsingErrorState,
1056 IterativeParsingObjectInitialState,
1057 IterativeParsingErrorState,
1058 IterativeParsingErrorState,
1059 IterativeParsingErrorState,
1060 IterativeParsingMemberValueState,
1061 IterativeParsingMemberValueState,
1062 IterativeParsingMemberValueState,
1063 IterativeParsingMemberValueState,
1064 IterativeParsingMemberValueState
1068 IterativeParsingErrorState,
1069 IterativeParsingErrorState,
1070 IterativeParsingErrorState,
1071 IterativeParsingObjectFinishState,
1072 IterativeParsingMemberDelimiterState,
1073 IterativeParsingErrorState,
1074 IterativeParsingErrorState,
1075 IterativeParsingErrorState,
1076 IterativeParsingErrorState,
1077 IterativeParsingErrorState,
1078 IterativeParsingErrorState
1082 IterativeParsingErrorState,
1083 IterativeParsingErrorState,
1084 IterativeParsingErrorState,
1085 IterativeParsingErrorState,
1086 IterativeParsingErrorState,
1087 IterativeParsingErrorState,
1088 IterativeParsingMemberKeyState,
1089 IterativeParsingErrorState,
1090 IterativeParsingErrorState,
1091 IterativeParsingErrorState,
1092 IterativeParsingErrorState
1096 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1097 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1098 IterativeParsingErrorState
1102 IterativeParsingArrayInitialState,
1103 IterativeParsingArrayFinishState,
1104 IterativeParsingObjectInitialState,
1105 IterativeParsingErrorState,
1106 IterativeParsingErrorState,
1107 IterativeParsingErrorState,
1108 IterativeParsingElementState,
1109 IterativeParsingElementState,
1110 IterativeParsingElementState,
1111 IterativeParsingElementState,
1112 IterativeParsingElementState
1116 IterativeParsingErrorState,
1117 IterativeParsingArrayFinishState,
1118 IterativeParsingErrorState,
1119 IterativeParsingErrorState,
1120 IterativeParsingElementDelimiterState,
1121 IterativeParsingErrorState,
1122 IterativeParsingErrorState,
1123 IterativeParsingErrorState,
1124 IterativeParsingErrorState,
1125 IterativeParsingErrorState,
1126 IterativeParsingErrorState
1130 IterativeParsingArrayInitialState,
1131 IterativeParsingErrorState,
1132 IterativeParsingObjectInitialState,
1133 IterativeParsingErrorState,
1134 IterativeParsingErrorState,
1135 IterativeParsingErrorState,
1136 IterativeParsingElementState,
1137 IterativeParsingElementState,
1138 IterativeParsingElementState,
1139 IterativeParsingElementState,
1140 IterativeParsingElementState
1144 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1145 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1146 IterativeParsingErrorState
1150 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1151 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1152 IterativeParsingErrorState
1156 return (IterativeParsingState)G[state][token];
1161 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1162 RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) {
1164 case IterativeParsingStartState:
1166 return IterativeParsingErrorState;
1168 case IterativeParsingFinishState:
1171 case IterativeParsingErrorState:
1174 case IterativeParsingObjectInitialState:
1175 case IterativeParsingArrayInitialState:
1179 IterativeParsingState n = src;
1180 if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
1181 n = IterativeParsingElementState;
1182 else if (src == IterativeParsingKeyValueDelimiterState)
1183 n = IterativeParsingMemberValueState;
1185 *stack_.template Push<SizeType>(1) = n;
1187 *stack_.template Push<SizeType>(1) = 0;
1189 bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
1193 return IterativeParsingErrorState;
1201 case IterativeParsingMemberKeyState:
1202 ParseString<parseFlags>(is, handler,
true);
1204 return IterativeParsingErrorState;
1208 case IterativeParsingKeyValueDelimiterState:
1209 if (token == ColonToken) {
1214 return IterativeParsingErrorState;
1216 case IterativeParsingMemberValueState:
1218 ParseValue<parseFlags>(is, handler);
1220 return IterativeParsingErrorState;
1224 case IterativeParsingElementState:
1226 ParseValue<parseFlags>(is, handler);
1228 return IterativeParsingErrorState;
1232 case IterativeParsingMemberDelimiterState:
1233 case IterativeParsingElementDelimiterState:
1236 *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
1239 case IterativeParsingObjectFinishState:
1242 SizeType c = *stack_.template Pop<SizeType>(1);
1244 if (src == IterativeParsingMemberValueState)
1247 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1249 if (n == IterativeParsingStartState)
1250 n = IterativeParsingFinishState;
1252 bool hr = handler.EndObject(c);
1256 return IterativeParsingErrorState;
1264 case IterativeParsingArrayFinishState:
1267 SizeType c = *stack_.template Pop<SizeType>(1);
1269 if (src == IterativeParsingElementState)
1272 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1274 if (n == IterativeParsingStartState)
1275 n = IterativeParsingFinishState;
1277 bool hr = handler.EndArray(c);
1281 return IterativeParsingErrorState;
1289 case IterativeParsingValueState:
1291 ParseValue<parseFlags>(is, handler);
1293 return IterativeParsingErrorState;
1295 return IterativeParsingFinishState;
1299 return IterativeParsingErrorState;
1303 template <
typename InputStream>
1304 void HandleError(IterativeParsingState src, InputStream& is) {
1313 case IterativeParsingObjectInitialState:
1322 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1323 ParseResult IterativeParse(InputStream& is, Handler& handler) {
1324 parseResult_.
Clear();
1325 ClearStackOnExit scope(*
this);
1326 IterativeParsingState state = IterativeParsingStartState;
1329 while (is.Peek() !=
'\0') {
1330 Token t = Tokenize(is.Peek());
1331 IterativeParsingState n = Predict(state, t);
1332 IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
1334 if (d == IterativeParsingErrorState) {
1335 HandleError(state, is);
1349 if (state != IterativeParsingFinishState)
1350 HandleError(state, is);
1352 return parseResult_;
1355 static const size_t kDefaultStackCapacity = 256;
1356 internal::Stack<StackAllocator> stack_;
1357 ParseResult parseResult_;
1369 #endif // RAPIDJSON_READER_H_