json: Nicer recovery from lexical errors
commit0f07a5d5f1f484c9c334d52193617e89442da7c9
authorMarkus Armbruster <armbru@redhat.com>
Fri, 31 Aug 2018 07:58:39 +0000 (31 09:58 +0200)
committerMarkus Armbruster <armbru@redhat.com>
Mon, 24 Sep 2018 16:08:07 +0000 (24 18:08 +0200)
tree82f88bdd8f8454492d5b289fce7fd113caa3e5e5
parentc0ee3afa7fa2547b5766dd25e52ced292c204d4e
json: Nicer recovery from lexical errors

When the lexer chokes on an input character, it consumes the
character, emits a JSON error token, and enters its start state.  This
can lead to suboptimal error recovery.  For instance, input

    0123 ,

produces the tokens

    JSON_ERROR    01
    JSON_INTEGER  23
    JSON_COMMA    ,

Make the lexer skip characters after a lexical error until a
structural character ('[', ']', '{', '}', ':', ','), an ASCII control
character, or '\xFE', or '\xFF'.

Note that we must not skip ASCII control characters, '\xFE', '\xFF',
because those are documented to force the JSON parser into known-good
state, by docs/interop/qmp-spec.txt.

The lexer now produces

    JSON_ERROR    01
    JSON_COMMA    ,

Update qmp-test for the nicer error recovery: QMP now reports just one
error for input %p instead of two.  Also drop the newline after %p; it
was needed to tease out the second error.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20180831075841.13363-5-armbru@redhat.com>
[Conflict with commit ebb4d82d888 resolved]
qobject/json-lexer.c
tests/qmp-test.c