Improve error reporting
Keep track of the exact location the error occured in and switch
the internal error description from a dynamic string buffer to an
integer which either holds negative values for lexer errors or
positives values for grammer violations.
In case of grammer violations the "error_code" member will hold
a bitfield describing the expected tokens.
Also rework the error messages emitted by the cli to be more
precise.
Examples:
$ jsonfilter -s '{}' -e '@.foo bar'
Syntax error: Expecting End of file
In expression @.foo bar
Near here ----------^
$ jsonfilter -s '{}' -e '@.foo\bar'
Syntax error: Unexpected character
In expression @.foo\bar
Near here ---------^
$ jsonfilter -s '{}' -e '@.foo..bar'
Syntax error: Expecting Label or '*'
In expression @.foo..bar
Near here ----------^
Signed-off-by: Jo-Philipp Wich <[email protected]>
cli: minor whitespace fix
Signed-off-by: Jo-Philipp Wich <[email protected]>
Switch to sqlite3's lemon parser generator.
This commit drops the flex + bison code in favor to a hand-written
lexer and a new grammar file in lemon syntax.
The change results in a much smaller binary and easier to maintain
code. Code required to build and maintain the AST has been split
off into the ast.c and ast.h files.
Signed-off-by: Jo-Philipp Wich <[email protected]>
build: use -ffunction-sections and --gc-sections
Signed-off-by: Jo-Philipp Wich <[email protected]>
lexer, parser, matcher: extend grammar to allow comma separated keys/indexes as more readable alternative to or expressions
cmake: let generated lexer.c, parser.c depend on their respective source files, clean generated headers