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" 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)
50 #define RAPIDJSON_NOTHING 51 #ifndef RAPIDJSON_PARSE_ERROR_EARLY_RETURN 52 #define RAPIDJSON_PARSE_ERROR_EARLY_RETURN(value) \ 53 RAPIDJSON_MULTILINEMACRO_BEGIN \ 54 if (HasParseError()) { return value; } \ 55 RAPIDJSON_MULTILINEMACRO_END 57 #define RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID \ 58 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(RAPIDJSON_NOTHING) 91 #ifndef RAPIDJSON_PARSE_ERROR_NORETURN 92 #define RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset) \ 93 RAPIDJSON_MULTILINEMACRO_BEGIN \ 94 RAPIDJSON_ASSERT(!HasParseError()); \ 95 SetParseError(parseErrorCode, offset); \ 96 RAPIDJSON_MULTILINEMACRO_END 110 #ifndef RAPIDJSON_PARSE_ERROR 111 #define RAPIDJSON_PARSE_ERROR(parseErrorCode, offset) \ 112 RAPIDJSON_MULTILINEMACRO_BEGIN \ 113 RAPIDJSON_PARSE_ERROR_NORETURN(parseErrorCode, offset); \ 114 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; \ 115 RAPIDJSON_MULTILINEMACRO_END 170 template<
typename Encoding = UTF8<>,
typename Derived =
void>
172 typedef typename Encoding::Ch Ch;
174 typedef typename internal::SelectIf<internal::IsSame<Derived, void>,
BaseReaderHandler, Derived>
::Type Override;
176 bool Default() {
return true; }
177 bool Null() {
return static_cast<Override&
>(*this).Default(); }
178 bool Bool(
bool) {
return static_cast<Override&
>(*this).Default(); }
179 bool Int(
int) {
return static_cast<Override&
>(*this).Default(); }
180 bool Uint(
unsigned) {
return static_cast<Override&
>(*this).Default(); }
181 bool Int64(int64_t) {
return static_cast<Override&
>(*this).Default(); }
182 bool Uint64(uint64_t) {
return static_cast<Override&
>(*this).Default(); }
183 bool Double(
double) {
return static_cast<Override&
>(*this).Default(); }
184 bool String(
const Ch*,
SizeType,
bool) {
return static_cast<Override&
>(*this).Default(); }
185 bool StartObject() {
return static_cast<Override&
>(*this).Default(); }
186 bool Key(
const Ch* str,
SizeType len,
bool copy) {
return static_cast<Override&
>(*this).String(str, len, copy); }
187 bool EndObject(
SizeType) {
return static_cast<Override&
>(*this).Default(); }
188 bool StartArray() {
return static_cast<Override&
>(*this).Default(); }
189 bool EndArray(
SizeType) {
return static_cast<Override&
>(*this).Default(); }
197 template<typename Stream, int = StreamTraits<Stream>::copyOptimization>
198 class StreamLocalCopy;
201 template<
typename Stream>
202 class StreamLocalCopy<Stream, 1> {
204 StreamLocalCopy(Stream& original) : s(original), original_(original) {}
205 ~StreamLocalCopy() { original_ = s; }
210 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
216 template<
typename Stream>
217 class StreamLocalCopy<Stream, 0> {
219 StreamLocalCopy(Stream& original) : s(original) {}
224 StreamLocalCopy& operator=(
const StreamLocalCopy&) ;
236 template<
typename InputStream>
238 internal::StreamLocalCopy<InputStream> copy(is);
239 InputStream& s(copy.s);
241 while (s.Peek() ==
' ' || s.Peek() ==
'\n' || s.Peek() ==
'\r' || s.Peek() ==
'\t')
245 #ifdef RAPIDJSON_SSE42 247 inline const char *SkipWhitespace_SIMD(
const char* p) {
249 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
255 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) & ~15);
256 while (p != nextAligned)
257 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
263 static const char whitespace[16] =
" \n\r\t";
264 const __m128i w = _mm_loadu_si128((
const __m128i *)&whitespace[0]);
267 const __m128i s = _mm_load_si128((
const __m128i *)p);
268 const unsigned r = _mm_cvtsi128_si32(_mm_cmpistrm(w, s, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK | _SIDD_NEGATIVE_POLARITY));
270 #ifdef _MSC_VER // Find the index of first non-whitespace 271 unsigned long offset;
272 _BitScanForward(&offset, r);
275 return p + __builtin_ffs(r) - 1;
281 #elif defined(RAPIDJSON_SSE2) 284 inline const char *SkipWhitespace_SIMD(
const char* p) {
286 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
292 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) & ~15);
293 while (p != nextAligned)
294 if (*p ==
' ' || *p ==
'\n' || *p ==
'\r' || *p ==
'\t')
300 static const char whitespaces[4][17] = {
302 "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",
303 "\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r",
304 "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"};
306 const __m128i w0 = _mm_loadu_si128((
const __m128i *)&whitespaces[0][0]);
307 const __m128i w1 = _mm_loadu_si128((
const __m128i *)&whitespaces[1][0]);
308 const __m128i w2 = _mm_loadu_si128((
const __m128i *)&whitespaces[2][0]);
309 const __m128i w3 = _mm_loadu_si128((
const __m128i *)&whitespaces[3][0]);
312 const __m128i s = _mm_load_si128((
const __m128i *)p);
313 __m128i x = _mm_cmpeq_epi8(s, w0);
314 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w1));
315 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w2));
316 x = _mm_or_si128(x, _mm_cmpeq_epi8(s, w3));
317 unsigned short r = (
unsigned short)~_mm_movemask_epi8(x);
319 #ifdef _MSC_VER // Find the index of first non-whitespace 320 unsigned long offset;
321 _BitScanForward(&offset, r);
324 return p + __builtin_ffs(r) - 1;
330 #endif // RAPIDJSON_SSE2 332 #ifdef RAPIDJSON_SIMD 335 is.src_ =
const_cast<char*
>(SkipWhitespace_SIMD(is.src_));
340 is.
src_ = SkipWhitespace_SIMD(is.
src_);
342 #endif // RAPIDJSON_SIMD 363 template <
typename SourceEncoding,
typename TargetEncoding,
typename StackAllocator = CrtAllocator>
366 typedef typename SourceEncoding::Ch
Ch;
372 GenericReader(StackAllocator* stackAllocator = 0,
size_t stackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_() {}
382 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
385 return IterativeParse<parseFlags>(is, handler);
387 parseResult_.
Clear();
389 ClearStackOnExit scope(*
this);
393 if (is.Peek() ==
'\0') {
395 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
398 ParseValue<parseFlags>(is, handler);
399 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
404 if (is.Peek() !=
'\0') {
406 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
421 template <
typename InputStream,
typename Handler>
423 return Parse<kParseDefaultFlags>(is, handler);
436 void SetParseError(
ParseErrorCode code,
size_t offset) { parseResult_.Set(code, offset); }
443 void ClearStack() { stack_.Clear(); }
446 struct ClearStackOnExit {
448 ~ClearStackOnExit() { r_.ClearStack(); }
451 ClearStackOnExit(
const ClearStackOnExit&);
452 ClearStackOnExit& operator=(
const ClearStackOnExit&);
456 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
457 void ParseObject(InputStream& is,
Handler& handler) {
461 if (!handler.StartObject())
466 if (is.Peek() ==
'}') {
468 if (!handler.EndObject(0))
474 if (is.Peek() !=
'"')
477 ParseString<parseFlags>(is, handler,
true);
478 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
482 if (is.Take() !=
':')
487 ParseValue<parseFlags>(is, handler);
488 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
497 if (!handler.EndObject(memberCount))
507 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
508 void ParseArray(InputStream& is,
Handler& handler) {
512 if (!handler.StartArray())
517 if (is.Peek() ==
']') {
519 if (!handler.EndArray(0))
525 ParseValue<parseFlags>(is, handler);
526 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
534 if (!handler.EndArray(elementCount))
543 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
544 void ParseNull(InputStream& is,
Handler& handler) {
548 if (is.Take() ==
'u' && is.Take() ==
'l' && is.Take() ==
'l') {
556 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
557 void ParseTrue(InputStream& is,
Handler& handler) {
561 if (is.Take() ==
'r' && is.Take() ==
'u' && is.Take() ==
'e') {
562 if (!handler.Bool(
true))
569 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
570 void ParseFalse(InputStream& is,
Handler& handler) {
574 if (is.Take() ==
'a' && is.Take() ==
'l' && is.Take() ==
's' && is.Take() ==
'e') {
575 if (!handler.Bool(
false))
583 template<
typename InputStream>
584 unsigned ParseHex4(InputStream& is) {
585 unsigned codepoint = 0;
586 for (
int i = 0; i < 4; i++) {
589 codepoint +=
static_cast<unsigned>(c);
590 if (c >=
'0' && c <=
'9')
592 else if (c >=
'A' && c <=
'F')
593 codepoint -=
'A' - 10;
594 else if (c >=
'a' && c <=
'f')
595 codepoint -=
'a' - 10;
598 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
606 typedef typename TargetEncoding::Ch Ch;
608 StackStream(internal::Stack<StackAllocator>& stack) : stack_(stack), length_(0) {}
609 RAPIDJSON_FORCEINLINE
void Put(Ch c) {
610 *stack_.template Push<Ch>() = c;
613 internal::Stack<StackAllocator>& stack_;
617 StackStream(
const StackStream&);
618 StackStream& operator=(
const StackStream&);
622 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
623 void ParseString(InputStream& is,
Handler& handler,
bool isKey =
false) {
624 internal::StreamLocalCopy<InputStream> copy(is);
625 InputStream& s(copy.s);
627 bool success =
false;
629 typename InputStream::Ch *head = s.PutBegin();
630 ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
631 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
632 size_t length = s.PutEnd(head) - 1;
634 const typename TargetEncoding::Ch*
const str = (
typename TargetEncoding::Ch*)head;
635 success = (isKey ? handler.Key(str,
SizeType(length),
false) : handler.String(str,
SizeType(length),
false));
638 StackStream stackStream(stack_);
639 ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
640 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
641 const typename TargetEncoding::Ch*
const str = stack_.template Pop<typename TargetEncoding::Ch>(stackStream.length_);
642 success = (isKey ? handler.Key(str, stackStream.length_ - 1,
true) : handler.String(str, stackStream.length_ - 1,
true));
650 template<
unsigned parseFlags,
typename SEncoding,
typename TEncoding,
typename InputStream,
typename OutputStream>
651 RAPIDJSON_FORCEINLINE
void ParseStringToStream(InputStream& is, OutputStream& os) {
653 #define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 654 static const char escape[256] = {
655 Z16, Z16, 0, 0,
'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'/',
656 Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'\\', 0, 0, 0,
657 0, 0,
'\b', 0, 0, 0,
'\f', 0, 0, 0, 0, 0, 0, 0,
'\n', 0,
658 0, 0,
'\r', 0,
'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
659 Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
672 if ((
sizeof(Ch) == 1 ||
unsigned(e) < 256) && escape[(
unsigned char)e]) {
673 os.Put(escape[(
unsigned char)e]);
676 unsigned codepoint = ParseHex4(is);
677 if (codepoint >= 0xD800 && codepoint <= 0xDBFF) {
679 if (is.Take() !=
'\\' || is.Take() !=
'u')
681 unsigned codepoint2 = ParseHex4(is);
682 if (codepoint2 < 0xDC00 || codepoint2 > 0xDFFF)
684 codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
686 TEncoding::Encode(os, codepoint);
698 else if ((
unsigned)c < 0x20)
709 inline double StrtodFastPath(
double significand,
int exp) {
716 return significand * internal::Pow10(exp);
718 return significand / internal::Pow10(-exp);
721 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
722 void ParseNumber(InputStream& is,
Handler& handler) {
723 internal::StreamLocalCopy<InputStream> copy(is);
724 InputStream& s(copy.s);
728 if (s.Peek() ==
'-') {
736 bool use64bit =
false;
737 if (s.Peek() ==
'0') {
741 else if (s.Peek() >=
'1' && s.Peek() <=
'9') {
742 i =
static_cast<unsigned>(s.Take() -
'0');
745 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
746 if (i >= 214748364) {
747 if (i != 214748364 || s.Peek() >
'8') {
753 i = i * 10 +
static_cast<unsigned>(s.Take() -
'0');
756 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
757 if (i >= 429496729) {
758 if (i != 429496729 || s.Peek() >
'5') {
764 i = i * 10 +
static_cast<unsigned>(s.Take() -
'0');
772 bool useDouble =
false;
775 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
782 i64 = i64 * 10 +
static_cast<unsigned>(s.Take() -
'0');
785 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
792 i64 = i64 * 10 +
static_cast<unsigned>(s.Take() -
'0');
798 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
799 d = d * 10 + (s.Take() -
'0');
805 if (s.Peek() ==
'.') {
814 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
818 i64 = i64 * 10 +
static_cast<unsigned>(s.Take() -
'0');
828 d = use64bit ? (double)i64 : (
double)i;
832 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
833 d = d * 10 + (s.Take() -
'0');
843 if (s.Peek() ==
'e' || s.Peek() ==
'E') {
845 d = use64bit ? (double)i64 : (
double)i;
850 bool expMinus =
false;
853 else if (s.Peek() ==
'-') {
858 if (s.Peek() >=
'0' && s.Peek() <=
'9') {
859 exp = s.Take() -
'0';
868 int maxExp = (expFrac + 2147483639) / 10;
870 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
871 exp = exp * 10 + (s.Take() -
'0');
873 while (s.Peek() >=
'0' && s.Peek() <=
'9')
879 int maxExp = 308 - expFrac;
880 while (s.Peek() >=
'0' && s.Peek() <=
'9') {
881 exp = exp * 10 + (s.Take() -
'0');
897 int expSum = exp + expFrac;
900 d = StrtodFastPath(d, exp);
901 d = StrtodFastPath(d, expFrac);
904 d = StrtodFastPath(d, expSum);
912 cont = handler.Double(minus ? -d : d);
917 cont = handler.Int64(-(int64_t)i64);
919 cont = handler.Uint64(i64);
923 cont = handler.Int(-(
int)i);
925 cont = handler.Uint(i);
933 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
934 void ParseValue(InputStream& is,
Handler& handler) {
936 case 'n': ParseNull <parseFlags>(is, handler);
break;
937 case 't': ParseTrue <parseFlags>(is, handler);
break;
938 case 'f': ParseFalse <parseFlags>(is, handler);
break;
939 case '"': ParseString<parseFlags>(is, handler);
break;
940 case '{': ParseObject<parseFlags>(is, handler);
break;
941 case '[': ParseArray <parseFlags>(is, handler);
break;
942 default : ParseNumber<parseFlags>(is, handler);
949 enum IterativeParsingState {
950 IterativeParsingStartState = 0,
951 IterativeParsingFinishState,
952 IterativeParsingErrorState,
955 IterativeParsingObjectInitialState,
956 IterativeParsingMemberKeyState,
957 IterativeParsingKeyValueDelimiterState,
958 IterativeParsingMemberValueState,
959 IterativeParsingMemberDelimiterState,
960 IterativeParsingObjectFinishState,
963 IterativeParsingArrayInitialState,
964 IterativeParsingElementState,
965 IterativeParsingElementDelimiterState,
966 IterativeParsingArrayFinishState,
969 IterativeParsingValueState,
971 cIterativeParsingStateCount
976 LeftBracketToken = 0,
979 LeftCurlyBracketToken,
980 RightCurlyBracketToken,
994 RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) {
997 #define N NumberToken 998 #define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N 1000 static const unsigned char tokenMap[256] = {
1003 N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N,
1004 N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N,
1006 N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N,
1007 N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N,
1008 N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N,
1009 N16, N16, N16, N16, N16, N16, N16, N16
1015 if (
sizeof(Ch) == 1 ||
unsigned(c) < 256)
1016 return (Token)tokenMap[(
unsigned char)c];
1021 RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
1023 static const char G[cIterativeParsingStateCount][kTokenCount] = {
1026 IterativeParsingArrayInitialState,
1027 IterativeParsingErrorState,
1028 IterativeParsingObjectInitialState,
1029 IterativeParsingErrorState,
1030 IterativeParsingErrorState,
1031 IterativeParsingErrorState,
1032 IterativeParsingValueState,
1033 IterativeParsingValueState,
1034 IterativeParsingValueState,
1035 IterativeParsingValueState,
1036 IterativeParsingValueState
1040 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1041 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1042 IterativeParsingErrorState
1046 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1047 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1048 IterativeParsingErrorState
1052 IterativeParsingErrorState,
1053 IterativeParsingErrorState,
1054 IterativeParsingErrorState,
1055 IterativeParsingObjectFinishState,
1056 IterativeParsingErrorState,
1057 IterativeParsingErrorState,
1058 IterativeParsingMemberKeyState,
1059 IterativeParsingErrorState,
1060 IterativeParsingErrorState,
1061 IterativeParsingErrorState,
1062 IterativeParsingErrorState
1066 IterativeParsingErrorState,
1067 IterativeParsingErrorState,
1068 IterativeParsingErrorState,
1069 IterativeParsingErrorState,
1070 IterativeParsingErrorState,
1071 IterativeParsingKeyValueDelimiterState,
1072 IterativeParsingErrorState,
1073 IterativeParsingErrorState,
1074 IterativeParsingErrorState,
1075 IterativeParsingErrorState,
1076 IterativeParsingErrorState
1080 IterativeParsingArrayInitialState,
1081 IterativeParsingErrorState,
1082 IterativeParsingObjectInitialState,
1083 IterativeParsingErrorState,
1084 IterativeParsingErrorState,
1085 IterativeParsingErrorState,
1086 IterativeParsingMemberValueState,
1087 IterativeParsingMemberValueState,
1088 IterativeParsingMemberValueState,
1089 IterativeParsingMemberValueState,
1090 IterativeParsingMemberValueState
1094 IterativeParsingErrorState,
1095 IterativeParsingErrorState,
1096 IterativeParsingErrorState,
1097 IterativeParsingObjectFinishState,
1098 IterativeParsingMemberDelimiterState,
1099 IterativeParsingErrorState,
1100 IterativeParsingErrorState,
1101 IterativeParsingErrorState,
1102 IterativeParsingErrorState,
1103 IterativeParsingErrorState,
1104 IterativeParsingErrorState
1108 IterativeParsingErrorState,
1109 IterativeParsingErrorState,
1110 IterativeParsingErrorState,
1111 IterativeParsingErrorState,
1112 IterativeParsingErrorState,
1113 IterativeParsingErrorState,
1114 IterativeParsingMemberKeyState,
1115 IterativeParsingErrorState,
1116 IterativeParsingErrorState,
1117 IterativeParsingErrorState,
1118 IterativeParsingErrorState
1122 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1123 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1124 IterativeParsingErrorState
1128 IterativeParsingArrayInitialState,
1129 IterativeParsingArrayFinishState,
1130 IterativeParsingObjectInitialState,
1131 IterativeParsingErrorState,
1132 IterativeParsingErrorState,
1133 IterativeParsingErrorState,
1134 IterativeParsingElementState,
1135 IterativeParsingElementState,
1136 IterativeParsingElementState,
1137 IterativeParsingElementState,
1138 IterativeParsingElementState
1142 IterativeParsingErrorState,
1143 IterativeParsingArrayFinishState,
1144 IterativeParsingErrorState,
1145 IterativeParsingErrorState,
1146 IterativeParsingElementDelimiterState,
1147 IterativeParsingErrorState,
1148 IterativeParsingErrorState,
1149 IterativeParsingErrorState,
1150 IterativeParsingErrorState,
1151 IterativeParsingErrorState,
1152 IterativeParsingErrorState
1156 IterativeParsingArrayInitialState,
1157 IterativeParsingErrorState,
1158 IterativeParsingObjectInitialState,
1159 IterativeParsingErrorState,
1160 IterativeParsingErrorState,
1161 IterativeParsingErrorState,
1162 IterativeParsingElementState,
1163 IterativeParsingElementState,
1164 IterativeParsingElementState,
1165 IterativeParsingElementState,
1166 IterativeParsingElementState
1170 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1171 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1172 IterativeParsingErrorState
1176 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1177 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1178 IterativeParsingErrorState
1182 return (IterativeParsingState)G[state][token];
1187 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1188 RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is,
Handler& handler) {
1190 case IterativeParsingStartState:
1192 return IterativeParsingErrorState;
1194 case IterativeParsingFinishState:
1197 case IterativeParsingErrorState:
1200 case IterativeParsingObjectInitialState:
1201 case IterativeParsingArrayInitialState:
1205 IterativeParsingState n = src;
1206 if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
1207 n = IterativeParsingElementState;
1208 else if (src == IterativeParsingKeyValueDelimiterState)
1209 n = IterativeParsingMemberValueState;
1211 *stack_.template Push<SizeType>(1) = n;
1213 *stack_.template Push<SizeType>(1) = 0;
1215 bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
1219 return IterativeParsingErrorState;
1227 case IterativeParsingMemberKeyState:
1228 ParseString<parseFlags>(is, handler,
true);
1229 if (HasParseError())
1230 return IterativeParsingErrorState;
1234 case IterativeParsingKeyValueDelimiterState:
1235 if (token == ColonToken) {
1240 return IterativeParsingErrorState;
1242 case IterativeParsingMemberValueState:
1244 ParseValue<parseFlags>(is, handler);
1245 if (HasParseError()) {
1246 return IterativeParsingErrorState;
1250 case IterativeParsingElementState:
1252 ParseValue<parseFlags>(is, handler);
1253 if (HasParseError()) {
1254 return IterativeParsingErrorState;
1258 case IterativeParsingMemberDelimiterState:
1259 case IterativeParsingElementDelimiterState:
1262 *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
1265 case IterativeParsingObjectFinishState:
1268 SizeType c = *stack_.template Pop<SizeType>(1);
1270 if (src == IterativeParsingMemberValueState)
1273 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1275 if (n == IterativeParsingStartState)
1276 n = IterativeParsingFinishState;
1278 bool hr = handler.EndObject(c);
1282 return IterativeParsingErrorState;
1290 case IterativeParsingArrayFinishState:
1293 SizeType c = *stack_.template Pop<SizeType>(1);
1295 if (src == IterativeParsingElementState)
1298 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1300 if (n == IterativeParsingStartState)
1301 n = IterativeParsingFinishState;
1303 bool hr = handler.EndArray(c);
1307 return IterativeParsingErrorState;
1315 case IterativeParsingValueState:
1317 ParseValue<parseFlags>(is, handler);
1318 if (HasParseError()) {
1319 return IterativeParsingErrorState;
1321 return IterativeParsingFinishState;
1325 return IterativeParsingErrorState;
1329 template <
typename InputStream>
1330 void HandleError(IterativeParsingState src, InputStream& is) {
1331 if (HasParseError()) {
1339 case IterativeParsingObjectInitialState:
1348 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1350 parseResult_.
Clear();
1351 ClearStackOnExit scope(*
this);
1352 IterativeParsingState state = IterativeParsingStartState;
1355 while (is.Peek() !=
'\0') {
1356 Token t = Tokenize(is.Peek());
1357 IterativeParsingState n = Predict(state, t);
1358 IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
1360 if (d == IterativeParsingErrorState) {
1361 HandleError(state, is);
1375 if (state != IterativeParsingFinishState)
1376 HandleError(state, is);
1378 return parseResult_;
1381 static const size_t kDefaultStackCapacity = 256;
1382 internal::Stack<StackAllocator> stack_;
1395 #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:132
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:383
Validate encoding of JSON strings.
Definition: reader.h:131
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:111
#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:364
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:427
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:372
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
Definition: reader.h:433
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:366
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:92
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:133
void SkipWhitespace(InputStream &is)
Skip the JSON white spaces in a stream.
Definition: reader.h:237
main RapidJSON namespace
Definition: rapidjson.h:241
Default parse flags. Non-destructive parsing. Text strings are decoded into allocated buffer...
Definition: reader.h:129
ParseFlag
Combination of parseFlags.
Definition: reader.h:128
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:171
Miss exponent in number.
Definition: error.h:85
common definitions and configuration
In-situ(destructive) parsing.
Definition: reader.h:130
ParseResult Parse(InputStream &is, Handler &handler)
Parse JSON text (with kParseDefaultFlags)
Definition: reader.h:422
UTF-8 encoding.
Definition: encodings.h:101
ParseErrorCode GetParseErrorCode() const
Get the ParseErrorCode of last parsing.
Definition: reader.h:430
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:1387
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