1 #ifndef RAPIDJSON_READER_H_
2 #define RAPIDJSON_READER_H_
9 #include "internal/pow10.h"
10 #include "internal/stack.h"
12 #if defined(RAPIDJSON_SIMD) && defined(_MSC_VER)
14 #pragma intrinsic(_BitScanForward)
16 #ifdef RAPIDJSON_SSE42
17 #include <nmmintrin.h>
18 #elif defined(RAPIDJSON_SSE2)
19 #include <emmintrin.h>
24 RAPIDJSON_DIAG_OFF(4127)
25 RAPIDJSON_DIAG_OFF(4702)
28 #define RAPIDJSON_NOTHING
29 #ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN
30 #define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \
31 RAPIDJSON_MULTILINEMACRO_BEGIN \
32 if (HasParseError()) { return value; } \
33 RAPIDJSON_MULTILINEMACRO_END
35 #define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \
36 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING)
38 #ifndef RAPIDJSON_PARSE_ERROR_NORETURN
39 #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \
40 RAPIDJSON_MULTILINEMACRO_BEGIN \
41 RAPIDJSON_ASSERT(!HasParseError()); \
42 parseResult_.Set(parseErrorCode,offset); \
43 RAPIDJSON_MULTILINEMACRO_END
46 #ifndef RAPIDJSON_PARSE_ERROR
47 #define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \
48 RAPIDJSON_MULTILINEMACRO_BEGIN \
49 RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \
50 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \
51 RAPIDJSON_MULTILINEMACRO_END
54 #include "error/error.h"
105 template<
typename Encoding = UTF8<> >
107 typedef typename Encoding::Ch Ch;
109 bool Default() {
return true; }
110 bool Null() {
return Default(); }
111 bool Bool(
bool) {
return Default(); }
112 bool Int(
int) {
return Default(); }
113 bool Uint(
unsigned) {
return Default(); }
114 bool Int64(int64_t) {
return Default(); }
115 bool Uint64(uint64_t) {
return Default(); }
116 bool Double(
double) {
return Default(); }
117 bool String(
const Ch*,
SizeType,
bool) {
return Default(); }
118 bool StartObject() {
return Default(); }
119 bool EndObject(
SizeType) {
return Default(); }
120 bool StartArray() {
return Default(); }
121 bool EndArray(
SizeType) {
return Default(); }
129 template<typename Stream, int = StreamTraits<Stream>::copyOptimization>
130 class StreamLocalCopy;
133 template<
typename Stream>
134 class StreamLocalCopy<
Stream, 1> {
136 StreamLocalCopy(
Stream& original) : s(original), original_(original) {}
137 ~StreamLocalCopy() { original_ = s; }
142 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
148 template<
typename Stream>
149 class StreamLocalCopy<Stream, 0> {
151 StreamLocalCopy(Stream& original) : s(original) {}
156 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
168 template<
typename InputStream>
170 internal::StreamLocalCopy<InputStream> copy(is);
171 InputStream& s(copy.s);
173 while (s.Peek() ==
' ' || s.Peek() ==
'\n' || s.Peek() ==
'\r' || s.Peek() ==
'\t')
177 #ifdef RAPIDJSON_SSE42
179 inline const char *SkipWhitespace_SIMD(
const char* p) {
180 static const char whitespace[16] =
" \n\r\t";
181 static const char whitespaces[4][17] = {
183 "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",
184 "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r",
185 "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"};
188 const char* ap =
reinterpret_cast<const char*
>(
reinterpret_cast<size_t>(p) & ~15);
193 const __m128i w0 = _mm_loadu_si128((
const __m128i *)&whitespaces[0][0]);
194 const __m128i w1 = _mm_loadu_si128((
const __m128i *)&whitespaces[1][0]);
195 const __m128i w2 = _mm_loadu_si128((
const __m128i *)&whitespaces[2][0]);
196 const __m128i w3 = _mm_loadu_si128((
const __m128i *)&whitespaces[3][0]);
198 unsigned char shift =
reinterpret_cast<size_t>(p) & 15;
199 const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i*>(ap));
200 __m128i x = _mm_cmpeq_epi8(s, w0);
201 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
202 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
203 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
204 unsigned short r = (
unsigned short)~_mm_movemask_epi8(x);
205 r = r >> shift << shift;
207 #ifdef _MSC_VER // Find the index of first non-whitespace
208 unsigned long offset;
209 _BitScanForward(&offset, r);
212 return ap + __builtin_ffs(r) - 1;
218 const __m128i w = _mm_loadu_si128((
const __m128i *)&whitespace[0]);
222 const __m128i s = _mm_load_si128((
const __m128i *)ap);
223 const unsigned r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY));
225 #ifdef _MSC_VER // Find the index of first non-whitespace
226 unsigned long offset;
227 _BitScanForward(&offset, r);
230 return ap + __builtin_ffs(r) - 1;
236 #elif defined(RAPIDJSON_SSE2)
239 inline const char *SkipWhitespace_SIMD(
const char* p) {
240 static const char whitespaces[4][17] = {
242 "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",
243 "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r",
244 "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"};
246 const __m128i w0 = _mm_loadu_si128((
const __m128i *)&whitespaces[0][0]);
247 const __m128i w1 = _mm_loadu_si128((
const __m128i *)&whitespaces[1][0]);
248 const __m128i w2 = _mm_loadu_si128((
const __m128i *)&whitespaces[2][0]);
249 const __m128i w3 = _mm_loadu_si128((
const __m128i *)&whitespaces[3][0]);
252 const char* ap =
reinterpret_cast<const char*
>(
reinterpret_cast<size_t>(p) & ~15);
256 unsigned char shift =
reinterpret_cast<size_t>(p) & 15;
257 const __m128i s = _mm_load_si128(reinterpret_cast<const __m128i*>(ap));
258 __m128i x = _mm_cmpeq_epi8(s, w0);
259 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
260 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
261 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
262 unsigned short r = (
unsigned short)~_mm_movemask_epi8(x);
263 r = r >> shift << shift;
265 #ifdef _MSC_VER // Find the index of first non-whitespace
266 unsigned long offset;
267 _BitScanForward(&offset, r);
270 return ap + __builtin_ffs(r) - 1;
278 const __m128i s = _mm_load_si128((
const __m128i *)ap);
279 __m128i x = _mm_cmpeq_epi8(s, w0);
280 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
281 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
282 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
283 unsigned short r = (
unsigned short)~_mm_movemask_epi8(x);
285 #ifdef _MSC_VER // Find the index of first non-whitespace
286 unsigned long offset;
287 _BitScanForward(&offset, r);
290 return ap + __builtin_ffs(r) - 1;
296 #endif // RAPIDJSON_SSE2
298 #ifdef RAPIDJSON_SIMD
301 is.src_ =
const_cast<char*
>(SkipWhitespace_SIMD(is.src_));
306 is.src_ = SkipWhitespace_SIMD(is.src_);
308 #endif // RAPIDJSON_SIMD
329 template <
typename SourceEncoding,
typename TargetEncoding,
typename Allocator = MemoryPoolAllocator<> >
332 typedef typename SourceEncoding::Ch
Ch;
338 GenericReader(
Allocator* allocator = 0,
size_t stackCapacity = kDefaultStackCapacity) : stack_(allocator, stackCapacity), parseResult_() {}
348 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
351 return IterativeParse<parseFlags>(is, handler);
353 parseResult_.
Clear();
355 ClearStackOnExit scope(*
this);
359 if (is.Peek() ==
'\0') {
361 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
365 case '{': ParseObject<parseFlags>(is, handler);
break;
366 case '[': ParseArray<parseFlags>(is, handler);
break;
369 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
374 if (is.Peek() !=
'\0') {
376 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
391 template <
typename InputStream,
typename Handler>
393 return Parse<kParseDefaultFlags>(is, handler);
410 void ClearStack() { stack_.Clear(); }
413 struct ClearStackOnExit {
415 ~ClearStackOnExit() { r_.ClearStack(); }
418 ClearStackOnExit(
const ClearStackOnExit&);
419 ClearStackOnExit& operator=(
const ClearStackOnExit&);
423 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
424 void ParseObject(InputStream& is, Handler& handler) {
428 if (!handler.StartObject())
433 if (is.Peek() ==
'}') {
435 if (!handler.EndObject(0))
441 if (is.Peek() !=
'"')
444 ParseString<parseFlags>(is, handler);
445 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
449 if (is.Take() !=
':')
454 ParseValue<parseFlags>(is, handler);
455 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
464 if (!handler.EndObject(memberCount))
474 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
475 void ParseArray(InputStream& is, Handler& handler) {
479 if (!handler.StartArray())
484 if (is.Peek() ==
']') {
486 if (!handler.EndArray(0))
492 ParseValue<parseFlags>(is, handler);
493 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
501 if (!handler.EndArray(elementCount))
510 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
511 void ParseNull(InputStream& is, Handler& handler) {
515 if (is.Take() ==
'u' && is.Take() ==
'l' && is.Take() ==
'l') {
523 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
524 void ParseTrue(InputStream& is, Handler& handler) {
528 if (is.Take() ==
'r' && is.Take() ==
'u' && is.Take() ==
'e') {
529 if (!handler.Bool(
true))
536 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
537 void ParseFalse(InputStream& is, Handler& handler) {
541 if (is.Take() ==
'a' && is.Take() ==
'l' && is.Take() ==
's' && is.Take() ==
'e') {
542 if (!handler.Bool(
false))
550 template<
typename InputStream>
551 unsigned ParseHex4(InputStream& is) {
552 unsigned codepoint = 0;
553 for (
int i = 0; i < 4; i++) {
556 codepoint +=
static_cast<unsigned>(c);
557 if (c >=
'0' && c <=
'9')
559 else if (c >=
'A' && c <=
'F')
560 codepoint -=
'A' - 10;
561 else if (c >=
'a' && c <=
'f')
562 codepoint -=
'a' - 10;
565 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
573 typedef typename TargetEncoding::Ch
Ch;
575 StackStream(internal::Stack<Allocator>& stack) : stack_(stack), length_(0) {}
576 RAPIDJSON_FORCEINLINE
void Put(
Ch c) {
577 *stack_.template Push<Ch>() = c;
580 internal::Stack<Allocator>& stack_;
584 StackStream(
const StackStream&);
585 StackStream& operator=(
const StackStream&);
589 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
590 void ParseString(InputStream& is, Handler& handler) {
591 internal::StreamLocalCopy<InputStream> copy(is);
592 InputStream& s(copy.s);
595 typename InputStream::Ch *head = s.PutBegin();
596 ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
597 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
598 size_t length = s.PutEnd(head) - 1;
600 if (!handler.String((
typename TargetEncoding::Ch*)head,
SizeType(length),
false))
604 StackStream stackStream(stack_);
605 ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
606 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
607 if (!handler.String(stack_.template Pop<typename TargetEncoding::Ch>(stackStream.length_), stackStream.length_ - 1,
true))
614 template<
unsigned parseFlags,
typename SEncoding,
typename TEncoding,
typename InputStream,
typename OutputStream>
615 RAPIDJSON_FORCEINLINE
void ParseStringToStream(InputStream& is, OutputStream& os) {
616 #define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
617 static const char escape[256] = {
618 Z16, Z16, 0, 0,
'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'/',
619 Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'\\', 0, 0, 0,
620 0, 0,
'\b', 0, 0, 0,
'\f', 0, 0, 0, 0, 0, 0, 0,
'\n', 0,
621 0, 0,
'\r', 0,
'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
622 Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
634 if ((
sizeof(
Ch) == 1 ||
unsigned(e) < 256) && escape[(
unsigned char)e]) {
635 os.Put(escape[(
unsigned char)e]);
638 unsigned codepoint = ParseHex4(is);
639 if (codepoint >= 0xD800 && codepoint <= 0xDBFF) {
641 if (is.Take() !=
'\\' || is.Take() !=
'u')
643 unsigned codepoint2 = ParseHex4(is);
644 if (codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)
646 codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
648 TEncoding::Encode(os, codepoint);
660 else if ((
unsigned)c < 0x20)
664 !Transcoder<SEncoding, TEncoding>::Validate(is, os) :
671 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
672 void ParseNumber(InputStream& is, Handler& handler) {
673 internal::StreamLocalCopy<InputStream> copy(is);
674 InputStream& s(copy.s);
678 if (s.Peek() ==
'-') {
685 bool try64bit =
false;
686 if (s.Peek() ==
'0') {
690 else if (s.Peek() >=
'1' && s.Peek() <=
'9') {
691 i =
static_cast<unsigned>(s.Take() -
'0');
694 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
695 if (i >= 214748364) {
696 if (i != 214748364 || s.Peek() >
'8') {
701 i = i * 10 +
static_cast<unsigned>(s.Take() -
'0');
704 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
705 if (i >= 429496729) {
706 if (i != 429496729 || s.Peek() >
'5') {
711 i = i * 10 +
static_cast<unsigned>(s.Take() -
'0');
719 bool useDouble =
false;
723 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
724 if (i64 >= UINT64_C(922337203685477580))
725 if (i64 != UINT64_C(922337203685477580) || s.Peek() >
'8') {
729 i64 = i64 * 10 +
static_cast<unsigned>(s.Take() -
'0');
732 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
733 if (i64 >= UINT64_C(1844674407370955161))
734 if (i64 != UINT64_C(1844674407370955161) || s.Peek() >
'5') {
738 i64 = i64 * 10 +
static_cast<unsigned>(s.Take() -
'0');
746 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
749 d = d * 10 + (s.Take() -
'0');
755 if (s.Peek() ==
'.') {
757 d = try64bit ? (double)i64 : (
double)i;
762 if (s.Peek() >= '0' && s.Peek() <= '9') {
763 d = d * 10 + (s.Take() -
'0');
769 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
771 d = d * 10 + (s.Peek() -
'0');
780 if (s.Peek() ==
'e' || s.Peek() ==
'E') {
782 d = try64bit ? (double)i64 : (
double)i;
787 bool expMinus = false;
790 else if (s.Peek() == '-') {
795 if (s.Peek() >=
'0' && s.Peek() <=
'9') {
796 exp = s.Take() -
'0';
797 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
798 exp = exp * 10 + (s.Take() -
'0');
799 if (exp > 308 && !expMinus)
813 int expSum = exp + expFrac;
816 d *= internal::Pow10(exp);
817 d *= internal::Pow10(expFrac);
820 d *= internal::Pow10(expSum);
822 cont = handler.Double(minus ? -d : d);
827 cont = handler.Int64(-(int64_t)i64);
829 cont = handler.Uint64(i64);
833 cont = handler.Int(-(
int)i);
835 cont = handler.Uint(i);
843 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
844 void ParseValue(InputStream& is, Handler& handler) {
846 case 'n': ParseNull <parseFlags>(is, handler);
break;
847 case 't': ParseTrue <parseFlags>(is, handler);
break;
848 case 'f': ParseFalse <parseFlags>(is, handler);
break;
849 case '"': ParseString<parseFlags>(is, handler);
break;
850 case '{': ParseObject<parseFlags>(is, handler);
break;
851 case '[': ParseArray <parseFlags>(is, handler);
break;
852 default : ParseNumber<parseFlags>(is, handler);
859 enum IterativeParsingState {
860 IterativeParsingStartState = 0,
861 IterativeParsingFinishState,
862 IterativeParsingErrorState,
865 IterativeParsingObjectInitialState,
866 IterativeParsingMemberKeyState,
867 IterativeParsingKeyValueDelimiterState,
868 IterativeParsingMemberValueState,
869 IterativeParsingMemberDelimiterState,
870 IterativeParsingObjectFinishState,
873 IterativeParsingArrayInitialState,
874 IterativeParsingElementState,
875 IterativeParsingElementDelimiterState,
876 IterativeParsingArrayFinishState,
878 cIterativeParsingStateCount
883 LeftBracketToken = 0,
886 LeftCurlyBracketToken,
887 RightCurlyBracketToken,
901 RAPIDJSON_FORCEINLINE Token Tokenize(
Ch c) {
902 #define N NumberToken
903 #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
905 static const unsigned char tokenMap[256] = {
908 N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N,
909 N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N,
911 N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N,
912 N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N,
913 N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N,
914 N16, N16, N16, N16, N16, N16, N16, N16
919 if (
sizeof(
Ch) == 1 ||
unsigned(c) < 256)
920 return (Token)tokenMap[(
unsigned char)c];
925 RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
927 static const char G[cIterativeParsingStateCount][kTokenCount] = {
930 IterativeParsingArrayInitialState,
931 IterativeParsingErrorState,
932 IterativeParsingObjectInitialState,
933 IterativeParsingErrorState,
934 IterativeParsingErrorState,
935 IterativeParsingErrorState,
936 IterativeParsingErrorState,
937 IterativeParsingErrorState,
938 IterativeParsingErrorState,
939 IterativeParsingErrorState,
940 IterativeParsingErrorState
944 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
945 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
946 IterativeParsingErrorState
950 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
951 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
952 IterativeParsingErrorState
956 IterativeParsingErrorState,
957 IterativeParsingErrorState,
958 IterativeParsingErrorState,
959 IterativeParsingObjectFinishState,
960 IterativeParsingErrorState,
961 IterativeParsingErrorState,
962 IterativeParsingMemberKeyState,
963 IterativeParsingErrorState,
964 IterativeParsingErrorState,
965 IterativeParsingErrorState,
966 IterativeParsingErrorState
970 IterativeParsingErrorState,
971 IterativeParsingErrorState,
972 IterativeParsingErrorState,
973 IterativeParsingErrorState,
974 IterativeParsingErrorState,
975 IterativeParsingKeyValueDelimiterState,
976 IterativeParsingErrorState,
977 IterativeParsingErrorState,
978 IterativeParsingErrorState,
979 IterativeParsingErrorState,
980 IterativeParsingErrorState
984 IterativeParsingArrayInitialState,
985 IterativeParsingErrorState,
986 IterativeParsingObjectInitialState,
987 IterativeParsingErrorState,
988 IterativeParsingErrorState,
989 IterativeParsingErrorState,
990 IterativeParsingMemberValueState,
991 IterativeParsingMemberValueState,
992 IterativeParsingMemberValueState,
993 IterativeParsingMemberValueState,
994 IterativeParsingMemberValueState
998 IterativeParsingErrorState,
999 IterativeParsingErrorState,
1000 IterativeParsingErrorState,
1001 IterativeParsingObjectFinishState,
1002 IterativeParsingMemberDelimiterState,
1003 IterativeParsingErrorState,
1004 IterativeParsingErrorState,
1005 IterativeParsingErrorState,
1006 IterativeParsingErrorState,
1007 IterativeParsingErrorState,
1008 IterativeParsingErrorState
1012 IterativeParsingErrorState,
1013 IterativeParsingErrorState,
1014 IterativeParsingErrorState,
1015 IterativeParsingErrorState,
1016 IterativeParsingErrorState,
1017 IterativeParsingErrorState,
1018 IterativeParsingMemberKeyState,
1019 IterativeParsingErrorState,
1020 IterativeParsingErrorState,
1021 IterativeParsingErrorState,
1022 IterativeParsingErrorState
1026 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1027 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1028 IterativeParsingErrorState
1032 IterativeParsingArrayInitialState,
1033 IterativeParsingArrayFinishState,
1034 IterativeParsingObjectInitialState,
1035 IterativeParsingErrorState,
1036 IterativeParsingErrorState,
1037 IterativeParsingErrorState,
1038 IterativeParsingElementState,
1039 IterativeParsingElementState,
1040 IterativeParsingElementState,
1041 IterativeParsingElementState,
1042 IterativeParsingElementState
1046 IterativeParsingErrorState,
1047 IterativeParsingArrayFinishState,
1048 IterativeParsingErrorState,
1049 IterativeParsingErrorState,
1050 IterativeParsingElementDelimiterState,
1051 IterativeParsingErrorState,
1052 IterativeParsingErrorState,
1053 IterativeParsingErrorState,
1054 IterativeParsingErrorState,
1055 IterativeParsingErrorState,
1056 IterativeParsingErrorState
1060 IterativeParsingArrayInitialState,
1061 IterativeParsingErrorState,
1062 IterativeParsingObjectInitialState,
1063 IterativeParsingErrorState,
1064 IterativeParsingErrorState,
1065 IterativeParsingErrorState,
1066 IterativeParsingElementState,
1067 IterativeParsingElementState,
1068 IterativeParsingElementState,
1069 IterativeParsingElementState,
1070 IterativeParsingElementState
1074 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1075 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1076 IterativeParsingErrorState
1080 return (IterativeParsingState)G[state][token];
1085 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1086 RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) {
1088 case IterativeParsingStartState:
1090 return IterativeParsingErrorState;
1092 case IterativeParsingFinishState:
1095 case IterativeParsingErrorState:
1098 case IterativeParsingObjectInitialState:
1099 case IterativeParsingArrayInitialState:
1103 IterativeParsingState n = src;
1104 if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
1105 n = IterativeParsingElementState;
1106 else if (src == IterativeParsingKeyValueDelimiterState)
1107 n = IterativeParsingMemberValueState;
1109 *stack_.template Push<SizeType>(1) = n;
1111 *stack_.template Push<SizeType>(1) = 0;
1113 bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
1117 return IterativeParsingErrorState;
1125 case IterativeParsingMemberKeyState:
1126 ParseString<parseFlags>(is, handler);
1128 return IterativeParsingErrorState;
1132 case IterativeParsingKeyValueDelimiterState:
1133 if (token == ColonToken) {
1138 return IterativeParsingErrorState;
1140 case IterativeParsingMemberValueState:
1142 ParseValue<parseFlags>(is, handler);
1144 return IterativeParsingErrorState;
1148 case IterativeParsingElementState:
1150 ParseValue<parseFlags>(is, handler);
1152 return IterativeParsingErrorState;
1156 case IterativeParsingMemberDelimiterState:
1157 case IterativeParsingElementDelimiterState:
1160 *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
1163 case IterativeParsingObjectFinishState:
1166 SizeType c = *stack_.template Pop<SizeType>(1);
1168 if (src == IterativeParsingMemberValueState)
1171 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1173 if (n == IterativeParsingStartState)
1174 n = IterativeParsingFinishState;
1176 bool hr = handler.EndObject(c);
1180 return IterativeParsingErrorState;
1188 case IterativeParsingArrayFinishState:
1191 SizeType c = *stack_.template Pop<SizeType>(1);
1193 if (src == IterativeParsingElementState)
1196 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1198 if (n == IterativeParsingStartState)
1199 n = IterativeParsingFinishState;
1201 bool hr = handler.EndArray(c);
1205 return IterativeParsingErrorState;
1215 return IterativeParsingErrorState;
1219 template <
typename InputStream>
1220 void HandleError(IterativeParsingState src, InputStream& is) {
1229 case IterativeParsingObjectInitialState:
1238 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1239 ParseResult IterativeParse(InputStream& is, Handler& handler) {
1240 parseResult_.
Clear();
1241 ClearStackOnExit scope(*
this);
1242 IterativeParsingState state = IterativeParsingStartState;
1245 while (is.Peek() !=
'\0') {
1246 Token t = Tokenize(is.Peek());
1247 IterativeParsingState n = Predict(state, t);
1248 IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
1250 if (d == IterativeParsingErrorState) {
1251 HandleError(state, is);
1265 if (state != IterativeParsingFinishState)
1266 HandleError(state, is);
1268 return parseResult_;
1271 static const size_t kDefaultStackCapacity = 256;
1272 internal::Stack<Allocator> stack_;
1273 ParseResult parseResult_;
1285 #endif // RAPIDJSON_READER_H_