| part of petitparser.debug; |
| |
| /// Handler function for the [ContinuationParser]. |
| typedef Result ContinuationHandler( |
| Result continuation(Context context), Context context); |
| |
| /// Continuation parser that when activated captures a continuation function |
| /// and passes it together with the current context into the handler. |
| /// |
| /// Handlers are not required to call the continuation, but can completely ignore |
| /// it, call it multiple times, and/or store it away for later use. Similarly |
| /// handlers can modify the current context and/or modify the returned result. |
| /// |
| /// The following example shows a simple wrapper. Messages are printed before and |
| /// after the `digit()` parser is activated: |
| /// |
| /// var wrapped = digit(); |
| /// var parser = new ContinuationParser(wrapped, (continuation, context) { |
| /// print('Parser will be activated, the context is $context.'); |
| /// var result = continuation(context); |
| /// print('Parser was activated, the result is $result.'); |
| /// return result; |
| /// }); |
| /// |
| /// See [profile], [progress], and [trace] for more elaborate examples. |
| class ContinuationParser extends DelegateParser { |
| final ContinuationHandler handler; |
| |
| ContinuationParser(parser, this.handler) : super(parser); |
| |
| @override |
| Result parseOn(Context context) { |
| return handler((result) => super.parseOn(result), context); |
| } |
| |
| @override |
| Parser copy() => new ContinuationParser(children[0], handler); |
| } |