Handling syntax errors in the input
This section explains how to handle parsing errors.
If your grammar is correct but you get input string with syntax error parser
NoMatch exception with the information where in the input stream
error has occurred and what the parser expect to see at that location.
By default, if
NoMatch is not caught you will get detailed explanation of
the error at the console. The exact location will be reported, the context
(part of the input where the error occurred) and all the rules that were tried
at that location.
parser = ParserPython(calc) # 'r' in the following expression can't be recognized by # calc grammar input_expr = "23+4/r-89" parse_tree = parser.parse(input_expr)
As there is an error in the
input_expr string (
r is not expected) the
following traceback will be printed:
Traceback (most recent call last): ... arpeggio.NoMatch: Expected '+' or '-' or 'number' or '(' at position (1, 6) => '23+4/*r-89'.
The place in the input stream is marked by
* and the position in (line,
column) is given (
If you wish to handle syntax errors gracefully you can catch
NoMatch in your
code and inspect its attributes.
try: parser = ParserPython(calc) input_expr = "23+4/r-89" parse_tree = parser.parse(input_expr) except NoMatch as e: # Do something with e
NoMatch class has the following attributes:
rules- A list of
ParsingExpressionrules that are the sources of the exception.
position- A position in the input stream where exception occurred.
col- A line and column in the input stream where exception occurred.
Parserinstance used for parsing.
Arpeggio is a backtracking parser, which means that it will go back and try
another alternatives when the match does not succeeds. Nevertheless, it will
report the furthest place in the input where it failed. Arpeggio will
Match rules that failed at that position.