• M
    json: Nicer recovery from lexical errors · 0f07a5d5
    Markus Armbruster 提交于
    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: NMarkus Armbruster <armbru@redhat.com>
    Reviewed-by: NEric Blake <eblake@redhat.com>
    Message-Id: <20180831075841.13363-5-armbru@redhat.com>
    [Conflict with commit ebb4d82d resolved]
    0f07a5d5
json-lexer.c 10.6 KB