| 2190 | |
| 2191 | template <unsigned parseFlags, typename InputStream, typename Handler> |
| 2192 | ParseResult IterativeParse(InputStream& is, Handler& handler) { |
| 2193 | parseResult_.Clear(); |
| 2194 | ClearStackOnExit scope(*this); |
| 2195 | IterativeParsingState state = IterativeParsingStartState; |
| 2196 | |
| 2197 | SkipWhitespaceAndComments<parseFlags>(is); |
| 2198 | RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); |
| 2199 | while (is.Peek() != '\0') { |
| 2200 | Token t = Tokenize(is.Peek()); |
| 2201 | IterativeParsingState n = Predict(state, t); |
| 2202 | IterativeParsingState d = Transit<parseFlags>(state, t, n, is, handler); |
| 2203 | |
| 2204 | if (d == IterativeParsingErrorState) { |
| 2205 | HandleError(state, is); |
| 2206 | break; |
| 2207 | } |
| 2208 | |
| 2209 | state = d; |
| 2210 | |
| 2211 | // Do not further consume streams if a root JSON has been parsed. |
| 2212 | if ((parseFlags & kParseStopWhenDoneFlag) && state == IterativeParsingFinishState) |
| 2213 | break; |
| 2214 | |
| 2215 | SkipWhitespaceAndComments<parseFlags>(is); |
| 2216 | RAPIDJSON_PARSE_ERROR_EARLY_RETURN(parseResult_); |
| 2217 | } |
| 2218 | |
| 2219 | // Handle the end of file. |
| 2220 | if (state != IterativeParsingFinishState) |
| 2221 | HandleError(state, is); |
| 2222 | |
| 2223 | return parseResult_; |
| 2224 | } |
| 2225 | |
| 2226 | static const size_t kDefaultStackCapacity = 256; //!< Default stack capacity in bytes for storing a single decoded string. |
| 2227 | internal::Stack<StackAllocator> stack_; //!< A stack for storing decoded string temporarily during non-destructive parsing. |