Paolo Bonzini <[email protected]> writes: > This rewrites the json-parser to use a push parser aka state machine. > While push parsers are inherently more complex than recursive descent, > the grammar for JSON is simple enough that the parser remains readable. > There is therefore no need to use e.g. QEMU coroutines. > > Unlike the suggestion in commit 62815d85aed ("json: Redesign the callback > to consume JSON values", 2018-08-24), I kept the json-streamer concept. > It helps in handling input limits, it performs error recovery, and it > converts the token-at-a-time push interface to callbacks---all things > that are more easily done in a separate layer to keep the parser clean. > However, there is no need anymore for it to store partial JSON objects > in tokenized form, because the current state is stored in the push > parser's stack. > > Another benefit is that QEMU can report the first parsing error > immediately, without waiting for parentheses to be balanced or for a > lexing error. Error recovery then proceeds as before (i.e., the next > parse still starts after balanced parentheses or a lexing error). > > On top of the benefits intrinsic in the push architecture, it so happens > that it's really easy to add a location to JSON parsing errors now, so > do that as well. > > The diffstat is unfavorable, but most of the new lines delta is really > new comments explaining the grammar and state machines.
I found an unintentional, harmless limit change by one, and suggested a few further comment tweaks. With the limit change reverted or mentioned in the commit message, series Reviewed-by: Markus Armbruster <[email protected]> I volunteer to do the pull request, since I have another patch for qobject/ queued up already. I'd apply the changes I suggested, less ones you disagree with. Let me know! [...]
