| 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; |
| }); |
| }); |
| } |