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';
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);
1203 if (HasParseError())
1204 return IterativeParsingErrorState;
1208 case IterativeParsingKeyValueDelimiterState:
1209 if (token == ColonToken) {
1214 return IterativeParsingErrorState;
1216 case IterativeParsingMemberValueState:
1218 ParseValue<parseFlags>(is, handler);
1219 if (HasParseError()) {
1220 return IterativeParsingErrorState;
1224 case IterativeParsingElementState:
1226 ParseValue<parseFlags>(is, handler);
1227 if (HasParseError()) {
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);
1292 if (HasParseError()) {
1293 return IterativeParsingErrorState;
1295 return IterativeParsingFinishState;
1299 return IterativeParsingErrorState;
1303 template <
typename InputStream>
1304 void HandleError(IterativeParsingState src, InputStream& is) {
1305 if (HasParseError()) {
1313 case IterativeParsingObjectInitialState:
1322 template <
unsigned parseFlags,
typename InputStream,
typename 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_;
1369 #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
ParseErrorCode GetParseErrorCode() const
Get the ParseErrorCode of last parsing.
Definition: reader.h:429
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
void Clear()
Reset error code.
Definition: error.h:127
Missing a comma or ']' after an array element.
Definition: error.h:75
bool HasParseError() const
Whether a parse error has occured in the last parsing.
Definition: reader.h:426
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
size_t GetErrorOffset() const
Get the position of last parsing error in input, 0 otherwise.
Definition: reader.h:432
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
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:1361
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