Debugging¶
When the stuff goes wrong you will want to debug your parser.
Parser debug mode¶
During grammar design you can make syntax and semantic errors. Arpeggio will report any syntax error with all the necessary information whether you are building parser from python expressions or from a textual PEG notation.
For semantic error you have a debugging mode of operation which is entered by
setting debug
parameter to True
in the parser construction call.
parser = ParserPython(calc, debug=True)
When Arpeggio runs in debug mode it will print a detailed information of what it is doing.
>> Entering rule calc=Sequence at position 0 => *-(4-1)*5+(
>> Entering rule OneOrMore in calc at position 0 => *-(4-1)*5+(
>> Entering rule expression=Sequence in calc at position 0 => *-(4-1)*5+(
>> Entering rule term=Sequence in expression at position 0 => *-(4-1)*5+(
>> Entering rule factor=Sequence in term at position 0 => *-(4-1)*5+(
>> Entering rule Optional in factor at position 0 => *-(4-1)*5+(
>> Entering rule OrderedChoice in factor at position 0 => *-(4-1)*5+(
>> Match rule StrMatch(+) in factor at position 0 => *-(4-1)*5+(
-- No match '+' at 0 => '*-*(4-1)*5+('
>> Match rule StrMatch(-) in factor at position 0 => *-(4-1)*5+(
++ Match '-' at 0 => '*-*(4-1)*5+('
<< Leaving rule OrderedChoice
<< Leaving rule Optional
>> Entering rule OrderedChoice in factor at position 1 => -*(4-1)*5+(2
Visualization¶
Furthermore, while running in debug mode, a dot
file (a graph description file
format from GraphViz software
package) representing the parser
model will be created if the parser model is constructed without errors.
This dot
file can be rendered as image using one of available dot viewer
software or transformed to an image using dot
tool
GraphViz software.
$ dot -Tpng -O calc_parser_model.dot
After this command you will get calc_parser_model.dot.png
file which can be
opened in any png
image viewer. This is how it looks like:
Each node in this graph is a parsing expression. Nodes are labeled by the type
name of the parsing expression. If node represents the rule from the grammar,
the label is of the form <rule_name>=<PEG type>
where rule_name
is the
name of the grammar rule. The edges connect children expressions. The labels on
the edges represent the order in which the graph will be traversed during
parsing.
Furthermore, if you parse some input while the parser is in debug mode, the
parse tree dot
file will be generated also.
parse_tree = parser.parse("-(4-1)*5+(2+4.67)+5.89/(.2+7)")
This dot
file can also be converted to png
with the command:
$ dot -Tpng -O calc_parse_tree.dot
Which produces png
image given bellow.
You can also explicitly render your parser model or parse tree to dot
file
even if the parser is not in the debug mode.
For parser model this is achieved with the following Python code:
from arpeggio.export import PMDOTExporter
PMDOTExporter().exportFile(parser.parser_model,
"my_parser_model.dot")
For parse tree it is achieved with:
from arpeggio.export import PTDOTExporter
PTDOTExporter().exportFile(parse_tree,
"my_parse_tree.dot")
To get e.g. png
images from dot
files do as usual:
$ dot -Tpng -O *.dot
Note
All tree images in this docs are rendered using Arpeggio's visualization and
dot
tool from the GraphViz software.