468 typedef typename SourceEncoding::Ch
Ch;
474 GenericReader(StackAllocator* stackAllocator = 0,
size_t stackCapacity = kDefaultStackCapacity) : stack_(stackAllocator, stackCapacity), parseResult_() {}
484 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
487 return IterativeParse<parseFlags>(is, handler);
489 parseResult_.Clear();
491 ClearStackOnExit scope(*
this);
493 SkipWhitespaceAndComments<parseFlags>(is);
494 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
498 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
501 ParseValue<parseFlags>(is, handler);
502 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
505 SkipWhitespaceAndComments<parseFlags>(is);
506 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
510 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
525 template <
typename InputStream,
typename Handler>
527 return Parse<kParseDefaultFlags>(is, handler);
540 void SetParseError(
ParseErrorCode code,
size_t offset) { parseResult_.Set(code, offset); }
544 GenericReader(
const GenericReader&);
545 GenericReader& operator=(
const GenericReader&);
547 void ClearStack() { stack_.Clear(); }
550 struct ClearStackOnExit {
551 explicit ClearStackOnExit(GenericReader& r) : r_(r) {}
552 ~ClearStackOnExit() { r_.ClearStack(); }
555 ClearStackOnExit(
const ClearStackOnExit&);
556 ClearStackOnExit& operator=(
const ClearStackOnExit&);
559 template<
unsigned parseFlags,
typename InputStream>
560 void SkipWhitespaceAndComments(InputStream& is) {
563 if (parseFlags & kParseCommentsFlag) {
565 if (Consume(is,
'*')) {
569 else if (Consume(is,
'*')) {
570 if (Consume(is,
'/'))
578 while (is.Peek() !=
'\0' && is.Take() !=
'\n');
588 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
589 void ParseObject(InputStream& is,
Handler& handler) {
596 SkipWhitespaceAndComments<parseFlags>(is);
597 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
599 if (Consume(is,
'}')) {
605 for (SizeType memberCount = 0;;) {
609 ParseString<parseFlags>(is, handler,
true);
610 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
612 SkipWhitespaceAndComments<parseFlags>(is);
613 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
618 SkipWhitespaceAndComments<parseFlags>(is);
619 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
621 ParseValue<parseFlags>(is, handler);
622 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
624 SkipWhitespaceAndComments<parseFlags>(is);
625 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
632 SkipWhitespaceAndComments<parseFlags>(is);
633 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
644 if (parseFlags & kParseTrailingCommasFlag) {
645 if (is.Peek() ==
'}') {
656 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
657 void ParseArray(InputStream& is,
Handler& handler) {
664 SkipWhitespaceAndComments<parseFlags>(is);
665 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
667 if (Consume(is,
']')) {
673 for (SizeType elementCount = 0;;) {
674 ParseValue<parseFlags>(is, handler);
675 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
678 SkipWhitespaceAndComments<parseFlags>(is);
679 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
681 if (Consume(is,
',')) {
682 SkipWhitespaceAndComments<parseFlags>(is);
683 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
685 else if (Consume(is,
']')) {
693 if (parseFlags & kParseTrailingCommasFlag) {
694 if (is.Peek() ==
']') {
704 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
705 void ParseNull(InputStream& is,
Handler& handler) {
709 if (
RAPIDJSON_LIKELY(Consume(is,
'u') && Consume(is,
'l') && Consume(is,
'l'))) {
717 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
718 void ParseTrue(InputStream& is,
Handler& handler) {
722 if (
RAPIDJSON_LIKELY(Consume(is,
'r') && Consume(is,
'u') && Consume(is,
'e'))) {
730 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
731 void ParseFalse(InputStream& is,
Handler& handler) {
735 if (
RAPIDJSON_LIKELY(Consume(is,
'a') && Consume(is,
'l') && Consume(is,
's') && Consume(is,
'e'))) {
743 template<
typename InputStream>
744 RAPIDJSON_FORCEINLINE
static bool Consume(InputStream& is,
typename InputStream::Ch expect) {
754 template<
typename InputStream>
755 unsigned ParseHex4(InputStream& is,
size_t escapeOffset) {
756 unsigned codepoint = 0;
757 for (
int i = 0; i < 4; i++) {
760 codepoint +=
static_cast<unsigned>(c);
761 if (c >=
'0' && c <=
'9')
763 else if (c >=
'A' && c <=
'F')
764 codepoint -=
'A' - 10;
765 else if (c >=
'a' && c <=
'f')
766 codepoint -=
'a' - 10;
769 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
776 template <
typename CharType>
781 StackStream(internal::Stack<StackAllocator>& stack) : stack_(stack), length_(0) {}
782 RAPIDJSON_FORCEINLINE
void Put(Ch c) {
783 *stack_.template Push<Ch>() = c;
787 RAPIDJSON_FORCEINLINE
void* Push(SizeType count) {
789 return stack_.template Push<Ch>(count);
792 size_t Length()
const {
return length_; }
795 return stack_.template Pop<Ch>(length_);
799 StackStream(
const StackStream&);
800 StackStream& operator=(
const StackStream&);
802 internal::Stack<StackAllocator>& stack_;
807 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
808 void ParseString(InputStream& is,
Handler& handler,
bool isKey =
false) {
809 internal::StreamLocalCopy<InputStream> copy(is);
810 InputStream& s(copy.s);
815 bool success =
false;
816 if (parseFlags & kParseInsituFlag) {
817 typename InputStream::Ch *head = s.PutBegin();
818 ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
819 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
820 size_t length = s.PutEnd(head) - 1;
822 const typename TargetEncoding::Ch*
const str =
reinterpret_cast<typename TargetEncoding::Ch*
>(head);
823 success = (isKey ? handler.Key(str,
SizeType(length),
false) : handler.String(str,
SizeType(length),
false));
826 StackStream<typename TargetEncoding::Ch> stackStream(stack_);
827 ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
828 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
830 const typename TargetEncoding::Ch*
const str = stackStream.Pop();
831 success = (isKey ? handler.Key(str, length,
true) : handler.String(str, length,
true));
839 template<
unsigned parseFlags,
typename SEncoding,
typename TEncoding,
typename InputStream,
typename OutputStream>
840 RAPIDJSON_FORCEINLINE
void ParseStringToStream(InputStream& is, OutputStream& os) {
842#define Z16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
843 static const char escape[256] = {
844 Z16, Z16, 0, 0,
'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'/',
845 Z16, Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'\\', 0, 0, 0,
846 0, 0,
'\b', 0, 0, 0,
'\f', 0, 0, 0, 0, 0, 0, 0,
'\n', 0,
847 0, 0,
'\r', 0,
'\t', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
848 Z16, Z16, Z16, Z16, Z16, Z16, Z16, Z16
855 if (!(parseFlags & kParseValidateEncodingFlag))
856 ScanCopyUnescapedString(is, os);
860 size_t escapeOffset = is.Tell();
863 if ((
sizeof(Ch) == 1 ||
unsigned(e) < 256) &&
RAPIDJSON_LIKELY(escape[
static_cast<unsigned char>(e)])) {
865 os.Put(
static_cast<typename TEncoding::Ch
>(escape[
static_cast<unsigned char>(e)]));
869 unsigned codepoint = ParseHex4(is, escapeOffset);
870 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
875 unsigned codepoint2 = ParseHex4(is, escapeOffset);
876 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
879 codepoint = (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
881 TEncoding::Encode(os, codepoint);
898 size_t offset = is.Tell();
900 !Transcoder<SEncoding, TEncoding>::Validate(is, os) :
901 !Transcoder<SEncoding, TEncoding>::Transcode(is, os))))
907 template<
typename InputStream,
typename OutputStream>
908 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(InputStream&, OutputStream&) {
912#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42)
914 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(StringStream& is, StackStream<char>& os) {
915 const char* p = is.src_;
918 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
919 while (p != nextAligned)
928 static const char dquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"' };
929 static const char bslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\' };
930 static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
931 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&dquote[0]));
932 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&bslash[0]));
933 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&space[0]));
936 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i *
>(p));
937 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
938 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
939 const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
940 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
941 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
945 unsigned long offset;
946 _BitScanForward(&offset, r);
949 length =
static_cast<SizeType>(__builtin_ffs(r) - 1);
951 char* q =
reinterpret_cast<char*
>(os.Push(length));
952 for (
size_t i = 0; i < length; i++)
958 _mm_storeu_si128(
reinterpret_cast<__m128i *
>(os.Push(16)), s);
965 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(InsituStringStream& is, InsituStringStream& os) {
969 if (is.src_ == is.dst_) {
970 SkipUnescapedString(is);
978 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
979 while (p != nextAligned)
989 static const char dquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"' };
990 static const char bslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\' };
991 static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
992 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&dquote[0]));
993 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&bslash[0]));
994 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&space[0]));
996 for (;; p += 16, q += 16) {
997 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i *
>(p));
998 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
999 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1000 const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1001 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1002 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1006 unsigned long offset;
1007 _BitScanForward(&offset, r);
1010 length =
static_cast<size_t>(__builtin_ffs(r) - 1);
1012 for (
const char* pend = p + length; p != pend; )
1016 _mm_storeu_si128(
reinterpret_cast<__m128i *
>(q), s);
1024 static RAPIDJSON_FORCEINLINE
void SkipUnescapedString(InsituStringStream& is) {
1029 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
static_cast<size_t>(~15));
1030 for (; p != nextAligned; p++)
1032 is.src_ = is.dst_ = p;
1037 static const char dquote[16] = {
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"',
'\"' };
1038 static const char bslash[16] = {
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\',
'\\' };
1039 static const char space[16] = { 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19 };
1040 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&dquote[0]));
1041 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&bslash[0]));
1042 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i *
>(&space[0]));
1045 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i *
>(p));
1046 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
1047 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1048 const __m128i t3 = _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1049 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1050 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1054 unsigned long offset;
1055 _BitScanForward(&offset, r);
1058 length =
static_cast<size_t>(__builtin_ffs(r) - 1);
1065 is.src_ = is.dst_ = p;
1069 template<
typename InputStream,
bool backup,
bool pushOnTake>
1072 template<
typename InputStream>
1073 class NumberStream<InputStream, false, false> {
1075 typedef typename InputStream::Ch Ch;
1077 NumberStream(GenericReader& reader, InputStream& s) : is(s) { (void)reader; }
1080 RAPIDJSON_FORCEINLINE Ch Peek()
const {
return is.Peek(); }
1081 RAPIDJSON_FORCEINLINE Ch TakePush() {
return is.Take(); }
1082 RAPIDJSON_FORCEINLINE Ch Take() {
return is.Take(); }
1083 RAPIDJSON_FORCEINLINE
void Push(
char) {}
1085 size_t Tell() {
return is.Tell(); }
1086 size_t Length() {
return 0; }
1087 const char* Pop() {
return 0; }
1090 NumberStream& operator=(
const NumberStream&);
1095 template<
typename InputStream>
1096 class NumberStream<InputStream, true, false> :
public NumberStream<InputStream, false, false> {
1097 typedef NumberStream<InputStream, false, false> Base;
1099 NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is), stackStream(reader.stack_) {}
1102 RAPIDJSON_FORCEINLINE Ch TakePush() {
1103 stackStream.Put(
static_cast<char>(Base::is.Peek()));
1104 return Base::is.Take();
1107 RAPIDJSON_FORCEINLINE
void Push(
char c) {
1111 size_t Length() {
return stackStream.Length(); }
1114 stackStream.Put(
'\0');
1115 return stackStream.Pop();
1119 StackStream<char> stackStream;
1122 template<
typename InputStream>
1123 class NumberStream<InputStream, true, true> :
public NumberStream<InputStream, true, false> {
1124 typedef NumberStream<InputStream, true, false> Base;
1126 NumberStream(GenericReader& reader, InputStream& is) : Base(reader, is) {}
1129 RAPIDJSON_FORCEINLINE Ch Take() {
return Base::TakePush(); }
1132 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
1133 void ParseNumber(InputStream& is,
Handler& handler) {
1134 internal::StreamLocalCopy<InputStream> copy(is);
1135 NumberStream<InputStream,
1137 ((parseFlags & kParseInsituFlag) == 0) :
1139 (parseFlags & kParseNumbersAsStringsFlag) != 0 &&
1142 size_t startOffset = s.Tell();
1144 bool useNanOrInf =
false;
1147 bool minus = Consume(s,
'-');
1152 bool use64bit =
false;
1153 int significandDigit = 0;
1159 i =
static_cast<unsigned>(s.TakePush() -
'0');
1170 i = i * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1182 i = i * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1187 else if ((parseFlags & kParseNanAndInfFlag) &&
RAPIDJSON_LIKELY((s.Peek() ==
'I' || s.Peek() ==
'N'))) {
1189 if (
RAPIDJSON_LIKELY(Consume(s,
'N') && Consume(s,
'a') && Consume(s,
'N'))) {
1190 d = std::numeric_limits<double>::quiet_NaN();
1192 else if (
RAPIDJSON_LIKELY(Consume(s,
'I') && Consume(s,
'n') && Consume(s,
'f'))) {
1193 d = (minus ? -std::numeric_limits<double>::infinity() : std::numeric_limits<double>::infinity());
1195 && Consume(s,
'i') && Consume(s,
't') && Consume(s,
'y'))))
1205 bool useDouble =
false;
1211 d =
static_cast<double>(i64);
1215 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1222 d =
static_cast<double>(i64);
1226 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1236 d = d * 10 + (s.TakePush() -
'0');
1242 size_t decimalPosition;
1243 if (Consume(s,
'.')) {
1244 decimalPosition = s.Length();
1259 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1266 d =
static_cast<double>(i64);
1269 d =
static_cast<double>(use64bit ? i64 : i);
1275 if (significandDigit < 17) {
1276 d = d * 10.0 + (s.TakePush() -
'0');
1286 decimalPosition = s.Length();
1290 if (Consume(s,
'e') || Consume(s,
'E')) {
1292 d =
static_cast<double>(use64bit ? i64 : i);
1296 bool expMinus =
false;
1297 if (Consume(s,
'+'))
1299 else if (Consume(s,
'-'))
1303 exp =
static_cast<int>(s.Take() -
'0');
1312 int maxExp = (expFrac + 2147483639) / 10;
1315 exp = exp * 10 +
static_cast<int>(s.Take() -
'0');
1323 int maxExp = 308 - expFrac;
1325 exp = exp * 10 +
static_cast<int>(s.Take() -
'0');
1341 if (parseFlags & kParseNumbersAsStringsFlag) {
1342 if (parseFlags & kParseInsituFlag) {
1344 typename InputStream::Ch* head = is.PutBegin();
1345 const size_t length = s.Tell() - startOffset;
1348 const typename TargetEncoding::Ch*
const str =
reinterpret_cast<typename TargetEncoding::Ch*
>(head);
1349 cont = handler.RawNumber(str,
SizeType(length),
false);
1354 StackStream<typename TargetEncoding::Ch> dstStream(stack_);
1355 while (numCharsToCopy--) {
1356 Transcoder<UTF8<>, TargetEncoding>::Transcode(srcStream, dstStream);
1358 dstStream.Put(
'\0');
1359 const typename TargetEncoding::Ch* str = dstStream.Pop();
1361 cont = handler.RawNumber(str,
SizeType(length),
true);
1365 size_t length = s.Length();
1366 const char* decimal = s.Pop();
1369 int p = exp + expFrac;
1370 if (parseFlags & kParseFullPrecisionFlag)
1371 d = internal::StrtodFullPrecision(d, p, decimal, length, decimalPosition, exp);
1373 d = internal::StrtodNormalPrecision(d, p);
1375 cont = handler.Double(minus ? -d : d);
1377 else if (useNanOrInf) {
1378 cont = handler.Double(d);
1383 cont = handler.Int64(
static_cast<int64_t
>(~i64 + 1));
1385 cont = handler.Uint64(i64);
1389 cont = handler.Int(
static_cast<int32_t
>(~i + 1));
1391 cont = handler.Uint(i);
1400 template<
unsigned parseFlags,
typename InputStream,
typename Handler>
1401 void ParseValue(InputStream& is,
Handler& handler) {
1402 switch (is.Peek()) {
1403 case 'n': ParseNull <parseFlags>(is, handler);
break;
1404 case 't': ParseTrue <parseFlags>(is, handler);
break;
1405 case 'f': ParseFalse <parseFlags>(is, handler);
break;
1406 case '"': ParseString<parseFlags>(is, handler);
break;
1407 case '{': ParseObject<parseFlags>(is, handler);
break;
1408 case '[': ParseArray <parseFlags>(is, handler);
break;
1410 ParseNumber<parseFlags>(is, handler);
1419 enum IterativeParsingState {
1420 IterativeParsingStartState = 0,
1421 IterativeParsingFinishState,
1422 IterativeParsingErrorState,
1425 IterativeParsingObjectInitialState,
1426 IterativeParsingMemberKeyState,
1427 IterativeParsingKeyValueDelimiterState,
1428 IterativeParsingMemberValueState,
1429 IterativeParsingMemberDelimiterState,
1430 IterativeParsingObjectFinishState,
1433 IterativeParsingArrayInitialState,
1434 IterativeParsingElementState,
1435 IterativeParsingElementDelimiterState,
1436 IterativeParsingArrayFinishState,
1439 IterativeParsingValueState
1442 enum { cIterativeParsingStateCount = IterativeParsingValueState + 1 };
1446 LeftBracketToken = 0,
1449 LeftCurlyBracketToken,
1450 RightCurlyBracketToken,
1464 RAPIDJSON_FORCEINLINE Token Tokenize(Ch c) {
1467#define N NumberToken
1468#define N16 N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N
1470 static const unsigned char tokenMap[256] = {
1473 N, N, StringToken, N, N, N, N, N, N, N, N, N, CommaToken, N, N, N,
1474 N, N, N, N, N, N, N, N, N, N, ColonToken, N, N, N, N, N,
1476 N, N, N, N, N, N, N, N, N, N, N, LeftBracketToken, N, RightBracketToken, N, N,
1477 N, N, N, N, N, N, FalseToken, N, N, N, N, N, N, N, NullToken, N,
1478 N, N, N, N, TrueToken, N, N, N, N, N, N, LeftCurlyBracketToken, N, RightCurlyBracketToken, N, N,
1479 N16, N16, N16, N16, N16, N16, N16, N16
1485 if (
sizeof(Ch) == 1 ||
static_cast<unsigned>(c) < 256)
1486 return static_cast<Token
>(tokenMap[
static_cast<unsigned char>(c)]);
1491 RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state, Token token) {
1493 static const char G[cIterativeParsingStateCount][kTokenCount] = {
1496 IterativeParsingArrayInitialState,
1497 IterativeParsingErrorState,
1498 IterativeParsingObjectInitialState,
1499 IterativeParsingErrorState,
1500 IterativeParsingErrorState,
1501 IterativeParsingErrorState,
1502 IterativeParsingValueState,
1503 IterativeParsingValueState,
1504 IterativeParsingValueState,
1505 IterativeParsingValueState,
1506 IterativeParsingValueState
1510 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1511 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1512 IterativeParsingErrorState
1516 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1517 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1518 IterativeParsingErrorState
1522 IterativeParsingErrorState,
1523 IterativeParsingErrorState,
1524 IterativeParsingErrorState,
1525 IterativeParsingObjectFinishState,
1526 IterativeParsingErrorState,
1527 IterativeParsingErrorState,
1528 IterativeParsingMemberKeyState,
1529 IterativeParsingErrorState,
1530 IterativeParsingErrorState,
1531 IterativeParsingErrorState,
1532 IterativeParsingErrorState
1536 IterativeParsingErrorState,
1537 IterativeParsingErrorState,
1538 IterativeParsingErrorState,
1539 IterativeParsingErrorState,
1540 IterativeParsingErrorState,
1541 IterativeParsingKeyValueDelimiterState,
1542 IterativeParsingErrorState,
1543 IterativeParsingErrorState,
1544 IterativeParsingErrorState,
1545 IterativeParsingErrorState,
1546 IterativeParsingErrorState
1550 IterativeParsingArrayInitialState,
1551 IterativeParsingErrorState,
1552 IterativeParsingObjectInitialState,
1553 IterativeParsingErrorState,
1554 IterativeParsingErrorState,
1555 IterativeParsingErrorState,
1556 IterativeParsingMemberValueState,
1557 IterativeParsingMemberValueState,
1558 IterativeParsingMemberValueState,
1559 IterativeParsingMemberValueState,
1560 IterativeParsingMemberValueState
1564 IterativeParsingErrorState,
1565 IterativeParsingErrorState,
1566 IterativeParsingErrorState,
1567 IterativeParsingObjectFinishState,
1568 IterativeParsingMemberDelimiterState,
1569 IterativeParsingErrorState,
1570 IterativeParsingErrorState,
1571 IterativeParsingErrorState,
1572 IterativeParsingErrorState,
1573 IterativeParsingErrorState,
1574 IterativeParsingErrorState
1578 IterativeParsingErrorState,
1579 IterativeParsingErrorState,
1580 IterativeParsingErrorState,
1581 IterativeParsingObjectFinishState,
1582 IterativeParsingErrorState,
1583 IterativeParsingErrorState,
1584 IterativeParsingMemberKeyState,
1585 IterativeParsingErrorState,
1586 IterativeParsingErrorState,
1587 IterativeParsingErrorState,
1588 IterativeParsingErrorState
1592 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1593 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1594 IterativeParsingErrorState
1598 IterativeParsingArrayInitialState,
1599 IterativeParsingArrayFinishState,
1600 IterativeParsingObjectInitialState,
1601 IterativeParsingErrorState,
1602 IterativeParsingErrorState,
1603 IterativeParsingErrorState,
1604 IterativeParsingElementState,
1605 IterativeParsingElementState,
1606 IterativeParsingElementState,
1607 IterativeParsingElementState,
1608 IterativeParsingElementState
1612 IterativeParsingErrorState,
1613 IterativeParsingArrayFinishState,
1614 IterativeParsingErrorState,
1615 IterativeParsingErrorState,
1616 IterativeParsingElementDelimiterState,
1617 IterativeParsingErrorState,
1618 IterativeParsingErrorState,
1619 IterativeParsingErrorState,
1620 IterativeParsingErrorState,
1621 IterativeParsingErrorState,
1622 IterativeParsingErrorState
1626 IterativeParsingArrayInitialState,
1627 IterativeParsingArrayFinishState,
1628 IterativeParsingObjectInitialState,
1629 IterativeParsingErrorState,
1630 IterativeParsingErrorState,
1631 IterativeParsingErrorState,
1632 IterativeParsingElementState,
1633 IterativeParsingElementState,
1634 IterativeParsingElementState,
1635 IterativeParsingElementState,
1636 IterativeParsingElementState
1640 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1641 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1642 IterativeParsingErrorState
1646 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1647 IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState, IterativeParsingErrorState,
1648 IterativeParsingErrorState
1652 return static_cast<IterativeParsingState
>(G[state][token]);
1657 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1658 RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is,
Handler& handler) {
1662 case IterativeParsingErrorState:
1665 case IterativeParsingObjectInitialState:
1666 case IterativeParsingArrayInitialState:
1670 IterativeParsingState n = src;
1671 if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState)
1672 n = IterativeParsingElementState;
1673 else if (src == IterativeParsingKeyValueDelimiterState)
1674 n = IterativeParsingMemberValueState;
1676 *stack_.template Push<SizeType>(1) = n;
1678 *stack_.template Push<SizeType>(1) = 0;
1680 bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray();
1684 return IterativeParsingErrorState;
1692 case IterativeParsingMemberKeyState:
1693 ParseString<parseFlags>(is, handler,
true);
1694 if (HasParseError())
1695 return IterativeParsingErrorState;
1699 case IterativeParsingKeyValueDelimiterState:
1704 case IterativeParsingMemberValueState:
1706 ParseValue<parseFlags>(is, handler);
1707 if (HasParseError()) {
1708 return IterativeParsingErrorState;
1712 case IterativeParsingElementState:
1714 ParseValue<parseFlags>(is, handler);
1715 if (HasParseError()) {
1716 return IterativeParsingErrorState;
1720 case IterativeParsingMemberDelimiterState:
1721 case IterativeParsingElementDelimiterState:
1724 *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
1727 case IterativeParsingObjectFinishState:
1730 if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingMemberDelimiterState) {
1732 return IterativeParsingErrorState;
1735 SizeType c = *stack_.template Pop<SizeType>(1);
1737 if (src == IterativeParsingMemberValueState)
1740 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1742 if (n == IterativeParsingStartState)
1743 n = IterativeParsingFinishState;
1745 bool hr = handler.EndObject(c);
1749 return IterativeParsingErrorState;
1757 case IterativeParsingArrayFinishState:
1760 if (!(parseFlags & kParseTrailingCommasFlag) && src == IterativeParsingElementDelimiterState) {
1762 return IterativeParsingErrorState;
1765 SizeType c = *stack_.template Pop<SizeType>(1);
1767 if (src == IterativeParsingElementState)
1770 IterativeParsingState n =
static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
1772 if (n == IterativeParsingStartState)
1773 n = IterativeParsingFinishState;
1775 bool hr = handler.EndArray(c);
1779 return IterativeParsingErrorState;
1801 ParseValue<parseFlags>(is, handler);
1802 if (HasParseError()) {
1803 return IterativeParsingErrorState;
1805 return IterativeParsingFinishState;
1809 template <
typename InputStream>
1810 void HandleError(IterativeParsingState src, InputStream& is) {
1811 if (HasParseError()) {
1817 case IterativeParsingStartState:
RAPIDJSON_PARSE_ERROR(kParseErrorDocumentEmpty, is.Tell());
return;
1818 case IterativeParsingFinishState:
RAPIDJSON_PARSE_ERROR(kParseErrorDocumentRootNotSingular, is.Tell());
return;
1819 case IterativeParsingObjectInitialState:
1820 case IterativeParsingMemberDelimiterState:
RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell());
return;
1821 case IterativeParsingMemberKeyState:
RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissColon, is.Tell());
return;
1822 case IterativeParsingMemberValueState:
RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, is.Tell());
return;
1823 case IterativeParsingKeyValueDelimiterState:
1824 case IterativeParsingArrayInitialState:
1825 case IterativeParsingElementDelimiterState:
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell());
return;
1830 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1831 ParseResult IterativeParse(InputStream& is,
Handler& handler) {
1832 parseResult_.Clear();
1833 ClearStackOnExit scope(*
this);
1834 IterativeParsingState state = IterativeParsingStartState;
1836 SkipWhitespaceAndComments<parseFlags>(is);
1837 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
1838 while (is.Peek() !=
'\0') {
1839 Token t = Tokenize(is.Peek());
1840 IterativeParsingState n = Predict(state, t);
1841 IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
1843 if (d == IterativeParsingErrorState) {
1844 HandleError(state, is);
1851 if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState)
1854 SkipWhitespaceAndComments<parseFlags>(is);
1855 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
1859 if (state != IterativeParsingFinishState)
1860 HandleError(state, is);
1862 return parseResult_;
1865 static const size_t kDefaultStackCapacity = 256;
1866 internal::Stack<StackAllocator> stack_;
1867 ParseResult parseResult_;