Index: packages/petitparser/lib/src/debug/progress.dart |
diff --git a/packages/petitparser/lib/src/debug/progress.dart b/packages/petitparser/lib/src/debug/progress.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..022e085fa5c611baba3610374e106dbf7400b63e |
--- /dev/null |
+++ b/packages/petitparser/lib/src/debug/progress.dart |
@@ -0,0 +1,30 @@ |
+part of petitparser.debug; |
+ |
+/// Returns a transformed [parser] that when being used to read input |
+/// visually prints its progress while progressing. |
+/// |
+/// For example, the snippet |
+/// |
+/// var parser = letter() & word().star(); |
+/// progress(parser).parse('f123'); |
+/// |
+/// produces the following output: |
+/// |
+/// * Instance of 'SequenceParser' |
+/// * Instance of 'CharacterParser'[letter expected] |
+/// ** Instance of 'PossessiveRepeatingParser'[0..*] |
+/// ** Instance of 'CharacterParser'[letter or digit expected] |
+/// *** Instance of 'CharacterParser'[letter or digit expected] |
+/// **** Instance of 'CharacterParser'[letter or digit expected] |
+/// ***** Instance of 'CharacterParser'[letter or digit expected] |
+/// |
+/// Jumps backwards mean that the parser is back-tracking. Often choices can |
+/// be reordered to such expensive parses. |
+Parser progress(Parser parser, [OutputHandler output = print]) { |
+ return transformParser(parser, (each) { |
+ return new ContinuationParser(each, (continuation, context) { |
+ output('${_repeat(1 + context.position, '*')} $each'); |
+ return continuation(context); |
+ }); |
+ }); |
+} |