606 typedef typename SourceEncoding::Ch
Ch;
613 GenericReader(StackAllocator* stackAllocator = 0,
size_t stackCapacity = kDefaultStackCapacity)
614 : stack_(stackAllocator, stackCapacity), parseResult_(), state_(IterativeParsingStartState)
626 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
630 return IterativeParse<parseFlags>(is, handler);
632 parseResult_.Clear();
634 ClearStackOnExit scope(*
this);
636 SkipWhitespaceAndComments<parseFlags>(is);
637 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
642 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
646 ParseValue<parseFlags>(is, handler);
647 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
651 SkipWhitespaceAndComments<parseFlags>(is);
652 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
657 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
672 template <
typename InputStream,
typename Handler>
683 parseResult_.Clear();
684 state_ = IterativeParsingStartState;
694 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
699 SkipWhitespaceAndComments<parseFlags>(is);
701 Token t = Tokenize(is.Peek());
702 IterativeParsingState n = Predict(state_, t);
703 IterativeParsingState d = Transit<parseFlags>(state_, t, n, is, handler);
709 if(d == IterativeParsingErrorState)
711 HandleError(state_, is);
723 SkipWhitespaceAndComments<parseFlags>(is);
724 if(is.Peek() !=
'\0')
727 HandleError(state_, is);
741 if(!IsIterativeParsingDelimiterState(n))
748 if(state_ != IterativeParsingFinishState)
750 HandleError(state_, is);
762 return IsIterativeParsingCompleteState(state_);
782 void ClearStack() { stack_.
Clear(); }
785 struct ClearStackOnExit
788 ~ClearStackOnExit() { r_.ClearStack(); }
792 ClearStackOnExit(
const ClearStackOnExit&);
793 ClearStackOnExit& operator=(
const ClearStackOnExit&);
796 template <
unsigned parseFlags,
typename InputStream>
797 void SkipWhitespaceAndComments(InputStream& is)
811 else if(Consume(is,
'*'))
821 while(is.Peek() !=
'\0' && is.Take() !=
'\n') {}
831 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
832 void ParseObject(InputStream& is, Handler& handler)
840 SkipWhitespaceAndComments<parseFlags>(is);
841 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
855 ParseString<parseFlags>(is, handler,
true);
856 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
858 SkipWhitespaceAndComments<parseFlags>(is);
859 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
864 SkipWhitespaceAndComments<parseFlags>(is);
865 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
867 ParseValue<parseFlags>(is, handler);
868 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
870 SkipWhitespaceAndComments<parseFlags>(is);
871 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
879 SkipWhitespaceAndComments<parseFlags>(is);
880 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
906 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
907 void ParseArray(InputStream& is, Handler& handler)
915 SkipWhitespaceAndComments<parseFlags>(is);
916 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
927 ParseValue<parseFlags>(is, handler);
928 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
931 SkipWhitespaceAndComments<parseFlags>(is);
932 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
936 SkipWhitespaceAndComments<parseFlags>(is);
937 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
939 else if(Consume(is,
']'))
961 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
962 void ParseNull(InputStream& is, Handler& handler)
967 if(
RAPIDJSON_LIKELY(Consume(is,
'u') && Consume(is,
'l') && Consume(is,
'l')))
976 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
977 void ParseTrue(InputStream& is, Handler& handler)
982 if(
RAPIDJSON_LIKELY(Consume(is,
'r') && Consume(is,
'u') && Consume(is,
'e')))
991 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
992 void ParseFalse(InputStream& is, Handler& handler)
997 if(
RAPIDJSON_LIKELY(Consume(is,
'a') && Consume(is,
'l') && Consume(is,
's') &&
1007 template <
typename InputStream>
1008 RAPIDJSON_FORCEINLINE
static bool Consume(InputStream& is,
typename InputStream::Ch expect)
1020 template <
typename InputStream>
1021 unsigned ParseHex4(InputStream& is,
size_t escapeOffset)
1023 unsigned codepoint = 0;
1024 for(
int i = 0; i < 4; i++)
1028 codepoint +=
static_cast<unsigned>(c);
1029 if(c >=
'0' && c <=
'9')
1031 else if(c >=
'A' && c <=
'F')
1032 codepoint -=
'A' - 10;
1033 else if(c >=
'a' && c <=
'f')
1034 codepoint -=
'a' - 10;
1039 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(0);
1046 template <
typename CharType>
1050 typedef CharType Ch;
1052 StackStream(internal::Stack<StackAllocator>& stack) : stack_(stack), length_(0) {}
1053 RAPIDJSON_FORCEINLINE
void Put(Ch c)
1055 *stack_.template Push<Ch>() = c;
1059 RAPIDJSON_FORCEINLINE
void* Push(
SizeType count)
1062 return stack_.template Push<Ch>(count);
1065 size_t Length()
const {
return length_; }
1067 Ch* Pop() {
return stack_.template Pop<Ch>(length_); }
1070 StackStream(
const StackStream&);
1071 StackStream& operator=(
const StackStream&);
1073 internal::Stack<StackAllocator>& stack_;
1078 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1079 void ParseString(InputStream& is, Handler& handler,
bool isKey =
false)
1081 internal::StreamLocalCopy<InputStream>
copy(is);
1082 InputStream& s(
copy.s);
1087 bool success =
false;
1090 typename InputStream::Ch* head = s.PutBegin();
1091 ParseStringToStream<parseFlags, SourceEncoding, SourceEncoding>(s, s);
1092 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
1093 size_t length = s.PutEnd(head) - 1;
1095 const typename TargetEncoding::Ch*
const str =
1096 reinterpret_cast<typename TargetEncoding::Ch*
>(head);
1097 success = (isKey ? handler.Key(str,
SizeType(length),
false)
1098 : handler.String(str,
SizeType(length),
false));
1102 StackStream<typename TargetEncoding::Ch> stackStream(stack_);
1103 ParseStringToStream<parseFlags, SourceEncoding, TargetEncoding>(s, stackStream);
1104 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
1106 const typename TargetEncoding::Ch*
const str = stackStream.Pop();
1107 success = (isKey ? handler.Key(str, length,
true) : handler.String(str, length,
true));
1116 template <
unsigned parseFlags,
1119 typename InputStream,
1120 typename OutputStream>
1121 RAPIDJSON_FORCEINLINE
void ParseStringToStream(InputStream& is, OutputStream& os)
1124#define Z16 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1125 static const char escape[256] = {
1126 Z16,
Z16, 0, 0,
'\"', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'/',
Z16,
1127 Z16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'\\', 0, 0, 0, 0, 0,
1128 '\b', 0, 0, 0,
'\f', 0, 0, 0, 0, 0, 0, 0,
'\n', 0, 0, 0,
'\r', 0,
'\t',
1129 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Z16,
Z16,
Z16,
Z16,
Z16,
Z16,
Z16,
Z16};
1137 ScanCopyUnescapedString(is, os);
1142 size_t escapeOffset =
1146 if((
sizeof(
Ch) == 1 ||
unsigned(e) < 256) &&
1151 static_cast<typename TEncoding::Ch
>(escape[
static_cast<unsigned char>(e)]));
1161 unsigned codepoint = ParseHex4(is, escapeOffset);
1162 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
1172 unsigned codepoint2 = ParseHex4(is, escapeOffset);
1173 RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID;
1178 (((codepoint - 0xD800) << 10) | (codepoint2 - 0xDC00)) + 0x10000;
1187 TEncoding::Encode(os, codepoint);
1207 size_t offset = is.Tell();
1216 template <
typename InputStream,
typename OutputStream>
1217 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(InputStream&, OutputStream&)
1222#if defined(RAPIDJSON_SSE2) || defined(RAPIDJSON_SSE42)
1224 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(
StringStream& is,
1225 StackStream<char>& os)
1227 const char* p = is.
src_;
1230 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1231 static_cast<size_t>(~15));
1232 while(p != nextAligned)
1243 static const char dquote[16] = {
'\"',
1259 static const char bslash[16] = {
'\\',
1275 static const char space[16] = {0x1F,
1291 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&dquote[0]));
1292 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&bslash[0]));
1293 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&space[0]));
1297 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i*
>(p));
1298 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
1299 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1301 _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1302 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1303 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1309 _BitScanForward(&offset, r);
1312 length =
static_cast<SizeType>(__builtin_ffs(r) - 1);
1316 char* q =
reinterpret_cast<char*
>(os.Push(length));
1317 for(
size_t i = 0; i < length; i++)
1324 _mm_storeu_si128(
reinterpret_cast<__m128i*
>(os.Push(16)), s);
1339 SkipUnescapedString(is);
1347 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1348 static_cast<size_t>(~15));
1349 while(p != nextAligned)
1361 static const char dquote[16] = {
'\"',
1377 static const char bslash[16] = {
'\\',
1393 static const char space[16] = {0x1F,
1409 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&dquote[0]));
1410 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&bslash[0]));
1411 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&space[0]));
1413 for(;; p += 16, q += 16)
1415 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i*
>(p));
1416 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
1417 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1419 _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1420 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1421 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1427 _BitScanForward(&offset, r);
1430 length =
static_cast<size_t>(__builtin_ffs(r) - 1);
1432 for(
const char* pend = p + length; p != pend;)
1436 _mm_storeu_si128(
reinterpret_cast<__m128i*
>(q), s);
1450 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1451 static_cast<size_t>(~15));
1452 for(; p != nextAligned; p++)
1461 static const char dquote[16] = {
'\"',
1477 static const char bslash[16] = {
'\\',
1493 static const char space[16] = {0x1F,
1509 const __m128i dq = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&dquote[0]));
1510 const __m128i bs = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&bslash[0]));
1511 const __m128i sp = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(&space[0]));
1515 const __m128i s = _mm_load_si128(
reinterpret_cast<const __m128i*
>(p));
1516 const __m128i t1 = _mm_cmpeq_epi8(s, dq);
1517 const __m128i t2 = _mm_cmpeq_epi8(s, bs);
1519 _mm_cmpeq_epi8(_mm_max_epu8(s, sp), sp);
1520 const __m128i x = _mm_or_si128(_mm_or_si128(t1, t2), t3);
1521 unsigned short r =
static_cast<unsigned short>(_mm_movemask_epi8(x));
1527 _BitScanForward(&offset, r);
1530 length =
static_cast<size_t>(__builtin_ffs(r) - 1);
1539#elif defined(RAPIDJSON_NEON)
1541 static RAPIDJSON_FORCEINLINE
void ScanCopyUnescapedString(
StringStream& is,
1542 StackStream<char>& os)
1544 const char* p = is.
src_;
1547 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1548 static_cast<size_t>(~15));
1549 while(p != nextAligned)
1569 x = vorrq_u8(x, vceqq_u8(s, s1));
1570 x = vorrq_u8(x, vceqq_u8(s, s2));
1571 x = vorrq_u8(x, vcltq_u8(s, s3));
1574 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0);
1575 uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1);
1578 bool escaped =
false;
1584 length = 8 + (lz >> 3);
1598 char* q =
reinterpret_cast<char*
>(os.Push(length));
1599 for(
size_t i = 0; i < length; i++)
1606 vst1q_u8(
reinterpret_cast<uint8_t*
>(os.Push(16)), s);
1621 SkipUnescapedString(is);
1629 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1630 static_cast<size_t>(~15));
1631 while(p != nextAligned)
1648 for(;; p += 16, q += 16)
1652 x = vorrq_u8(x, vceqq_u8(s, s1));
1653 x = vorrq_u8(x, vceqq_u8(s, s2));
1654 x = vorrq_u8(x, vcltq_u8(s, s3));
1657 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0);
1658 uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1);
1661 bool escaped =
false;
1667 length = 8 + (lz >> 3);
1679 for(
const char* pend = p + length; p != pend;)
1685 vst1q_u8(
reinterpret_cast<uint8_t*
>(q), s);
1699 const char* nextAligned =
reinterpret_cast<const char*
>((
reinterpret_cast<size_t>(p) + 15) &
1700 static_cast<size_t>(~15));
1701 for(; p != nextAligned; p++)
1719 x = vorrq_u8(x, vceqq_u8(s, s1));
1720 x = vorrq_u8(x, vceqq_u8(s, s2));
1721 x = vorrq_u8(x, vcltq_u8(s, s3));
1724 uint64_t low = vgetq_lane_u64(vreinterpretq_u64_u8(x), 0);
1725 uint64_t high = vgetq_lane_u64(vreinterpretq_u64_u8(x), 1);
1748 template <
typename InputStream,
typename StackCharacter,
bool backup,
bool pushOnTake>
1751 template <
typename InputStream,
typename StackCharacter>
1752 class NumberStream<InputStream, StackCharacter, false, false>
1755 typedef typename InputStream::Ch
Ch;
1757 NumberStream(
GenericReader& reader, InputStream& s) : is(s) { (void)reader; }
1759 RAPIDJSON_FORCEINLINE
Ch Peek()
const {
return is.
Peek(); }
1760 RAPIDJSON_FORCEINLINE
Ch TakePush() {
return is.
Take(); }
1761 RAPIDJSON_FORCEINLINE
Ch Take() {
return is.
Take(); }
1762 RAPIDJSON_FORCEINLINE
void Push(
char) {}
1764 size_t Tell() {
return is.
Tell(); }
1765 size_t Length() {
return 0; }
1766 const StackCharacter* Pop() {
return 0; }
1769 NumberStream& operator=(
const NumberStream&);
1774 template <
typename InputStream,
typename StackCharacter>
1775 class NumberStream<InputStream, StackCharacter, true, false>
1776 :
public NumberStream<InputStream, StackCharacter, false, false>
1778 typedef NumberStream<InputStream, StackCharacter, false, false> Base;
1782 : Base(reader, s), stackStream(reader.stack_)
1786 RAPIDJSON_FORCEINLINE
Ch TakePush()
1788 stackStream.Put(
static_cast<StackCharacter
>(Base::is.Peek()));
1789 return Base::is.Take();
1792 RAPIDJSON_FORCEINLINE
void Push(StackCharacter c) { stackStream.Put(c); }
1794 size_t Length() {
return stackStream.Length(); }
1796 const StackCharacter* Pop()
1798 stackStream.Put(
'\0');
1799 return stackStream.Pop();
1803 StackStream<StackCharacter> stackStream;
1806 template <
typename InputStream,
typename StackCharacter>
1807 class NumberStream<InputStream, StackCharacter, true, true>
1808 :
public NumberStream<InputStream, StackCharacter, true, false>
1810 typedef NumberStream<InputStream, StackCharacter, true, false> Base;
1813 NumberStream(
GenericReader& reader, InputStream& s) : Base(reader, s) {}
1815 RAPIDJSON_FORCEINLINE
Ch Take() {
return Base::TakePush(); }
1818 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
1819 void ParseNumber(InputStream& is, Handler& handler)
1821 typedef typename internal::SelectIf<
1823 typename TargetEncoding::Ch,
1824 char>
::Type NumberCharacter;
1826 internal::StreamLocalCopy<InputStream>
copy(is);
1827 NumberStream<InputStream,
1836 size_t startOffset = s.Tell();
1838 bool useNanOrInf =
false;
1841 bool minus = Consume(s,
'-');
1846 bool use64bit =
false;
1847 int significandDigit = 0;
1855 i =
static_cast<unsigned>(s.TakePush() -
'0');
1869 i = i * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1884 i = i * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1894 if(Consume(s,
'a') && Consume(s,
'N'))
1896 d = std::numeric_limits<double>::quiet_NaN();
1902 if(Consume(s,
'n') && Consume(s,
'f'))
1904 d = (
minus ? -std::numeric_limits<double>::infinity()
1905 : std::numeric_limits<double>::infinity());
1909 !(Consume(s,
'i') && Consume(s,
'n') && Consume(s,
'i') &&
1910 Consume(s,
't') && Consume(s,
'y'))))
1926 bool useDouble =
false;
1938 d =
static_cast<double>(i64);
1942 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1950 0x19999999, 0x99999999)))
1954 d =
static_cast<double>(i64);
1958 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
1968 d = d * 10 + (s.TakePush() -
'0');
1974 size_t decimalPosition;
1975 if(!useNanOrInf && Consume(s,
'.'))
1977 decimalPosition = s.Length();
1995 i64 = i64 * 10 +
static_cast<unsigned>(s.TakePush() -
'0');
2002 d =
static_cast<double>(i64);
2005 d =
static_cast<double>(use64bit ? i64 : i);
2012 if(significandDigit < 17)
2014 d = d * 10.0 + (s.TakePush() -
'0');
2024 decimalPosition = s.Length();
2028 if(!useNanOrInf && (Consume(s,
'e') || Consume(s,
'E')))
2032 d =
static_cast<double>(use64bit ? i64 : i);
2036 bool expMinus =
false;
2039 else if(Consume(s,
'-'))
2044 exp =
static_cast<int>(s.Take() -
'0');
2054 int maxExp = (expFrac + 2147483639) / 10;
2058 exp =
exp * 10 +
static_cast<int>(s.Take() -
'0');
2062 s.Peek() >=
'0' && s.Peek() <=
'9'))
2069 int maxExp = 308 - expFrac;
2072 exp =
exp * 10 +
static_cast<int>(s.Take() -
'0');
2093 typename InputStream::Ch* head = is.PutBegin();
2094 const size_t length = s.Tell() - startOffset;
2097 const typename TargetEncoding::Ch*
const str =
2098 reinterpret_cast<typename TargetEncoding::Ch*
>(head);
2099 cont = handler.RawNumber(str,
SizeType(length),
false);
2104 GenericStringStream<UTF8<NumberCharacter>> srcStream(s.Pop());
2105 StackStream<typename TargetEncoding::Ch> dstStream(stack_);
2106 while(numCharsToCopy--)
2108 Transcoder<UTF8<typename TargetEncoding::Ch>, TargetEncoding>::Transcode(
2109 srcStream, dstStream);
2111 dstStream.Put(
'\0');
2112 const typename TargetEncoding::Ch* str = dstStream.Pop();
2114 cont = handler.RawNumber(str,
SizeType(length),
true);
2119 size_t length = s.Length();
2120 const NumberCharacter* decimal =
2125 int p =
exp + expFrac;
2132 if(d > (std::numeric_limits<double>::max)())
2139 cont = handler.Double(minus ? -d : d);
2141 else if(useNanOrInf)
2143 cont = handler.Double(d);
2150 cont = handler.Int64(
static_cast<int64_t>(~i64 + 1));
2152 cont = handler.Uint64(i64);
2157 cont = handler.Int(
static_cast<int32_t>(~i + 1));
2159 cont = handler.Uint(i);
2168 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
2169 void ParseValue(InputStream& is, Handler& handler)
2173 case 'n': ParseNull<parseFlags>(is, handler);
break;
2174 case 't': ParseTrue<parseFlags>(is, handler);
break;
2175 case 'f': ParseFalse<parseFlags>(is, handler);
break;
2176 case '"': ParseString<parseFlags>(is, handler);
break;
2177 case '{': ParseObject<parseFlags>(is, handler);
break;
2178 case '[': ParseArray<parseFlags>(is, handler);
break;
2179 default: ParseNumber<parseFlags>(is, handler);
break;
2186 enum IterativeParsingState
2188 IterativeParsingFinishState = 0,
2189 IterativeParsingErrorState,
2190 IterativeParsingStartState,
2193 IterativeParsingObjectInitialState,
2194 IterativeParsingMemberKeyState,
2195 IterativeParsingMemberValueState,
2196 IterativeParsingObjectFinishState,
2199 IterativeParsingArrayInitialState,
2200 IterativeParsingElementState,
2201 IterativeParsingArrayFinishState,
2204 IterativeParsingValueState,
2207 IterativeParsingElementDelimiterState,
2208 IterativeParsingMemberDelimiterState,
2209 IterativeParsingKeyValueDelimiterState,
2211 cIterativeParsingStateCount
2217 LeftBracketToken = 0,
2220 LeftCurlyBracketToken,
2221 RightCurlyBracketToken,
2235 RAPIDJSON_FORCEINLINE Token Tokenize(
Ch c)
const
2239#define N NumberToken
2240#define N16 N, N, N, N, N, N, N, N, N, N, N, N, N, N, N, N
2242 static const unsigned char tokenMap[256] = {
2267 N, LeftBracketToken,
2268 N, RightBracketToken,
2283 N, LeftCurlyBracketToken,
2284 N, RightCurlyBracketToken,
2295 if(
sizeof(
Ch) == 1 ||
static_cast<unsigned>(c) < 256)
2296 return static_cast<Token
>(tokenMap[
static_cast<unsigned char>(c)]);
2301 RAPIDJSON_FORCEINLINE IterativeParsingState Predict(IterativeParsingState state,
2305 static const char G[cIterativeParsingStateCount][kTokenCount] = {
2307 {IterativeParsingErrorState,
2308 IterativeParsingErrorState,
2309 IterativeParsingErrorState,
2310 IterativeParsingErrorState,
2311 IterativeParsingErrorState,
2312 IterativeParsingErrorState,
2313 IterativeParsingErrorState,
2314 IterativeParsingErrorState,
2315 IterativeParsingErrorState,
2316 IterativeParsingErrorState,
2317 IterativeParsingErrorState},
2319 {IterativeParsingErrorState,
2320 IterativeParsingErrorState,
2321 IterativeParsingErrorState,
2322 IterativeParsingErrorState,
2323 IterativeParsingErrorState,
2324 IterativeParsingErrorState,
2325 IterativeParsingErrorState,
2326 IterativeParsingErrorState,
2327 IterativeParsingErrorState,
2328 IterativeParsingErrorState,
2329 IterativeParsingErrorState},
2332 IterativeParsingArrayInitialState,
2333 IterativeParsingErrorState,
2334 IterativeParsingObjectInitialState,
2335 IterativeParsingErrorState,
2336 IterativeParsingErrorState,
2337 IterativeParsingErrorState,
2338 IterativeParsingValueState,
2339 IterativeParsingValueState,
2340 IterativeParsingValueState,
2341 IterativeParsingValueState,
2342 IterativeParsingValueState
2346 IterativeParsingErrorState,
2347 IterativeParsingErrorState,
2348 IterativeParsingErrorState,
2349 IterativeParsingObjectFinishState,
2350 IterativeParsingErrorState,
2351 IterativeParsingErrorState,
2352 IterativeParsingMemberKeyState,
2353 IterativeParsingErrorState,
2354 IterativeParsingErrorState,
2355 IterativeParsingErrorState,
2356 IterativeParsingErrorState
2360 IterativeParsingErrorState,
2361 IterativeParsingErrorState,
2362 IterativeParsingErrorState,
2363 IterativeParsingErrorState,
2364 IterativeParsingErrorState,
2365 IterativeParsingKeyValueDelimiterState,
2366 IterativeParsingErrorState,
2367 IterativeParsingErrorState,
2368 IterativeParsingErrorState,
2369 IterativeParsingErrorState,
2370 IterativeParsingErrorState
2374 IterativeParsingErrorState,
2375 IterativeParsingErrorState,
2376 IterativeParsingErrorState,
2377 IterativeParsingObjectFinishState,
2378 IterativeParsingMemberDelimiterState,
2379 IterativeParsingErrorState,
2380 IterativeParsingErrorState,
2381 IterativeParsingErrorState,
2382 IterativeParsingErrorState,
2383 IterativeParsingErrorState,
2384 IterativeParsingErrorState
2387 {IterativeParsingErrorState,
2388 IterativeParsingErrorState,
2389 IterativeParsingErrorState,
2390 IterativeParsingErrorState,
2391 IterativeParsingErrorState,
2392 IterativeParsingErrorState,
2393 IterativeParsingErrorState,
2394 IterativeParsingErrorState,
2395 IterativeParsingErrorState,
2396 IterativeParsingErrorState,
2397 IterativeParsingErrorState},
2400 IterativeParsingArrayInitialState,
2401 IterativeParsingArrayFinishState,
2402 IterativeParsingObjectInitialState,
2403 IterativeParsingErrorState,
2404 IterativeParsingErrorState,
2405 IterativeParsingErrorState,
2406 IterativeParsingElementState,
2407 IterativeParsingElementState,
2408 IterativeParsingElementState,
2409 IterativeParsingElementState,
2410 IterativeParsingElementState
2414 IterativeParsingErrorState,
2415 IterativeParsingArrayFinishState,
2416 IterativeParsingErrorState,
2417 IterativeParsingErrorState,
2418 IterativeParsingElementDelimiterState,
2419 IterativeParsingErrorState,
2420 IterativeParsingErrorState,
2421 IterativeParsingErrorState,
2422 IterativeParsingErrorState,
2423 IterativeParsingErrorState,
2424 IterativeParsingErrorState
2427 {IterativeParsingErrorState,
2428 IterativeParsingErrorState,
2429 IterativeParsingErrorState,
2430 IterativeParsingErrorState,
2431 IterativeParsingErrorState,
2432 IterativeParsingErrorState,
2433 IterativeParsingErrorState,
2434 IterativeParsingErrorState,
2435 IterativeParsingErrorState,
2436 IterativeParsingErrorState,
2437 IterativeParsingErrorState},
2439 {IterativeParsingErrorState,
2440 IterativeParsingErrorState,
2441 IterativeParsingErrorState,
2442 IterativeParsingErrorState,
2443 IterativeParsingErrorState,
2444 IterativeParsingErrorState,
2445 IterativeParsingErrorState,
2446 IterativeParsingErrorState,
2447 IterativeParsingErrorState,
2448 IterativeParsingErrorState,
2449 IterativeParsingErrorState},
2452 IterativeParsingArrayInitialState,
2453 IterativeParsingArrayFinishState,
2454 IterativeParsingObjectInitialState,
2455 IterativeParsingErrorState,
2456 IterativeParsingErrorState,
2457 IterativeParsingErrorState,
2458 IterativeParsingElementState,
2459 IterativeParsingElementState,
2460 IterativeParsingElementState,
2461 IterativeParsingElementState,
2462 IterativeParsingElementState
2466 IterativeParsingErrorState,
2467 IterativeParsingErrorState,
2468 IterativeParsingErrorState,
2469 IterativeParsingObjectFinishState,
2470 IterativeParsingErrorState,
2471 IterativeParsingErrorState,
2472 IterativeParsingMemberKeyState,
2473 IterativeParsingErrorState,
2474 IterativeParsingErrorState,
2475 IterativeParsingErrorState,
2476 IterativeParsingErrorState
2480 IterativeParsingArrayInitialState,
2481 IterativeParsingErrorState,
2482 IterativeParsingObjectInitialState,
2483 IterativeParsingErrorState,
2484 IterativeParsingErrorState,
2485 IterativeParsingErrorState,
2486 IterativeParsingMemberValueState,
2487 IterativeParsingMemberValueState,
2488 IterativeParsingMemberValueState,
2489 IterativeParsingMemberValueState,
2490 IterativeParsingMemberValueState
2494 return static_cast<IterativeParsingState
>(G[state][token]);
2499 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
2500 RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src,
2502 IterativeParsingState dst,
2510 case IterativeParsingErrorState:
return dst;
2512 case IterativeParsingObjectInitialState:
2513 case IterativeParsingArrayInitialState: {
2517 IterativeParsingState n = src;
2518 if(src == IterativeParsingArrayInitialState ||
2519 src == IterativeParsingElementDelimiterState)
2520 n = IterativeParsingElementState;
2521 else if(src == IterativeParsingKeyValueDelimiterState)
2522 n = IterativeParsingMemberValueState;
2524 *stack_.template Push<SizeType>(1) = n;
2526 *stack_.template Push<SizeType>(1) = 0;
2528 bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject()
2529 : handler.StartArray();
2534 return IterativeParsingErrorState;
2543 case IterativeParsingMemberKeyState:
2544 ParseString<parseFlags>(is, handler,
true);
2546 return IterativeParsingErrorState;
2550 case IterativeParsingKeyValueDelimiterState:
2555 case IterativeParsingMemberValueState:
2557 ParseValue<parseFlags>(is, handler);
2560 return IterativeParsingErrorState;
2564 case IterativeParsingElementState:
2566 ParseValue<parseFlags>(is, handler);
2569 return IterativeParsingErrorState;
2573 case IterativeParsingMemberDelimiterState:
2574 case IterativeParsingElementDelimiterState:
2577 *stack_.template Top<SizeType>() = *stack_.template Top<SizeType>() + 1;
2580 case IterativeParsingObjectFinishState: {
2583 src == IterativeParsingMemberDelimiterState)
2586 return IterativeParsingErrorState;
2589 SizeType c = *stack_.template Pop<SizeType>(1);
2591 if(src == IterativeParsingMemberValueState)
2594 IterativeParsingState n =
2595 static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
2597 if(n == IterativeParsingStartState)
2598 n = IterativeParsingFinishState;
2600 bool hr = handler.EndObject(c);
2605 return IterativeParsingErrorState;
2614 case IterativeParsingArrayFinishState: {
2617 src == IterativeParsingElementDelimiterState)
2620 return IterativeParsingErrorState;
2623 SizeType c = *stack_.template Pop<SizeType>(1);
2625 if(src == IterativeParsingElementState)
2628 IterativeParsingState n =
2629 static_cast<IterativeParsingState
>(*stack_.template Pop<SizeType>(1));
2631 if(n == IterativeParsingStartState)
2632 n = IterativeParsingFinishState;
2634 bool hr = handler.EndArray(c);
2639 return IterativeParsingErrorState;
2662 ParseValue<parseFlags>(is, handler);
2665 return IterativeParsingErrorState;
2667 return IterativeParsingFinishState;
2671 template <
typename InputStream>
2672 void HandleError(IterativeParsingState src, InputStream& is)
2682 case IterativeParsingStartState:
2685 case IterativeParsingFinishState:
2688 case IterativeParsingObjectInitialState:
2689 case IterativeParsingMemberDelimiterState:
2692 case IterativeParsingMemberKeyState:
2695 case IterativeParsingMemberValueState:
2698 case IterativeParsingKeyValueDelimiterState:
2699 case IterativeParsingArrayInitialState:
2700 case IterativeParsingElementDelimiterState:
2710 RAPIDJSON_FORCEINLINE
bool IsIterativeParsingDelimiterState(IterativeParsingState s)
const
2712 return s >= IterativeParsingElementDelimiterState;
2715 RAPIDJSON_FORCEINLINE
bool IsIterativeParsingCompleteState(IterativeParsingState s)
const
2717 return s <= IterativeParsingErrorState;
2720 template <
unsigned parseFlags,
typename InputStream,
typename Handler>
2721 ParseResult IterativeParse(InputStream& is, Handler& handler)
2723 parseResult_.Clear();
2724 ClearStackOnExit scope(*
this);
2725 IterativeParsingState state = IterativeParsingStartState;
2727 SkipWhitespaceAndComments<parseFlags>(is);
2728 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
2729 while(is.Peek() !=
'\0')
2731 Token t = Tokenize(is.Peek());
2732 IterativeParsingState n = Predict(state, t);
2733 IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler);
2735 if(d == IterativeParsingErrorState)
2737 HandleError(state, is);
2747 SkipWhitespaceAndComments<parseFlags>(is);
2748 RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_);
2752 if(state != IterativeParsingFinishState)
2753 HandleError(state, is);
2755 return parseResult_;
2758 static const size_t kDefaultStackCapacity =
2760 internal::Stack<StackAllocator>
2762 ParseResult parseResult_;
2763 IterativeParsingState state_;