blob: 8e8d7c14c863efba3a18bc8bb5600a0afe14dabc [file] [log] [blame]
part of 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;
});
});
}