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 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)
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';
869 int maxExp = (expFrac + 2147483639) / 10;
871 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
872 exp = exp * 10 + (s.Take() -
'0');
874 while (s.Peek() >=
'0' && s.Peek() <=
'9')
880 int maxExp = 308 - expFrac;
881 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
882 exp = exp * 10 + (s.Take() -
'0');
898 int expSum = exp + expFrac;
901 d = StrtodFastPath(d, exp);
902 d = StrtodFastPath(d, expFrac);
905 d = StrtodFastPath(d, expSum);
907 cont = handler.Double(minus ? -d : d);
912 cont = handler.Int64(-(int64_t)i64);
914 cont = handler.Uint64(i64);
918 cont = handler.Int(-(
int)i);
920 cont = handler.Uint(i);
928 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
929 void ParseValue(InputStream& is,
Handler& handler) {
931 case 'n': ParseNull <parseFlags>(is, handler);
break;
932 case 't': ParseTrue <parseFlags>(is, handler);
break;
933 case 'f': ParseFalse <parseFlags>(is, handler);
break;
934 case '"': ParseString<parseFlags>(is, handler);
break;
935 case '{': ParseObject<parseFlags>(is, handler);
break;
936 case '[': ParseArray <parseFlags>(is, handler);
break;
937 default : ParseNumber<parseFlags>(is, handler);
944 enum IterativeParsingState {
945 IterativeParsingStartState = 0,
946 IterativeParsingFinishState,
947 IterativeParsingErrorState,
950 IterativeParsingObjectInitialState,
951 IterativeParsingMemberKeyState,
952 IterativeParsingKeyValueDelimiterState,
953 IterativeParsingMemberValueState,
954 IterativeParsingMemberDelimiterState,
955 IterativeParsingObjectFinishState,
958 IterativeParsingArrayInitialState,
959 IterativeParsingElementState,
960 IterativeParsingElementDelimiterState,
961 IterativeParsingArrayFinishState,
964 IterativeParsingValueState,
966 cIterativeParsingStateCount
971 LeftBracketToken = 0,
974 LeftCurlyBracketToken,
975 RightCurlyBracketToken,
989 RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) {
992 #define N NumberToken 993 #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N 995 static const unsigned char tokenMap[256] = {
998 N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N,
999 N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N,
1001 N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N,
1002 N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N,
1003 N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N,
1004 N16, N16, N16, N16, N16, N16, N16, N16
1010 if (
sizeof(Ch) == 1 ||
unsigned(c) < 256)
1011 return (Token)tokenMap[(
unsigned char)c];
1016 RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
1018 static const char G[cIterativeParsingStateCount][kTokenCount] = {
1021 IterativeParsingArrayInitialState,
1022 IterativeParsingErrorState,
1023 IterativeParsingObjectInitialState,
1024 IterativeParsingErrorState,
1025 IterativeParsingErrorState,
1026 IterativeParsingErrorState,
1027 IterativeParsingValueState,
1028 IterativeParsingValueState,
1029 IterativeParsingValueState,
1030 IterativeParsingValueState,
1031 IterativeParsingValueState
1035 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1036 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1037 IterativeParsingErrorState
1041 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1042 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1043 IterativeParsingErrorState
1047 IterativeParsingErrorState,
1048 IterativeParsingErrorState,
1049 IterativeParsingErrorState,
1050 IterativeParsingObjectFinishState,
1051 IterativeParsingErrorState,
1052 IterativeParsingErrorState,
1053 IterativeParsingMemberKeyState,
1054 IterativeParsingErrorState,
1055 IterativeParsingErrorState,
1056 IterativeParsingErrorState,
1057 IterativeParsingErrorState
1061 IterativeParsingErrorState,
1062 IterativeParsingErrorState,
1063 IterativeParsingErrorState,
1064 IterativeParsingErrorState,
1065 IterativeParsingErrorState,
1066 IterativeParsingKeyValueDelimiterState,
1067 IterativeParsingErrorState,
1068 IterativeParsingErrorState,
1069 IterativeParsingErrorState,
1070 IterativeParsingErrorState,
1071 IterativeParsingErrorState
1075 IterativeParsingArrayInitialState,
1076 IterativeParsingErrorState,
1077 IterativeParsingObjectInitialState,
1078 IterativeParsingErrorState,
1079 IterativeParsingErrorState,
1080 IterativeParsingErrorState,
1081 IterativeParsingMemberValueState,
1082 IterativeParsingMemberValueState,
1083 IterativeParsingMemberValueState,
1084 IterativeParsingMemberValueState,
1085 IterativeParsingMemberValueState
1089 IterativeParsingErrorState,
1090 IterativeParsingErrorState,
1091 IterativeParsingErrorState,
1092 IterativeParsingObjectFinishState,
1093 IterativeParsingMemberDelimiterState,
1094 IterativeParsingErrorState,
1095 IterativeParsingErrorState,
1096 IterativeParsingErrorState,
1097 IterativeParsingErrorState,
1098 IterativeParsingErrorState,
1099 IterativeParsingErrorState
1103 IterativeParsingErrorState,
1104 IterativeParsingErrorState,
1105 IterativeParsingErrorState,
1106 IterativeParsingErrorState,
1107 IterativeParsingErrorState,
1108 IterativeParsingErrorState,
1109 IterativeParsingMemberKeyState,
1110 IterativeParsingErrorState,
1111 IterativeParsingErrorState,
1112 IterativeParsingErrorState,
1113 IterativeParsingErrorState
1117 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1118 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1119 IterativeParsingErrorState
1123 IterativeParsingArrayInitialState,
1124 IterativeParsingArrayFinishState,
1125 IterativeParsingObjectInitialState,
1126 IterativeParsingErrorState,
1127 IterativeParsingErrorState,
1128 IterativeParsingErrorState,
1129 IterativeParsingElementState,
1130 IterativeParsingElementState,
1131 IterativeParsingElementState,
1132 IterativeParsingElementState,
1133 IterativeParsingElementState
1137 IterativeParsingErrorState,
1138 IterativeParsingArrayFinishState,
1139 IterativeParsingErrorState,
1140 IterativeParsingErrorState,
1141 IterativeParsingElementDelimiterState,
1142 IterativeParsingErrorState,
1143 IterativeParsingErrorState,
1144 IterativeParsingErrorState,
1145 IterativeParsingErrorState,
1146 IterativeParsingErrorState,
1147 IterativeParsingErrorState
1151 IterativeParsingArrayInitialState,
1152 IterativeParsingErrorState,
1153 IterativeParsingObjectInitialState,
1154 IterativeParsingErrorState,
1155 IterativeParsingErrorState,
1156 IterativeParsingErrorState,
1157 IterativeParsingElementState,
1158 IterativeParsingElementState,
1159 IterativeParsingElementState,
1160 IterativeParsingElementState,
1161 IterativeParsingElementState
1165 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1166 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1167 IterativeParsingErrorState
1171 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1172 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1173 IterativeParsingErrorState
1177 return (IterativeParsingState)G[state][token];
1182 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1183 RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is,
Handler& handler) {
1185 case IterativeParsingStartState:
1187 return IterativeParsingErrorState;
1189 case IterativeParsingFinishState:
1192 case IterativeParsingErrorState:
1195 case IterativeParsingObjectInitialState:
1196 case IterativeParsingArrayInitialState:
1200 IterativeParsingState n = src;
1201 if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
1202 n = IterativeParsingElementState;
1203 else if (src == IterativeParsingKeyValueDelimiterState)
1204 n = IterativeParsingMemberValueState;
1206 *stack_.template Push<SizeType>(1) = n;
1208 *stack_.template Push<SizeType>(1) = 0;
1210 bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
1214 return IterativeParsingErrorState;
1222 case IterativeParsingMemberKeyState:
1223 ParseString<parseFlags>(is, handler,
true);
1224 if (HasParseError())
1225 return IterativeParsingErrorState;
1229 case IterativeParsingKeyValueDelimiterState:
1230 if (token == ColonToken) {
1235 return IterativeParsingErrorState;
1237 case IterativeParsingMemberValueState:
1239 ParseValue<parseFlags>(is, handler);
1240 if (HasParseError()) {
1241 return IterativeParsingErrorState;
1245 case IterativeParsingElementState:
1247 ParseValue<parseFlags>(is, handler);
1248 if (HasParseError()) {
1249 return IterativeParsingErrorState;
1253 case IterativeParsingMemberDelimiterState:
1254 case IterativeParsingElementDelimiterState:
1257 *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
1260 case IterativeParsingObjectFinishState:
1263 SizeType c = *stack_.template Pop<SizeType>(1);
1265 if (src == IterativeParsingMemberValueState)
1268 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1270 if (n == IterativeParsingStartState)
1271 n = IterativeParsingFinishState;
1273 bool hr = handler.EndObject(c);
1277 return IterativeParsingErrorState;
1285 case IterativeParsingArrayFinishState:
1288 SizeType c = *stack_.template Pop<SizeType>(1);
1290 if (src == IterativeParsingElementState)
1293 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1295 if (n == IterativeParsingStartState)
1296 n = IterativeParsingFinishState;
1298 bool hr = handler.EndArray(c);
1302 return IterativeParsingErrorState;
1310 case IterativeParsingValueState:
1312 ParseValue<parseFlags>(is, handler);
1313 if (HasParseError()) {
1314 return IterativeParsingErrorState;
1316 return IterativeParsingFinishState;
1320 return IterativeParsingErrorState;
1324 template <
typename InputStream>
1325 void HandleError(IterativeParsingState src, InputStream& is) {
1326 if (HasParseError()) {
1334 case IterativeParsingObjectInitialState:
1343 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1345 parseResult_.
Clear();
1346 ClearStackOnExit scope(*
this);
1347 IterativeParsingState state = IterativeParsingStartState;
1350 while (is.Peek() !=
'\0') {
1351 Token t = Tokenize(is.Peek());
1352 IterativeParsingState n = Predict(state, t);
1353 IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
1355 if (d == IterativeParsingErrorState) {
1356 HandleError(state, is);
1370 if (state != IterativeParsingFinishState)
1371 HandleError(state, is);
1373 return parseResult_;
1376 static const size_t kDefaultStackCapacity = 256;
1377 internal::Stack<StackAllocator> stack_;
1390 #endif // RAPIDJSON_READER_H_ Read-only string stream.
Definition: rapidjson.h:496
Iterative(constant complexity in terms of function call stack size) parsing.
Definition: reader.h:131
Concept for receiving events from GenericReader upon parsing. The functions return true if no error o...
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text.
Definition: reader.h:382
Validate encoding of JSON strings.
Definition: reader.h:130
Invalid value.
Definition: error.h:69
The surrogate pair in string is invalid.
Definition: error.h:78
#define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset)
(Internal) macro to indicate and handle a parse error.
Definition: reader.h:110
#define RAPIDJSON_UINT64_C2(high32, low32)
Construct a 64-bit literal by a pair of 32-bit integer.
Definition: rapidjson.h:186
SAX-style JSON parser. Use Reader for UTF8 encoding and default allocator.
Definition: reader.h:363
Encoding conversion.
Definition: encodings.h:591
Missing a colon after a name of object member.
Definition: error.h:72
Incorrect hex digit after \u escape in string.
Definition: error.h:77
bool HasParseError() const
Whether a parse error has occured in the last parsing.
Definition: reader.h:426
Miss fraction part in number.
Definition: error.h:84
unsigned SizeType
Size type (for string lengths, array sizes, etc.)
Definition: rapidjson.h:247
ParseErrorCode
Error code of parsing.
Definition: error.h:63
GenericReader(StackAllocator *stackAllocator=0, size_t stackCapacity=kDefaultStackCapacity)
Constructor.
Definition: reader.h:371
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
Definition: reader.h:432
void Clear()
Reset error code.
Definition: error.h:127
Missing a comma or ']' after an array element.
Definition: error.h:75
SourceEncoding::Ch Ch
SourceEncoding character type.
Definition: reader.h:365
The document root must not follow by other values.
Definition: error.h:67
const Ch * src_
Current read position.
Definition: rapidjson.h:510
#define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset)
Macro to indicate a parse error.
Definition: reader.h:91
Unspecific syntax error.
Definition: error.h:88
Missing a closing quotation mark in string.
Definition: error.h:80
Invalid escape character in string.
Definition: error.h:79
Result of parsing (wraps ParseErrorCode)
Definition: error.h:105
Missing a name for object member.
Definition: error.h:71
Type
Type of JSON value.
Definition: rapidjson.h:567
After parsing a complete JSON root from stream, stop further processing the rest of stream...
Definition: reader.h:132
void SkipWhitespace(InputStream &is)
Skip the JSON white spaces in a stream.
Definition: reader.h:236
main RapidJSON namespace
Definition: rapidjson.h:241
Default parse flags. Non-destructive parsing. Text strings are decoded into allocated buffer...
Definition: reader.h:128
ParseFlag
Combination of parseFlags.
Definition: reader.h:127
Parsing was terminated.
Definition: error.h:87
Number too big to be stored in double.
Definition: error.h:83
Default implementation of Handler.
Definition: reader.h:170
Miss exponent in number.
Definition: error.h:85
common definitions and configuration
In-situ(destructive) parsing.
Definition: reader.h:129
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text (with kParseDefaultFlags)
Definition: reader.h:421
UTF-8 encoding.
Definition: encodings.h:101
ParseErrorCode GetParseErrorCode() const
Get the ParseErrorCode of last parsing.
Definition: reader.h:429
The document is empty.
Definition: error.h:66
Missing a comma or '}' after an object member.
Definition: error.h:73
Invalid encoding in string.
Definition: error.h:81
GenericReader< UTF8<>, UTF8<> > Reader
Reader with UTF8 encoding and default allocator.
Definition: reader.h:1382
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
#define RAPIDJSON_ASSERT(x)
Assertion.
Definition: rapidjson.h:269
A read-write string stream.
Definition: rapidjson.h:530