blob: d47deb8736dddf193686df24236f6dc0dbb1fae7 [file] [log] [blame]
part of petitparser.debug;
/// Returns a transformed [parser] that when being used to read input prints a
/// trace of all activated parsers and their respective parse results.
///
/// For example, the snippet
///
/// var parser = letter() & word().star();
/// trace(parser).parse('f1');
///
/// produces the following output:
///
/// Instance of 'SequenceParser'
/// Instance of 'CharacterParser'[letter expected]
/// Success[1:2]: f
/// Instance of 'PossessiveRepeatingParser'[0..*]
/// Instance of 'CharacterParser'[letter or digit expected]
/// Success[1:3]: 1
/// Instance of 'CharacterParser'[letter or digit expected]
/// Failure[1:3]: letter or digit expected
/// Success[1:3]: [1]
/// Success[1:3]: [f, [1]]
///
/// Indentation signifies the activation of a parser object. Reverse indentation
/// signifies the returning of a parse result either with a success or failure
/// context.
Parser trace(Parser parser, [OutputHandler output = print]) {
var level = 0;
return transformParser(parser, (each) {
return new ContinuationParser(each, (continuation, context) {
output('${_repeat(level, ' ')}$each');
level++;
var result = continuation(context);
level--;
output('${_repeat(level, ' ')}$result');
return result;
});
});
}