Index: packages/petitparser/lib/src/debug/trace.dart |
diff --git a/packages/petitparser/lib/src/debug/trace.dart b/packages/petitparser/lib/src/debug/trace.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d47deb8736dddf193686df24236f6dc0dbb1fae7 |
--- /dev/null |
+++ b/packages/petitparser/lib/src/debug/trace.dart |
@@ -0,0 +1,39 @@ |
+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; |
+ }); |
+ }); |
+} |