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
will raise 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.
Example:
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 ((1, 6)
).
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 ofParsingExpression
rules that are the sources of the exception.position
- A position in the input stream where exception occurred.line
,col
- A line and column in the input stream where exception occurred.parser
- AParser
instance 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
report all Match
rules that failed at that position.